C++学习笔记9:常量对象、常量成员函数、常引用

常量对象

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

常量成员函数

    1 定义:在类的成员函数说明后面可以加上const关键字,则该成员函数成为常量成员函数。
    2 常量成员函数执行期间不应修改其所作用的对象。因此,在常量成员函数中不能修改成员变量的值(静态成员变量除外,因为静态成员变量不属于对象的一部分,它被所有对象共享)
        ,也不能调用同类的非常量成员函数(静态成员函数除外,因为静态成员函数内不会访问非静态的成员变量)
    3 eg:
        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;
        }
    4 常量成员函数的重载
        两个成员函数,名字和参数表都一样,但是一个是const,一个不是,算重载
        eg:见(chongzai.cpp)
//
// 常量成员函数重载的例子
//
#include <iostream>

using namespace std;

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();
    return 0;
}


常引用

    1 定义:引用前面可以加const关键字,成为常引用。不能通过常引用,修改其引用的变量。
    2 eg:
        const int& r = n;
        r = 5;  // error
        n = 4;  // ok
    3 对象作为函数参数时候,生成该参数需要调用复制构造函数,效率比较低。用指针作为参数,代码又不好看,如何解决?
        解决办法:可以使用对象的引用作为参数
        eg:
            class Sample{
                ....
            };
            void PrintfObj(Sample& o)
            {
                ....
            }
        对象引用作为函数的参数有一定风险性,若函数中不小心修改了形参o,则实参也跟着变,这可能不是我们想要的。如何避免?
        解决办法:使用对象的常引用作为参数
        eg:
            class Sample{
                ....
            };
            void PrintfObj(const Sample& o)
            {
                ....
            }
        这样函数中就能确保不会出现无意中更改o值的语句了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值