C++编程入门(二) 互动版

常量成员

这一节将关键字const与类、对象相遇时碰撞出的火花。回忆一下const,const类型的变量或对象的值是不能被更新的,所以必须有初始化。关于const的用法,想起来一些了吧,下面讲新知识。

类的数据成员前面可以加上关键字const,称为常量成员。有三种:常量数据成员,静态常量数据成员,常引用。前两者的区别是静态常量数据成员还有一个关键字static,刚学过的,需要在类外初始化。最后一个常引用就是将引用说明为常量,该引用所引用的对象的值不能被更新。

class L
{
    public:
        L(int x, int y);
        void incr(int y){a+=y;}
        void Print(){cout<<"a= "<<a<<endl;}
    private:
        int a;
        const int b;        //常量数据成员
        static const int c; //静态常量数据成员
        const int & r;        //常引用
};
const int L::c=123;            //静态常量数据成员需要在类外初始化
L::L(int x, int y):b(y),r(a); //常量数据成员不能在函数体内赋值,只能在初始化列表赋初始值。
{    
    a=x;
}

类L有一个普通的数据成员a,常成员b,静态常成员c和常引用r。需要注意的地方均在注释中说明了。

常对象

定义对象时,在最前面加const,则该对象为常对象,务必一同进行初始化。之后该对象的值不能改变。例如:

const L l(3,5); L const l(4,5);

上面两种写法都对。

常成员函数

使用关键字const说明的成员函数叫做常成员函数。只有常对象才能调用常成员函数,常成员函数中不能更新对象的数据成员,也不能调用没有const修饰的成员函数。比较绕,用例子说明。

#include <iostream>
using namespace std;
class L
{
    public:
        L(int x, int y):a(x),b(y){}
        void incr(int y){a+=y;}
        void Print(){cout<<"a= "<<a<<" b= "<<b<<endl;}
        void Print()const;
    private:
        int a;
        const int b;        //常量数据成员
};
void Print()const
{
    cout<<"a= "<<a<<" const b= "<<b<<endl;
}
void main()
{
    L l1(1,2);
    const L l2(3,4);
    l1.Print();
    l2.Print();
}

在类L中说明了两个同名函数Print,其中一个是常成员函数。类L中还有一个常成员b,它只能通过初始化列表进行初始化。

在main函数中创建对象l1,以及常对象l2。然后分别调用Print函数。输出为:

a= 1 b= 2

a= 3 const b= 4

也就是说对象l1调用的是普通的Print,而对象l2调用的是常成员函数Print。