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

拷贝与顶层和底层 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,既可以减小拷贝开销,又可以防止修改底层所引用的对象 。
void Fun(const A *in); //修饰指针型传入参数void Fun(const A &in); //修饰引用型传入参数void func (const int& n){     n = 10;        // 编译错误}const修饰函数返回值const修饰函数返回值的含义和用const修饰普通变量以及指针的含义基本相同 。这样可以防止外部对 object 的内部成员进行修改 。
const int* func()   // 返回的指针所指向的内容不能修改{    // return p;}const成员函数和数据成员类的常成员函数由于C++会保护const对象不被更新,为了防止类的对象出现意外更新,禁止const对象调用类的非常成员函数 。因此,常成员函数为常对象的唯一对外接口 。
常成员函数的声明方式:类型说明符 函数名(参数表) const
  • const对象只能访问const成员函数,而非const对象可以访问任意的成员函数 , 包括const成员函数
  • const对象的成员是不能修改的 , 而通过指针维护的对象却是可以修改的
  • const成员函数不可以修改对象的数据,不管对象是否具有const性质 。编译时以是否修改成员数据为依据进行检查
class A{public: //返回值的类型是int &类型    int& getValue() const    {        // a = 10;    // 错误        return a;    }private:    int a;            // 非const成员变量};

推荐阅读