这里的const表示什么?

4

以下C++代码中const表示什么意思?在C#中有什么等价物?我主要使用C#,现在想学习C++。

template <class T> class MaximumPQ { 
public:
virtual ~MaximumPQ () {}

virtual bool IsEmpty () const = 0;    

virtual void Push(const T&) = 0;

virtual void Pop () = 0;
};

4
请获取一本书(https://dev59.com/_3RC5IYBdhLWcg3wK9yV),以便您能够正确地学习 C++。 - GManNickG
你能为熟悉C#的人推荐一个吗? - softwarematter
熟悉C#并不重要,它们是有不同的语言之处的。我建议你选择一本初学者书籍,因为你确实是一个初学者。C#对你没有帮助,假装你不知道它。 - GManNickG
2个回答

9

第一个关键字告诉编译器,这个方法不会改变它所调用的对象的任何成员变量,也只会调用其他const方法。

基本上,它保证该方法没有副作用。

第二个关键字指定传递的引用所指向的对象不会被修改 - 只有在其上调用const方法。

C#中没有等效的签名。


6
好的,我会尽力进行翻译。请注意,我的翻译只是为了让原文更通俗易懂,并尽可能保持原意,且不包含任何额外信息。原文:Well, it doesn't guarantee no side effects--just no side effects on the object whose method is called. That object can have, say, a std::string * as a field, and that std::string can be modified (via the dereferenced pointer) even if the method doing the modified is declared const。翻译:这并不能保证没有副作用 - 只是没有副作用在调用方法的对象上。那个对象可能有一个std :: string *作为字段,即使声明为const的方法执行修改,该std :: string也可以通过解引用指针进行修改。 - Jonathan Grynspan
如果调用一个函数没有副作用,那为什么要调用它呢? :) - GManNickG
1
@GMan:返回值不算作副作用。 - James McNellis
2
@James:那个……我完全是无缘无故地决定忽略它的。 - GManNickG
1
@Jonathat和@kyoryu:实际上,副作用也包括像改变其他对象(例如通过引用或指针传递到函数中的对象)输出到磁盘或用户等等的事情...而且一个const成员函数可能仍然做所有这些事情。此外,它甚至可能会更改成员数据,无论是mutable数据还是非mutable数据(通过去除const)。唯一的const表示的是函数意图使对象保持不变。副作用根本没有涉及。 - sbi
显示剩余6条评论

6

IsEmpty()是一个带有const限定符的成员函数。这意味着this指针是带有const限定符的,因此它将具有类型const MaxPQ*。在IsEmpty()内部的代码不能调用任何未带有const限定符的this上的成员函数,也不能修改任何不是mutable的数据成员。

据我所知,在C#中没有类似的功能。


“const MaxPQ*” - 它实际上是 const MaxPQ *const 吗?还是 this 是一个非 const 但不可修改的特殊情况? - Steve Jessop
1
@Steve:this 是一个 rvalue,因此无法被 const 限定(非类类型的 rvalue 永远不会被 const 或 volatile 限定)。由于它是非类类型的 rvalue,所以无法被修改。 - James McNellis
@Steve:litb之前举了一个很好的例子。假设参数是__this,类型为cv-qualifiers class-name*,那么你可以使用#define this (__this + 0)。当然这不一定是真实情况。 - GManNickG

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