1、命名空间:使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。关键字:namespace Eg: namespace N {int a = 0};
// 命名空间中可以定义变量/函数/类型。
//注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
命名空间的使用有三种方式:1~加命名空间名称及作用域限定符 N::d;(写在函数内) 2~使用using将命名空间中某个成员引入 using N::a;(写在函数外) 3~使用using namespace 命名空间名称 引入 using namespace N;
2、缺省参数:缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
分类:
* 全缺省参数:
* 半缺省参数 :
注:
![6cbb0fa3aa9d4f6caa8271eb5a78c265.png](https://img-blog.csdnimg.cn/6cbb0fa3aa9d4f6caa8271eb5a78c265.png)
4、引用:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。注意:引用类型必须和引用实体是同种类型的
基本语法:类型& 引用变量名(对象名) = 引用实体;
引用特性 :
* 引用在定义时必须初始化。
* 一个变量可以有多个引用。
![c43e76d237a74847ae468a62c50abcf1.png](https://img-blog.csdnimg.cn/c43e76d237a74847ae468a62c50abcf1.png)
常引用:
引用的使用场景:
* 做参数:
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
* 做返回值:
int& Count()
{
static int n = 0;
n++;
return n;
}
* 注:如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用
int& Add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int& ret = Add(1, 2);
Add(3, 4);
cout << "Add(1, 2) is :"<< ret <<endl;
return 0;
}
解释:调用Add函数时,会在堆区建立栈帧,出了Add函数的作用域,那个栈帧就销毁了,c所在的空间就返还给操作系统了。该函数是返回引用,只是返回了一个c所在空间的别名,即ret接收到的是和C共用C所在的空间。但是如上所说那块空间已经返还给系统了,我们已经无法再访问了,所以该操作非法了。而static静态变量和全局变量则可以返回引用。
5、传值、传引用比较 :
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。
传引用则是直接给变量取别名,不需要拷贝,可以直接使用原变量的值,效率就大大提升了。
6、引用和指针的区别
7、内联函数:
8、范围for的语法 :
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
e *= 2;
for(auto e : array)
cout << e << " ";
return 0;
}