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

见到这么一个面试题:

见到这么一个面试题:

C PHP
慕无忌1623718 2023-01-02 18:15:38
class Foo{int fun() constant;}我从来没见过函数后面还加constant的,这表示什么意思呢?请高手帮我解答,谢谢了一个变量加constant表示变量不可更改,函数加constant是什么意思呢?代码不可更改?说不通呀??
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

使用CONST说明的成员函数,称为常成员函数。只有常成员函数才有权使用常量或常对象,没有使用的CONST说明的成员不能使用常对象。
const成员函数和const对象

实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。例如,定义一个整型常量的方法为:

const int i=1 ;

同样,也可以定义常量对象,假定有一个类classA,定义该类的常量对象的方法为:

const classA a(2);

这里,a是类classA的一个const对象,"2"传给它的构造函数参数。const对象的数据成员在对象寿命期内不能改变。但是,如何保证该类的数据成员不被改变呢?

为了确保const对象的数据成员不会被改变,在C++中,const对象只能调用const成员函数。如果一个成员函数实际上没有对数据成员作任何形式的修改,但是它没有被const关键字限定的,也不能被常量对象调用。
调用规则
对象 成员函数 对/错

5、 const const 对

6、 const non-const 错

7、 non-const const 对

8、 non-const non-const 对

 


查看完整回答
反对 回复 2023-01-06
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

首先,是加const不是constant。
函数后面加const是表明这个函数不会更改class的状态,即class内各成员变量的值。编译器如果发现某个const函数里改变了成员变量的值会报错。比如下面这个例子。
struct A {
int i;
void set(int v) {i = v;} //不能加const,因为i值改变了。
int value() const {return i;} //正确,i值没有改变。
int value2() const {return i++;} //错误,因为i值改变了。必须将const去掉。
};

如果函数比较复杂时,比如并不直接改变某个值,但是调用了其它函数,编译器怎么判断函数是否const呢。可以看下面的例子。

struct B {
A a; //B里包含一个A类成员。
int func1() const {return a.value();} //正确,所调用的a.value()也是一个const函数。
int func2() const {return a.value2();} //错误,a.value2()不是const函数。
};

也就是说,在const函数里只能调用成员的const函数以保证成员状态不会改变。

所以,在设计类的函数里,区别const和非const函数并标记出来是个好习惯,既保证自己不会对类误操作,也可以明示别人调用你的类里哪些会改变类状态。

查看完整回答
反对 回复 2023-01-06
  • 2 回答
  • 0 关注
  • 104 浏览

添加回答

举报

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