命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶( 三 )

运行结果如下:

命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶

文章插图
注意:
  • 半缺省参数必须从右向左依次给出,不能间隔着给
  • 缺省参数不能在声明中和定义中同时出现(推荐写在声明中)
  • 缺省参数必须是全局变量和常量
  • C语言中不支持缺省参数
const限定符const修饰符的作用
  • const类型定义: 指明变量或对象的值是不能被更新,引入目的是为了取代预编译指令
  • 可以保护被修饰的东西,防止意外的修改,增强程序的健壮性
  • 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高
  • 可以节省空间,避免不必要的内存分配
规则
  • const离谁近,谁就不能被修改
  • const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化
分类
  常变量:  const 类型说明符 变量名  常引用:  const 类型说明符 &引用名  常对象:  类名 const 对象名  常成员函数:  类名::fun(形参) const  常数组:  类型说明符 const 数组名[大小]      常指针:  const 类型说明符* 指针名 ,类型说明符* const 指针名const全局/局部变量C在C语言中const修改全局变量是存储在全局区(即静态存储区),修饰局部变量时存储在栈区
//const修饰的常量const int a = 10;//全局const常量,放在常量区,受到常量区的保护void test01(){ //直接修改失败 a = 100; //间接修改失败 int *p = &a; *p = 100;}
  • 全局的const修饰的变量本质就是常量,全局const修饰的变量放在常量区中,不能通过变量名直接修改也不可以通过地址来间接修改
//局部conts修饰常量void test02(){ conts int b = 10;//数据放在栈区,是个伪常量 //直接修改失败 b = 100; //间接修改成功 int *p = &b; *p = 100;}
  • 局部const修饰的变量是个伪常量,不是真正意义上的常量,数据存放在栈区而不是常量区,可以间接修改但是不能直接修改 。
总结:
  • C语言的const修饰的全局变量和局部变量都有空间
  • C语言的const修饰的全局变量具有外部链接属性,可以采用extern声明在别的文件中使用
C++【命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字 C++初阶】在C++中编译器会自动优化,会将常量的数值直接替换(类似于宏定义),这导致了const局部变量与真实值产生了不一致 。(常量折叠现象),而C语言会先去内存中寻找,然后替换
举个例子:
const int aa = 10;//没有内存void test01(){ cout << aa << endl;//在编译阶段,编译器会自动优化,将aa直接替换成常量10 const int bb = 20;//栈区 int *p = (int *)&bb; *p = 200; cout << bb << endl;//输出的还是20,还是那句话,在编译阶段代码中的bb就已经全部被替换成20,此时其实输出的是这样的cout << 20 << endl;但是变量bb此时的值已经被改变了,变成了200,但是由于编译器优化,造成了常量折叠现象}

经验总结扩展阅读