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

    xiaoxiao2021-03-26  10

    本章内容均为coursera中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; //err.常量对象不可被修改 o.func(); //err.常量对象上面不能执行非常量成员函数 o.GetValue(); //ok,常量对象上可以执行常量成员函数 return 0; } //在Dev C++中,要为Sample类编写无参构造函数才可以,Visual Studio2010中不需要

    常量成员函数的重载 两个成员函数,名字和参数表都一样,但是一个是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() ; return 0; }

    常量数据成员

    类中常量数据成员必须在构造函数的初始化列表中进行初始化因为一旦进入构造函数,此常量数据成员不能再改变。

    有关const成员、static成员、const static成员的初始化:

    1、const成员只能在构造函数后的初始化列表中初始化

    2、static成员初始化在类外,且不加static修饰

    3、const static成员:类只有唯一一份拷贝,且数值不能改变。因此,可以在类中声明处初始化,也可以像static在类外初始化

    #include <iostream> using std::cout; using std::endl; class base { public: base(int x=8):a(x){};//const成员在构造函数初始化 const int a; static int b; const static int c=9;//const static成员在类内初始化 }; int base::b=9;//static成员在类外初始化,可以修改 //const int base::c=10;//也可以像static在类外初始化 int main() { base obj; cout<<obj.a<<endl; cout<<base::b<<endl; cout<<base::c<<endl; }

    常引用

    引用前面可以加const关键字,成为常引用。不能通过常引用,修改其引用的变量。

    const int & r = n; r = 5; //error n = 4; //ok

    对象作为函数的参数时,生成该参数需要调用复制构造函数,效率比较低。用指针作参数,代码又不好看, 如何解决? 可以用对象的引用作为参数,如: class Sample { … }; void PrintfObj(Sample & o) { …… }

    对象引用作为函数的参数有一定风险性,若函数 中不小心修改了形参o,则实参也跟着变,这可 能不是我们想要的。如何避免? 可以用对象的常引用作为参数,如:

    class Sample { … }; void PrintfObj( const Sample & o) { …… } 这样函数中就能确保不会出现无意中更改o值的语句了。

    转载请注明原文地址: https://ju.6miu.com/read-500156.html

    最新回复(0)