目录
一、命名空间:
在使用C语言的编译环境下时,如果引用了第三方库,那么很可能导致自己定义的变量名或者函数名与第三方库中的变量名或函数名相同,而被迫去修改自己所定义的变量或函数名,而大多数时候自身并不想去修改,所以在C++中,就引入了命名空间的概念。命名空间存在的目的是为了解决源代码中的重名问题
命名空间的使用:
在定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。
namespace yue // namesapce + 命名空间的名字
{
// 在命名空间中可以定义变量、函数、类型:
int a = 10;
double b;
void Print(int a)
{
cout << a; // 输出a
}
struct My
{
int _a;
double _b;
};
}
命名空间可以嵌套,也可以创建另一个同名的命名空间,同名的命名空间编译器最后都会合并为同一个命名空间。
需要注意的是:
一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,在使用命名空间的成员的时候就需要加作用域限定符、或者将命名空间中的某一个成员释放到全局范围中。
namespace yue
{
int a = 10;
double b = 11.1;
}
using yue::b;// 将b释放到全局范围中
int main()
{
printf("%d\n", yue::a);// 加作用域限定符访问命名空间中的成员
printf("%.3lf\n", b);
}
二、缺省参数:
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
void Test(int a = 1)// 设置缺省值1
{
cout << a << endl;// 打印a
}
int main()
{
Test();// 如果不输入传参的值,则使用函数的缺省值1
Test(10);// 输入指定的传参值,则使用函数的传参值10
return 0;
}
缺省参数又分为全缺省参数和半缺省参数:
全缺省参数:函数的每一个参数都设置缺省值。
半缺省参数:函数的参数从右到左依次给缺省值。
注意:
1. 半缺省参数必须从右往左依次来给出,不能间隔着给,否则在传参的时候会出现歧义
2. 缺省参数不能在函数声明和定义中同时出现,如果处于声明与定义分离的情况下,则缺省参数应放于声明中。
3. 缺省值必须是常量或者全局变量
// 全缺省
void Test1(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
// 半缺省
void Test2(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
}
三、函数重载:
函数重载是函数的一种特殊情况,在C语言中是不支持同名函数的存在的,但是C++允许在同一作用域中声明几个功能类似的同名函数。只要这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,就能构成函数重载。
// 参数个数不同:
void Test1(int a, int b)
void Test1(int a)
// 参数类型不同:
void Test2(char a, char b)
void Test2(int a, int b)
// 参数类型顺序不同(本质上也还是参数类型不同):
void Test3(char a, int b)
void Test3(int a, char b)
四、引用:
引用的本质是给已存在的变量取了一个别名,就相当于周树人的笔名为鲁迅,但是实际上为同一个人。所以编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
int main()
{
int a = 10;
// 类型& 引用变量名(对象名) = 引用实体;
int& aa = a;// 此时aa就为a的别名。
++aa;// 对aa进行操作就相当于对a进行操作
return 0;
}
引用的特性:
1、引用在定义时必须进行初始化。
2、一个变量可以有多个引用,但引用一旦引用一个实体,再不能引用其他实体。
引用的使用场景:
(1)、作参数
void Swap(int& a1, int& a2)
{
int tmp = a1;
a1 = a2;
a2 = tmp;
}
就拿简单的两数交换来讲,在平时我们是会选择使用指针去完成这部分的操作,C++这里可以直接使用引用去做参数,在使用&a1和&a2时,a1和a2是实参的别名而已,像一个指针指向实参。改变p1和p2就是改变实参的值。
而且在使用引用时,a1和a2是实参的引用,中间不需要经过值的传递机制,就能有实参值的信息。在这点上就免去了传值和生成副本的时间和空间消耗。
所以引用做参数的优势在于:
1、在函数内部会对此参数进行修改。
2、提高函数调用和运行效率。
(2)、做返回值
int f; // 定义全局变量f
int Test1(int r)
{
f = r * r;
return f; // 以返回值的方式返回函数值
}
int& Test2(int r)
{
f = r * r;
return f; // 以引用方式返回函数值
}
void main()
{
int a = Test1(10.0); //第1种情况,系统生成要返回值的副本(即临时变量)
int& b = Test1(10.0); //第2种情况, 有些编译器会报错
//不能从被调函数中返回一个临时变量或局部变量的引用
int c = Test2(10.0); //第3种情况,系统不生成返回值的副本
//可以从被调函数中返回一个全局变量的引用
int& d = Test2(10.0); //第4种情况,系统不生成返回值的副本
//可以从被调函数中返回一个全局变量的引用
}
注意:
1、以引用返回函数值,定义函数时需要在函数名前加&
2、用引用的优势在于,在内存中不会产生临时变量。
用引用作为返回值时,要注意以下几点:
1、不能返回局部变量的引用。因为局部变量会在函数返回后被销毁,所以被返回的引用就会成为“野引用”。
2、不能返回函数内部new分配的内存的引用,因为被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用指向的空间将无法释放,造成内存泄漏。
3、可以返回类成员的引用,但最好是const。