2 回答
TA贡献1886条经验 获得超2个赞
举一个例子,可能你会跟明白些。
No.(4)
class A
{
public:
A(int n=0):data(n){}
void SetData( int n )
{
data = n;
}
int GetData() const // const成员函数
{
// 在const成员函数里面【只能取用】成员变量,而【不能修改】该类里面任何的成员变量
// 比如,如下代码会编译出错,
//data = 1; // error C2166: l-value specifies const object
cout << data; // 取用是没有问题的。
return data;
}
private:
int data;
};
所以,对于一个成员函数,其函数体内的代码如果只是成员变量,而不会修改任何成员变量,就应该给这个函数加上const,来表达你的这个意图。防止以后维护人员不小心在这个函数里修改了变量,编译的时候马上就会知道了。
通常gettor函数就应该设置成const成员函数。如上的代码所示。
还有,附加说明一下:通过一个const对象(object)调用其成员函数,那只能调
用const成员函数。如果声明了一个上面那个类A的const对象,如下:
const A aObj(10); // aObj是一个常量对象
cout << aObj.GetData(); // ok
//aObj.SetData( 11 ); // error,因为SetData不是const成员函数
然而,对于非const对象,却没有这个限制。非const对象依然可以调用const成员函数的。
NO.(5)
struct MyData
{
int a;
int b;
int c;
// ...
};
class MyClass
{
public:
void SetInitData()
{
m_Data.a = 1;
m_Data.b = 1;
m_Data.c = 1;
}
const MyData& GeteMyData() const // 这里面有2个const:)。后面的那个
// const的意思,上面说的那个。
{
return m_Data;
}
private:
MyData m_Data;
};
如下使用:
MyClass myObj;
myObj.SetInitData();
//MyData& myData = myObj.GeteMyData(); 这行代码会编译不通过的哟
// 给返回类型的数据加上const的引用的意思是,只给你拿去read,但是不允
许你write。
const MyData& myData = myObj.GeteMyData();
//myData.a = 2; // error.尝试修改,会编译不通过。
所以第五点的核心意思就是返回一个常量引用,作为只读数据使用。
注:一般情况下,对于这一条,都会指定const T&(注:引用)。
TA贡献1966条经验 获得超4个赞
一些情况下类中的成员变量需要赋值后不变,所以会定义为常成员变量,如const a;将类的成员函数指定为const 类型如void show() const;于是在函数中,我们可以放心地使用常成员变量和常成员函数,因为在编译的时候编译器就会自动检查这个函数是否有违规改变常变量的值,违规则不会通过编译。它的作用是对于常变量而言的。
返回值为const的函数例如const int test();会返回一个const int 型的返回值,如重载运算符“=”,const T &operator=(T &t),T d=(a=b+c);d的值也等于b+c,不会等于a的原值。
- 2 回答
- 0 关注
- 285 浏览
添加回答
举报