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

总结:

  • C++语言的const修饰的变量有时有空间,有时没有空间(发生常量折叠,且没有对变量进行取地址操作)
  • C++中,const修饰的全局变量具有内部链接属性,也就是说,无法使用别的文件的const修饰的变量,但是这种规则依旧可以打破
  • const修饰的全局变量永远都没有内存,永远无法修改它的值,但是const修饰的局部变量可以有空间,可以修改它的值
编译器不能优化的情况
  • 不能优化自定义数据类型
  • 如果用变量给const修饰的局部变量赋值,那么编译器也不能优化
  • 使用extern和voaltile关键字来阻止优化
例子一:用变量给const修饰的局部变量赋值
void test03(){ int a =10; const int b = a; int *p = (int *)&b; *p = 100; cout << b << endl;//输出100}例子二:利用关键字阻止优化
void test04(){ const volatile int a = 7; int *p = (int *)(&a); *p = 8; cout << "a=" << a << endl;//输出8 cout << "*p=" << *p; system("pause"); return 0;}例子三:自定义数据类型不能优化
struct Maker{ Maker() {a = 100; } int a;};void test05(){ const Maker ma; cout << ma.a <<endl; Maker *p = (Maker*)&ma; p->a = 200;//可以修改ma中的值 cout << ma.a << endl;}const修饰指针和引用const修饰指针涉及到两个很重要的概念,顶层const和底层const
从 const 指针开始说起 。const int* pInt;int *const pInt = &someInt;,前者是 *pInt 不能改变,而后者是 pInt 不能改变 。因此指针本身是不是常量和指针所指向的对象是不是常量就是两个互相独立的问题 。用顶层表示指针本身是个常量,底层表示指针所指向的对象是个常量 。更一般的,顶层 const 可以表示任意的对象是常量,这一点对任何数据类型都适用;底层 const 则与指针和引用等复合类型有关,比较特殊的是,指针类型既可以是顶层 const 也可以是底层 const 或者二者兼备 。
int a = 1;int b = 2;const int* p1 = &a;//指针常量(顶层const)int* const p2 = &a;//常量指针(底层const)1.指针常量(指针不可改,指针指向的对象可改)int a = 10;int b = 5;int * const p1 = &a;p1 = &b; //指针不可改,不合法*p1 = b; //指针指向的对象可改,合法2.常量指针(指针可改,指针指向的对象不可改)int a = 10;int b = 5;const int* p2 = &a;p2 = &b; //指针可改, 合法*p2 = b; //不合法拷贝与顶层和底层 const
int i = 0;int *const p1 = &i;     //  不能改变 p1 的值,这是一个顶层const int ci = 42;      //  不能改变 ci 的值,这是一个顶层const int *p2 = &ci;    //  允许改变 p2 的值,这是一个底层const int *const p3 = p2;   //  靠右的 const 是顶层 const,靠左的是底层 constconst int &r = ci;      //  所有的引用本身都是顶层 const,因为引用一旦初始化就不能再改为其他对象的引用,这里用于声明引用的 const 都是底层 const

经验总结扩展阅读