C++ Primer 笔记之const总结

来源:互联网 发布:python 重定向 编辑:程序博客网 时间:2024/05/16 05:53
1、定义const对象  const intbufSize = 512;
2、const对象默认为文件的局部变量    
在全局作用域里定义非const变量时,它在整个程序中都可以访问。我们可以把一个非const变量定义在一个文件中,假设已经做了合适的声明,就可在另外的文件中使用这个变量。与其他变量不同,除非特别说明,在全局作用域声明的const变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。通过指定const变量为extern,就可以在整个程序中访问const对象。 非const变量默认为extern。要使const变量能够在其他的文件中访问,必须显式地指定它为extern。
3、const引用是指向const对象的引用。const引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:
int i = 42;
const int &r = 42;
const int &r2 = r + i;
同样地初始化对于非const引用却是不合法的,而且会导致编译时错误。
观察将引用绑定到不同的类型时所发生的事情,最容易理解上述行为。假如我们编写
double dval = 3.14;
const int &ri = dval;
编译器会把这些代码转换成以下形式的编码:
int temp = dval;
const int &ri = temp;
如果ri不是const,那么可以给ri赋一新值。这样做不会修改dval,而是修改了temp。对ri的赋值会修改dval的程序员会发现dval并没有被修改。仅允许const引用绑定到需要临时使用的值完全避免了这个问题,因为const引用是只读的。
总结:非const引用只能绑定到与该引用同类型的对象。
      const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
4、指向const对象的指针  const double *cptr;把一个const对象的地址赋给一个普通的、非const对象的指针会导致编译时的错误。允许把非const对象的地址赋给指向const对象的指针,但是这样系统会把这个指针所指的对象视为const,也就是说通过指针无法修改变量的值了。
   如果把指向const的指针理解为“自以为指向const的指针”,这可能会对理解有所帮助。
5、const指针——指针本身的值不能修改。
6、指向const对象的const指针。
7、const对象的动态数组
  const int *ptr = new int[100]();
C++允许定义类类型的const数组,但该类类型必须提供默认的构造函数。
8、const对象的动态分配和回收
   const int *pci = new constint(1024);
   delete pci; // OK, deletes aconst object
9、const成员函数的引入
在成员函数声明的形参表后面的const所起的作用:const改变了隐含的this形参的类型,使this指针指向一个const对象。如果函数被声明为const成员函数,那么函数定义时形参表后面也必须有const。
10、合成的默认构造函数一般适用于仅包含类类型成员的类,而对于含有内置类型或复合类型成员的类,则通常应该定义它们自己的默认构造函数初始化这些成员。