不了解const方法声明

时间:2010-02-16 08:06:56

标签: c++

C#太多而C ++太少让我头晕目眩......有人能提醒我这个c ++声明是什么意思吗?具体来说,结尾是“const”。非常感谢。

protected:
     virtual ostream & print(ostream & os) const

4 个答案:

答案 0 :(得分:10)

const方法只会收到const this指针。

在这种情况下,this指针将属于const ThisClass* const类型,而不是通常的ThisClass* const类型。

这意味着无法从const方法内修改成员变量。甚至不能从这样的方法调用非const方法。但是,成员变量可以声明为mutable,在这种情况下,此限制将不适用于它。

因此,当您拥有const对象时,编译器允许您调用的唯一方法是const关键字标记为安全的方法。

答案 1 :(得分:4)

结尾const意味着print函数不应该能够改变它所声明的类的任何成员的状态(因此不能调用它的任何成员函数)未声明为const)的类。

在下面的示例中,类print中的Foo函数无法更改Foo的任何成员变量(除非它们被声明为mutable),并且不能调用Foo中的任何非const函数。

class Foo {
public:
    Foo(string value) { m_value = value; }
protected:
    ostream & print(ostream & os) const {
        m_value = string("foobar"); // won't compile
        os << m_value;
        return os;
    }
private:
    string m_value;
};

答案 2 :(得分:3)

方法声明中的const告诉编译器该函数可以安全地调用该函数所属类型的const对象。它还向编译器发出信号,表明该函数不应该改变对象的状态,并且它将无法更改任何未标记为mutable的成员变量。

如果省略const,则此代码不起作用:

const Foo bar;
bar.print(std::cout);  // Will fail to compile unless 'print' is marked const

答案 3 :(得分:1)

您正在声明一个名为print的受保护虚拟方法,该方法将参数作为对ostream的引用,并返回对ostream的引用。

const关键字表示该方法无法改变对象的状态,this指针将为const。

虚方法是一种方法,其行为可以在继承类中被覆盖,基本上虚拟关键字使C ++具有支持多态的能力。

最后如果您不知道什么是参考go there

来自C#,我想你知道受保护意味着什么:)