C++中的常量对象或私有/常量数据成员(变量)?
const object or private/const data members (variables) in C++?
我们知道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
成员的另一个示例是enum
s 之外的常量值。我更喜欢枚举而不是占用存储的变量,但一些程序员更喜欢遵循他们过去的东西,但你说服他们不要这样做(也许我错了,他们真的是正确的,也许将来由于某种原因,语言中的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
函数。
对于常量数据成员也是如此。
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++中的常量对象或私有/常量数据成员(变量)?
- 如何强制实施有关指针数据成员的常量正确性
- 现在允许重新定义 constexpr 静态数据成员吗?(但不是内联常量)?
- 错误 C2864:'element::next':只能在类 (STRUCT) 中初始化静态常量整数数据成员
- 我应该使用类内发起器初始化静态常量数据成员还是在其类外的定义中初始化静态常量数据成员
- 警告:ISO C++禁止将静态“constexpr char*”数据成员的字符串常量转换为“char*”
- 将非静态数据成员与常量成员进行比较
- 了解常量引用对非成本数据成员的分配
- 移动具有常量数据成员或引用成员的类的ctor
- 多个数据成员的常量初始化
- 将基元类型的数据成员作为常量引用返回
- C++中常量数据成员的用法
- 非静态常量数据成员的意义何在
- 在编码时在类中声明非静态常量数据成员是否合适?
- 将类的静态常量数据成员初始化为类
- When是一个非静态常量数据成员,比常量静态成员更有用
- 如何声明一个常量数据成员,但直到以后才初始化它
- 如何初始化常量数据成员
- 定义常量数据成员