c ++类,调用非常量函数的const函数

时间:2015-04-12 00:56:02

标签: c++

在C ++类中,如果我有一个常量函数(在我的理解中,常量函数是不能在类中改变任何东西的类,希望这是真的) 例如像这样的函数

int output(int value) const

我是否可以调用此函数中的函数删除实际更改类中的任何内容?

例如,假设我有一个名为number的变量私有。

我的输出函数在变量号中加了一个,但不是直接调用 一个名为addOne的非常量函数,它将一个加到变量号上。 我注意到当输出函数调用addOne时我收到错误(我知道输出函数是const但是它修改了一个值,但它间接地修改了它)。我想知道为什么我会收到一个错误,编译器实际上在这里检测到了什么错误?

谢谢,对不起,如果我的问题很难理解。

谢谢大家的回答。

4 个答案:

答案 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;
}