在C ++类中,如果我有一个常量函数(在我的理解中,常量函数是不能在类中改变任何东西的类,希望这是真的) 例如像这样的函数
int output(int value) const
我是否可以调用此函数中的函数删除实际更改类中的任何内容?
例如,假设我有一个名为number的变量私有。
我的输出函数在变量号中加了一个,但不是直接调用 一个名为addOne的非常量函数,它将一个加到变量号上。 我注意到当输出函数调用addOne时我收到错误(我知道输出函数是const但是它修改了一个值,但它间接地修改了它)。我想知道为什么我会收到一个错误,编译器实际上在这里检测到了什么错误?
谢谢,对不起,如果我的问题很难理解。
谢谢大家的回答。
答案 0 :(得分:2)
答案很简单 - 不,你不能。每个类方法都是一个隐式传递this
作为参数的函数。当您将方法声明为const时,这意味着它实际上会将const this
传递给此函数。从逻辑上和语法上来说,不要从const方法中调用非const方法。
答案 1 :(得分:2)
const实例只能调用const函数。说:
class YourClass {
...
int output(int value) const;
int regularMethod(); // Non-const
...
};
是具有const函数的类。变量:
const YourClass obj1;
YourClass obj2;
这里obj1可以在调用regularMethod时调用输出方法。 obj2可以同时调用。
答案 2 :(得分:2)
每个const函数()都将const this
指针作为默认参数,因此即使您尝试从const函数调用non_cost函数并尝试修改一个类,也无法更改类的成员变量成员变量。
因此,如果您尝试从const函数调用非const函数,则会出现编译错误。
答案 3 :(得分:1)
答案是否定的。如果您在this
调用函数中通过const_cast
- const
使用这样的憎恶,那么很长的答案可能是肯定的(但您必须确保在非调用函数上调用函数) - const
个对象,否则会导致未定义的行为):
#include <iostream>
struct Foo
{
int x = 0;
void f()
{
++x;
}
void modify_x() const
{
const_cast<Foo*>(this)->f(); // call non-const member function
}
};
int main()
{
Foo foo;
std::cout << foo.x << std::endl;
foo.modify_x();
std::cout << foo.x << std::endl;
}