函数后面加constant是什么意思呀
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/09/03 12:40:14
函数后面加constant是什么意思呀
见到这么一个面试题:
class Foo
{
int fun() constant;
}
我从来没见过函数后面还加constant的,
一个变量加constant表示变量不可更改,函数加constant是什么意思呢?代码不可更改?
见到这么一个面试题:
class Foo
{
int fun() constant;
}
我从来没见过函数后面还加constant的,
一个变量加constant表示变量不可更改,函数加constant是什么意思呢?代码不可更改?
首先,是加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函数并标记出来是个好习惯,既保证自己不会对类误操作,也可以明示别人调用你的类里哪些会改变类状态.
函数后面加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函数并标记出来是个好习惯,既保证自己不会对类误操作,也可以明示别人调用你的类里哪些会改变类状态.