拷贝与顶层和底层 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 都是底层 constconst修饰引用常引用所引用的对象不能更新,使用方法为:const 类型说明符 &引用名
非const引用只能绑定非const对象,const引用可以绑定任意对象,并且都当做常对象
常引用经常用作形参,防止函数内对象被意外修改 。对于在函数中不会修改其值的参数,最好都声明为常引用 。复制构造函数的参数一般均为常引用
class Example{public: Example(int x, int y):a(x),b(y){} Example(const Example &e):a(e.a),b(e.b){} //复制构造函数 void print(); void print() const;private: const int a,b; static const int c = 10;};void Example::print() {cout<<"print():"<<a<<ends<<b<<endl;}void Example::print() const {cout<<"print() const:"<<a<<ends<<b<<endl;}const修饰函数参数const修饰参数是为了防止函数体内可能会修改参数原始对象 。因此,有三种情况可讨论:
- 1、函数参数为值传递:值传递(pass-by-value)是传递一份参数的拷贝给函数,因此不论函数体代码如何运行,也只会修改拷贝而无法修改原始对象,这种情况不需要将参数声明为const 。
- 2、函数参数为指针:指针传递(pass-by-pointer)只会进行浅拷贝,拷贝一份指针给函数,而不会拷贝一份原始对象 。因此,给指针参数加上顶层const可以防止指针指向被篡改,加上底层const可以防止指向对象被篡改 。
- 3、函数参数为引用:引用传递(pass-by-reference)有一个很重要的作用,由于引用就是对象的一个别名,因此不需要拷贝对象,减小了开销 。这同时也导致可以通过修改引用直接修改原始对象(毕竟引用和原始对象其实是同一个东西),因此,大多数时候 , 推荐函数参数设置为pass-by-reference-to-const 。给引用加上底层const,既可以减小拷贝开销,又可以防止修改底层所引用的对象 。
const int* func() // 返回的指针所指向的内容不能修改{ // return p;}const成员函数和数据成员类的常成员函数由于C++会保护const对象不被更新,为了防止类的对象出现意外更新,禁止const对象调用类的非常成员函数 。因此,常成员函数为常对象的唯一对外接口 。
常成员函数的声明方式:
类型说明符 函数名(参数表) const
- const对象只能访问const成员函数,而非const对象可以访问任意的成员函数 , 包括const成员函数
- const对象的成员是不能修改的 , 而通过指针维护的对象却是可以修改的
- const成员函数不可以修改对象的数据,不管对象是否具有const性质 。编译时以是否修改成员数据为依据进行检查
推荐阅读
- 手机怎么把QQ空间说说一次性全删掉(qq如何恢复删掉的说说)
- 怎么一次性删掉QQ空间里的全部说说(翻看以前qq空间的说说)
- 怎么把空间说说全部清空(qq空间一键清空所有说说)
- 手机QQ空间怎么一次性删除说说求解(怎么一键删除qq说说)
- qq空间说说怎么全部删除(怎样一键清空qq空间)
- 如何注销空间 1980717Z空间
- qq空间说说怎么全部删除(qq空间说说一键恢复)
- QQ空间说说太多怎么一次性全删除(说说可以一键删除吗)
- 手机QQ空间怎么一次性删除说说求解(一键删除qq说说)
- 用电脑扣扣空间说说怎么批量删除(怎么批量删除自己qq空间说说)