不理解const方法声明

5

太多的C#,太少的C++让我的头晕... 有人能提醒我这个C++声明是什么意思吗?特别是结尾的“const”。非常感谢。

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

感谢你为我编辑它,Daniel。 :D - smwikipedia
4个回答

10

const方法只接收一个constthis指针。

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

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

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


1
除非成员被标记为可变,否则不要修改。 - pm100
@pm100:谢谢。已经添加了关于可变成员的注释。 - Daniel Vassallo
小问题:在一个const方法中,*this将是const的。无论所讨论的方法是否为const,this指针始终是const的。 - Void
@Void:是的,但它将是const ThisClass* const类型而不是ThisClass* const类型。已添加到答案中。 - Daniel Vassallo

4

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

在下面的示例中,类Foo中的print函数不能更改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;
};

3

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

如果省略const,则此代码将无法工作:

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

1

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

const关键字意味着该方法无法更改对象的状态,this指针将是常量。

虚拟方法是一种可以在继承类中重写其行为的方法,基本上虚拟关键字赋予了C ++支持多态性的能力。

最后,如果您不知道什么是引用去这里看看

由于您来自C#,我想您应该知道protected的含义 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接