C++中的常量对象或私有/常量数据成员(变量)?

const object or private/const data members (variables) in C++?

本文关键字:常量 数据成员 变量 对象 C++      更新时间:2023-10-16

我们知道const对象成员一旦声明就无法修改,但它们的真正用途是什么?我们可以单独声明要在类内部const变量,也可以将它们声明private.

如果const 对象在C++中还有其他意义,那么也请提及。

从字面上回答您的问题:

如果将类的成员设为const,则适用于该类的每个实例,但仅适用于您const创建的成员。

如果将对象设为const,则适用于该类的单个实例,但它确实适用于该实例的所有成员。

在我看来,

>const是C++中最基本的科目之一。经常被忽视的东西。

通常const有三个用例:

  • 允许编译器更积极地进行优化
  • 允许编译器在我们意外尝试更改 const 值时指出我们的错误
  • 通过指定我们不希望更改对象来传达意图

对于类的 const 成员,我们强制在类实例化期间初始化对象。 防止我们在成员函数中意外更改其值。这是仅使用私有成员变量的最大区别。我们仍然可能意外地更改类内任何位置的私有成员变量。

使用const 最有用的方法之一是使用参数:

  • 这可以允许对编译器进行重大优化,原因超出了本答案的范围。
  • 对于 const 引用,编译器可以防止您意外更改该引用的值。
  • 最重要的是,它允许您以更清晰的方式定义函数的签名。

我很幸运地使用了一次(到目前为止(。而且我从没想过我需要在成员变量中使用const

class TypeA {
protected:
DataX const* m_data;        //get a pointer to a data that shouldn't be modified even inside the class.
public:
TypeA(DataX const* p){
m_data = p;
}
auto& getData(){ return *m_data; }   //will return DataX const&
}

对于private成员变量,我认为它们最适合当前类中的辅助变量,这些变量在逻辑上实际上不是对象的一部分。也许用于缓存,临时保存一些应该存在一段时间的数据,算法的计数器等。并且它们仅在当前类中使用,并且应该在当前类中使用。您不希望其他程序员在派生类中使用它们,因为它们具有非常特殊的用途,因此您可以将它们隐藏在private中。

const成员的另一个示例是enums 之外的常量值。我更喜欢枚举而不是占用存储的变量,但一些程序员更喜欢遵循他们过去的东西,但你说服他们不要这样做(也许我错了,他们真的是正确的,也许将来由于某种原因,语言中的const改变了,然后使用const可能会更好。

class TypeA {
public:
const int HEY_VALUE = 101;
const int YOH_VALUE = 102;
const int HELP_VALUE = 911;
const float MIN_SOMETHING = 0.01;
static const int HELLO_EARTH = 10;
//...
}

我找不到我的这个特定代码,但我想我用了&而不是const*.我是这样用的。

class TypeA {
protected:
DataX& m_data;        
public:
TypeA(DataX& p):m_data(p){   //you can only set this once in the constructor
}
auto& getData(){ return m_data; }   //will return DataX const&
}

出于个人原因,我真的很喜欢使用.而不是->,所以我真的推动自己实现我想要的语法,我带来了这些奇怪的解决方案。这很有趣,因为我发现这些奇怪的方法在 c++ 中仍然有效且可以实现。


更新

如果 const 对象在C++中还有其他意义,那么也请提及。

也许您可以在类的特定部分const一些填充字节。

class TypeA {
protected:
const int HEADER_BYTES = 0x00616263;
int m_data1;
int m_data2;
const uint8_t ANOTHER_FILLER_FOR_SOME_REASON = 0xffffffff; //maybe forcing offset address, or alignment, etc.
int m_anotherData;
}

通常,const关键字用于提高您正在编写的代码的可读性。

但是,在某些情况下,const也可以允许编译器优化。让我们看看下面的代码片段:

int const i = 1;
fun(&i);
printf("%dn", i);

在这里,尝试修改变量i会导致未定义的行为。因此,编译器将假定甚至不会尝试修改,因此它将值1传递给printf函数。

对于常量数据成员也是如此。