C++常量正确性和常量成员

C++ const-correctness and const members

本文关键字:常量 成员 正确性 C++      更新时间:2023-10-16

可能重复:
常量正确性是否为编译器提供了更多的优化空间?

在过去的几周里,我开发了一种方法,如果可能的话,让我的所有非静态成员成为const,以避免意外的编程错误。然而,这种做法提供了一些巨大的缺点,尤其是对于实体对象,因为例如,如果没有人选择直接聚合这样的实体对象而不是使用指针,那么他们将永远无法再调用赋值运算符。

我的问题是,这个const成员哲学是否提供了任何编译器优化奖金。

class User {
public:
    User(const std::string &, const std::vector<unsigned char> &);
    ~User();
    const std::string &getName() const;
    const std::vector<unsigned char> &getPasswordHash() const;
private:
    std::string name;
    std::vector<unsigned char> passwordHash;
};

如果这个class'成员是const,它会为我的编译器提供任何重要的优化可能性吗?考虑到其他类通常会聚合非常量的User对象,但我的几乎所有算法都会接受const User &

那么,相对于现有的const User &心态,const成员是否提供了任何重要的优化机会?它是否有理由使用const User *聚合并在更改时重建对象,而不是使用赋值运算符?

谢谢你的简短评论!

在SO和HERE 上查看它

首先,关于词汇表的一个注释:根据定义,实体对象具有身份,因此不支持分配。我想你的意思是值对象。

否则:我通常发现在制作数据方面没有什么优势成员常量。正如你所注意到的,这样做会使任务变得不可能,这意味着它们不能是值类型的常量。对于实体对象,这些对象无法分配,在制作中有一些价值不可变成员(例如标识符)常量,但由于所有访问都在您控制的一小段代码,其值要小得多与公共接口中的CCD_ 10相比。

另一种可能性是为这样的成员定义不可变的类型。它是将CCD_ 11定义为CCD_将其定义为std::stringIdentifier,即使它包含只有一个类型为std::string的数据成员会限制您(这也将有助于改变代表权稍后标识符的。)