为了账号安全,请及时绑定邮箱和手机立即绑定

求解C/C++ 关键字const的定义?

求解C/C++ 关键字const的定义?

C++ C
Cats萌萌 2021-11-24 15:11:56
(4)对于类的成员函数,若指定其为const 类型,则表明其是一个常函数,不能修改类的成员变量;(5)对于类的成员函数,有时候必须指定其返回值为const 类型,以使得其返回值不为“左值”这两句话什么意思。
查看完整描述

2 回答

?
MM们

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&(注:引用)。



查看完整回答
反对 回复 2021-11-29
?
慕标5832272

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的原值。

查看完整回答
反对 回复 2021-11-29
  • 2 回答
  • 0 关注
  • 229 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信