太多的C#,太少的C++让我的头晕... 有人能提醒我这个C++声明是什么意思吗?特别是结尾的“const”。非常感谢。
protected:
virtual ostream & print(ostream & os) const
太多的C#,太少的C++让我的头晕... 有人能提醒我这个C++声明是什么意思吗?特别是结尾的“const”。非常感谢。
protected:
virtual ostream & print(ostream & os) const
const
方法只接收一个const
的this
指针。
在这种情况下,this
指针将是const ThisClass * const
类型而不是通常的ThisClass * const
类型。
这意味着成员变量不能在const
方法内部被修改。甚至非const
方法也不能从这样的方法中调用。但是,成员变量可以声明为mutable
,在这种情况下,该限制将不适用于它。
因此,当您有一个const
对象时,编译器只会允许您调用由const
关键字标记为安全的方法。
const ThisClass* const
类型而不是ThisClass* const
类型。已添加到答案中。 - Daniel Vassallo结尾的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;
};
方法声明中的const
告诉编译器该函数可以安全地在类型为该函数成员的const对象上调用。它还向编译器发出信号,表明该函数不应该改变对象的状态,并且它将无法更改未标记为mutable
的任何成员变量。
如果省略const
,则此代码将无法工作:
const Foo bar;
bar.print(std::cout); // Will fail to compile unless 'print' is marked const
您正在声明一个名为print
的受保护虚拟方法,该方法以对ostream的引用作为参数,并返回对ostream的引用。
const关键字意味着该方法无法更改对象的状态,this
指针将是常量。
虚拟方法是一种可以在继承类中重写其行为的方法,基本上虚拟关键字赋予了C ++支持多态性的能力。
最后,如果您不知道什么是引用去这里看看
由于您来自C#,我想您应该知道protected的含义 :)