在C语言中,常常会出现命名冲突的问题,当你展开头文件时,发现别人写的函数或变量名和自己定义的一样,那么就需要通过条件编译解决,但是很麻烦
而C++就通过 关键字namespace来解决命名冲突的问题。
可以使用namespace来定义一个命名空间域,将自己的代码放入命名空间域中,而编译器编译时是默认只会查找全局和局部域的,所以就避免了命名冲突的问题
1.namespace
cpp
//C++命名空间namespace,解决C会出现的命名冲突
namespace hj
{
//在命名空间中有自己单独的命名空间域,程序在运行时默认只会在全局域和局部域去找,而想要访问命名空间域的成员,那么就需要指定命名空间
int num = 0;
int Add(int a, int b)
{
return a + b;
}
}
在命名空间可以创建变量和函数,命名空间域不影响变量的生命周期
命名空间是可以嵌套的
cpp
//C++命名空间namespace,解决C会出现的命名冲突
namespace hj
{
//在命名空间中有自己单独的命名空间域,程序在运行时默认只会在全局域和局部域去找,而想要访问命名空间域的成员,那么就需要指定命名空间
int num = 0;
int Add(int a, int b)
{
return a + b;
}
namespace hj2 //嵌套命名空间
{
int num = 0;
}
}
访问命名空间
访问命名空间的三种方式
1.使用 using namespace hj; 将命名空间内的成员全部展开
2.使用 using hj::ADD; 将命名空间内频繁调用的成员展开
3.使用 **hj::Add()**使用域访问操作符访问命名空间内的成员
2.函数重载
C语言中函数是不可以同名的,因为C代码在编译链接后,会从符号表中找函数在符号表中的函数名,而C中的同名函数在符号表中也是同名的,所以C语言是没有同名函数的。而C++中的同名函数在链接时创建的符号表中是根据参数的类型和个数进行创建符号名的,所以同名函数在符号表中的符号是不一样的
所以,函数重载需要函数名相同,参数个数/类型/类型顺序不同,与函数的返回值无关
cpp
void Swap(double& a, double& b)//参数类型不同
{
double tmp = a;
a = b;
b = tmp;
}
void Swap(int& a)//参数个数不同
{
int tmp = a;
a = tmp;
}
void Swap(double& a, int& b)//参数顺序不同
{
int tmp = a;
a = b;
b = tmp;
}
3.缺省参数
cpp
//C++缺省参数
int Add(int a = 0, int b = 0)//全缺省
{
return a + b;
}
int Add(int a, int b = 0)//半缺省
{
return a + b;
}
//在函数声明时,可以给函数一个默认值,当外部调用没有传参数就采用默认值。
int Add(int a, int b)
{
return a + b;
}
缺省参数分为全缺省和半缺省,C++规定缺省参数必须从右向左依次定义。
4.cout/cin
C++的流输入cout,流提取cin
C++中输入输出不需要去指定格式去打印,直接利用cout和cin就可以实现输入输出
注意cout和cin都是命名空间std中的,所以你要使用它们需要注意
cpp
int main()
{
int num = 0;
cin >> num;
cout << num << endl;
int a = 0;
cout << a << endl;
return 0;
}
5.引用
C++中的引用是给变量取一个别名,语法上引用本身不占用空间。
引用的类型就是所引用对象的类型
引用创建时必须初始化,且只能引用一个对象
引用在传参时可以减少临时变量的拷贝提高效率,并且在改变引用时同时改变引用的对象
cpp
int main()
{
int a = 0;
int& ra = a;
ra++;
cout << ra << endl;
return 0;
}
const引用
const引用可以引用常量、临时变量、常变量
cpp
const int x1= 0;
int x2 = 1;
const int& rx1 = x1;
const int& rx2 = x1 + x2;
const int& rx3 = 10;
当引用临时变量时,此时临时变量的生命周期就变成引用的生命周期
const引用主要的作用在传参时,因为当你传参时穿的是一个常量,你使用引用是会报错的,因为常量是不允许修改的,你使用int& 就是一种权限的放大,而权限只能缩小不允许放大。
const引用可以引用变量,不过引用变量后就是一种权限的缩小
6.inline
在C语言中使用宏函数进行预处理时替换,从而减少建立栈帧的消耗,提高效率,而C++给出了inline这样更好的解决方式。
内联函数也会在函数调用处展开,减少开辟栈帧的消耗。
但是内联函数inline仅仅只是一种建议,当编译器觉得函数不适合被展开时,就忽略掉inline。
当函数被频繁调用,且代码量较少没有递归时。才会去展开inline
当没有使用inline时,函数在调用时就会执行call指令去跳转到函数的地址中
当使用inline展开之后,编译器就会将Add函数的汇编指令直接展开在函数内,就没有call和建立栈帧的过程
7.nullptr
NULL在C语言中是条件编译,实际的值是(void*)0,在C语言中这样没什么问题,因为C语言中void*可以赋给任意的指针类型,会进行隐式类型转换
但C++不可以,C++中使用nullptr,nullptr在赋给不同类型的指针时,可以隐式类型转换为任意类型的指针