zoukankan      html  css  js  c++  java
  • c++学习记录(九)

    常量对象,常量成员函数和常引用

    - 常量对象

    • 如果不希望某个对象的值被改变,则定义该对象的时候可以在前面加const关键字
    class Demo{
        private:
            int value;
        public:
            void SetValue(){}
    };
    const Demo Obj;//常量对象
    

    - 常量成员函数

    • 在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数

    • 常量成员函数执行期间不应修改其所作用的对象。

    • 因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)

    • 因为静态成员不属于任何一个对象。

    • 示例:

    class Sample
    {
        public:
            int value;
            void GetValue()const;
            void func(){};
            Sample(){}
    };
    void Sample::GetValue()const
    {
        value=0;//wrong
        func();//wrong
    }
    int main(){
        const Sample o;
        o.value=100;//error,常量对象不可被修改
        o.func();//error,常量对象上不能执行非常量成员函数
        o.GetValue();//ok,常量对象上可以执行常量成员函数
        return 0;
    }//在Dev-C++中,要为Sample类编写无参构造函数才可以,Visual Studio 2010 中不需要
    

    - 常量成员函数的重载

    • 两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载,而不是重复定义
    class CTest {
        private:
            int n;   
        public:
            CTest(){n=1;}
            int GetValue()const{return n;}
            int GetValue(){return 2*n;}
    };
    int main(){
        const CTest objTest1;
        CTest objTest2;
        cout<<objTest1.GetValue()<<","<<objTest2.GetValue();
    }
    
    • 分析:
      上述代码输出1,2,他们对应找对应,objTest1const类型,则找const类型的GetValue

    - 常引用

    • 常引用又一次出现了,看出他的重要性了
    • 引用前面加const关键字,成为常引用,不能通过常引用修改其引用的变量
    const int &r=n;
    r=5;//error
    n=4;//ok
    
    • 使用常引用作为函数参数的原因
      1.对象作为函数的参数时,生成该参数需要调用复制构造函数,效率比较低
      2.用指针作为参数,代码不好看

    • 对象作为函数的参数有一定的风险性,若函数中不小心修改了形参o,则实参也跟着变,所以此时可以使用对象的常引用作为参数

    • 如:

    class Sample{
        ...
    };
    void PrintfObj(const Sample &o)
    {
        ...
    }
    
  • 相关阅读:
    黑马前端2020就业Web全套课-2020.4月最新版
    什么是Redis雪崩、穿透和击穿? 全面掌握Redis
    ElasticStack高级搜索入门到项目实战,Elasticsearch全文检索
    阿里云盘邀请码+软件下载
    Intellij IDEA超实用设置汇总,高效便捷敲代码
    双11的亿级高并发架构,是怎么设计的?
    TensorFlow 卷积神经网络实用指南 | iBooker·ApacheCN
    TensorFlow 入门 | iBooker·ApacheCN
    TensorFlow 2.0 快速入门指南 | iBooker·ApacheCN
    深度学习快速参考 | iBooker·ApacheCN
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12264362.html
Copyright © 2011-2022 走看看