美文网首页
C++的const复习

C++的const复习

作者: 盼旺 | 来源:发表于2019-12-13 13:23 被阅读0次

    复习:如何访问静态成员

    1) 类名::成员名
    A::PrintNum();
    
    2) 对象名.成员名
    A a;
    a.PrintNum();
    
    3) 指针->成员名
    A *p = new A();
    p->PrintNum();
    
    4) 引用.成员名
    A a;
    A & ref = a;
    ref.PrintNum();
    

    复习: const 修饰函数参数

    像void Func(A a)这样声明的函数注定效率比较底。因为函数体内将产生A 类型的临时对象
    用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间。为了提高效率,可以将函数声明改为
    void Func(A &a),因为“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。
    但是函数void Func(A &a) 存在一个缺点:“引用传递”有可能改变参数a,这是我们不期望的。
    解决这个问题很容易,加const修饰即可,因此函数最终成为void Func(const A &a)。
    以此类推,是否应将void Func(int x) 改写为void Func(const int &x),以便提高效率?完全没有必要
    因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当
    对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。
    例如将void Func(A a) 改为void Func(const A &a)。
    对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的
    又降低了函数的可理解性。例如void Func(int x) 不应该改为void Func(const int &x)。
    

    复习:const 修饰成员函数(const的作用:说明其不会修改数据成员)

    任何不会修改数据成员的函数都应该声明为const 类型。
    如果在编写const 成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,
    编译器将指出错误,这无疑会提高程序的健壮性。
    注意:
    1.const 关键字不能与 static 关键字同时使用,因为 static 关键字修饰静态成员函数,
    静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。
    2.const 关键字只能放在函数声明的尾部
    3. const对象只能访问const成员函数,而非const对象可以访问任意的成员函数,包括const成员函数.
    4. const对象的成员是不可修改的,然而const对象通过指针维护的对象却是可以修改的.
    5. const成员函数不可以修改对象的数据,不管对象是否具有const性质.它在编译时,以是否修改成员数据为依据,进行检查.
    6. 然而加上mutable修饰符的数据成员,对于任何情况下通过任何手段都可修改
    自然此时的const成员函数是可以修改它的。
    

    复习:const的位置放置

    前面使用const 表示返回值为const
    后面加 const表示函数不可以修改class的成员 这里设计到this指针
    
    const int getValue();
    int getValue2() const;
    

    复习:成员函数this指针

    this指针:成员函数通过一个名为this的隐式形参来访问调用它的那个对象。
    this由调用该成员函数的对象的地址初始化。
    1 A t; 
    2 t.getNum(); //等价于A ::getNum(&t),编译器负责把t的地址传递给getNum的隐式形参this
    

    复习:const 修饰函数的返回值

    1.const 修饰内置类型的返回值,修饰与不修饰返回值作用一样。
    const int Cmf()
    {
        return 1;
    }
    
    2.主要用于函数返回const引用
    #include <string>
    using namespace std;
    //返回 const引用的函数
    const string& SetValue_const(string & v){
        v = "123";
        return v;
    } 
    //返回普通引用函数
    string& SetValue_not_const(string & v){
        v = "123";
        return v;
    } 
    int main(int argc,char *argv[]){
        string v;
        SetValue_const(v) = "456";//编译错误 返回引用为const引用,不允许修改 
        SetValue_not_const(v) = "456";//正常,返回的引用为普通引用,可以修改内容 
        return 0; 
    }
    引用是一个对象的别名,相当于 const 指针,其指向一经确定,就不能改变了。而 const 引用,
    则相当于指向 const 变量的 const 指针,其指向和指向的内容均不允许改变。
    

    相关文章

      网友评论

          本文标题:C++的const复习

          本文链接:https://www.haomeiwen.com/subject/skjfnctx.html