在类的函数中使用'const'
这个问题在这里已经有了答案:
const方法可以在const对象上调用:
class CL2
{
public:
void const_method() const;
void method();
private:
int x;
};
const CL2 co;
CL2 o;
co.const_method(); // legal
co.method(); // illegal, can't call regular method on const object
o.const_method(); // legal, can call const method on a regulard object
o.method(); // legal
此外,它还告诉编译器,const方法不应该改变对象的状态,并会捕获这些问题:
void CL2::const_method() const
{
x = 3; // illegal, can't modify a member in a const object
}
上述规则有一个例外,使用mutable修饰符,但在冒险进入该领域之前,您应首先熟悉const正确性。
其他人已经回答了有关const成员函数的问题的技术方面,但这里有一个更大的图像 - 这是const正确性的想法。
长话短说,const正确性是澄清和强化你的代码的语义。 举一个简单的例子。 看看这个函数声明:
bool DoTheThing(char* message);
假设有人写了这个函数,你需要调用它。 你知道DoTheThing()
对char缓冲区做了什么吗? 也许它只是将消息记录到文件中,或者它可能会更改字符串。 通过查看函数声明,您无法确定调用的语义。 如果函数不修改字符串,那么声明是const不正确的。
让你的函数也是正确的也有实际的价值。 也就是说,根据调用的上下文,你可能无法调用const不正确的函数。 例如,假设您知道DoTheThing()
不会修改传递给它的字符串的内容,并且您拥有以下代码:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.c_str());
}
上面的代码不会编译,因为msg.c_str()
返回一个const char*
。 为了得到这个代码编译,你必须做这样的事情:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(msg.begin());
}
...甚至更糟糕:
void MyFunction()
{
std::string msg = "Hello, const correctness";
DoTheThing(const_cast<char*>(msg.c_str()));
}
无论如何,这两者都可能比原来的代码“更好”。 但是因为DoTheThing()
是以常量不正确的方式编写的,所以必须围绕它来弯曲代码。
const在附加到非静态类方法时会告诉编译器,您的函数不会修改对象的内部状态。
这在两个方面很有用:
通常,您想要将所有非变异的非静态类方法声明为const。 这允许调用代码在指针上使用const限定符,并且它有助于捕获错误。
典型的C ++:你可以声明一个类变量“mutable”,然后从const方法中改变它。
链接地址: http://www.djcxy.com/p/40413.html上一篇: Using 'const' in class's functions
下一篇: What is the meaning of a const at end of a member function?