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)
{
    ...
}

猜你喜欢

转载自www.cnblogs.com/2002ljy/p/12264362.html