标题已经全部说明了。不过我还要稍微扩展一下:我的班级所有属性都是const
:
template< class perm = Perm16 >
class PermutationGroup {
public:
using StrongGeneratingSet = std::vector< std::vector< perm > >;
const std::string name;
const uint64_t N;
const StrongGeneratingSet sgs;
PermutationGroup(std::string name, uint64_t N, StrongGeneratingSet sgs) :
name(name), N(N), sgs(sgs) { assert(check_sgs()); };
bool check_sgs() const; // defined as const
bool is_canonical(vect v) const; // defined as const
[...]
};
将所有成员函数定义为const
是否有用?还是我不必要地重复自己?
答案 0 :(得分:4)
如果未将成员函数声明为 const ,则无法在 const 对象或 const引用。例如,以下内容不起作用:
const PermutationGroup& group = PermutationGroup("foobar", 42, ...);
group.check_sgs(); // ERROR: can't invoke non-const function on const objects
答案 1 :(得分:0)
将您的方法声明为const
意味着您可以在const
限定对象上调用它们。没有必要仅仅因为类中没有可变字段来声明它们const
,但是一般来说,如果你总是声明不需要&#的方法,那么编写const-correct代码会更容易。 39; t修改任何内容为const
。
答案 2 :(得分:0)
具有所有const属性的类是否需要将成员函数声明为const?
声明成员变量const
与声明成员函数const
不同。当成员变量声明为const
时,无法修改它。即使那些未声明为const
的成员函数仍然可以访问它,它们只是无法修改。
对成员函数const
进行Decalring表示此函数不会修改此对象。除非声明mutable
,否则不允许该函数更改任何成员变量。它也无法调用未声明为const
的成员函数,因为这些函数将被允许修改对象。
将成员函数声明为const
非常重要,因为它允许在它们所属的类的常量实例上调用这些函数。 Nosid在answer中提供了一个很好的例子。
答案 3 :(得分:0)
不,不。
话虽如此,代表属性的constness意味着代表实例的constness,所以即使成员函数是非const ,它也不能表现得这样(即因为状态突变)
另一种方式并非如此。例如
int myClass::example() const {
member = 1;
}
与
相同int myClass::example() const {
this->member = 1;
}
和成员函数的constness表示this
指针的常量。这与承诺对象结构的“原始位”不会发生变化略有不同。例如,reference members can be modified by const
member functions
总结:当成员函数与const
指针this
一起使用时,将成员函数声明为const
变为强制性。在你的情况下,不要将一个声明为const
只会是徒劳的(并打破检查员/变异者的语义......这不是一个交易)。