为什么 C++ 构造函数不能添加新的成员变量?

Bob*_*Bob 1 c++

如果您可以在构造函数中添加成员变量,对我来说会更直观。这样,类就可以适应不断变化的输入。

use*_*301 5

在 C++ 中,对象始终具有固定大小。如果构造函数可以在运行时添加成员,那么这种保证就会失效。此外,在 C++ 中,所有相同类型的对象都具有相同的大小。由于一个类可以有多个不同的构造函数,不同的构造函数可以指定不同的大小。

这种单一的、固定的大小是使许多 C++ 的高性能技巧发挥作用的神奇调味料,而在 C++ 中,便利性往往让位于速度。例如,对象数组实际上包含对象。不是对对象的引用,而是对对象的引用。它可以这样做,因为数组中的所有内容都具有相同的大小,并且编译器可以在编译时生成所有索引。CPU 喜欢这一点,因为访问是完全可预测的,并且可以充分利用缓存(假设您编写的访问模式允许这样做)。在编译时已知和修复的越多,编译器的优化机会就越多。

您可以做的是添加一个像 astd::mapstd::unordered_map将标识符映射到其数据的成员。如果所有数据都属于同一类型,这就像

std::map<std::string, int> members;
Run Code Online (Sandbox Code Playgroud)

和访问看起来像

members["hit points"] -= damage;
Run Code Online (Sandbox Code Playgroud)

请注意,虽然映射在对象内部,但这些映射变量不在对象“内部”,它们必须首先在映射中查找,然后需要从其驻留在动态内存中的任何位置加载数据。与在编译时已知的成员相比,这会大大减慢访问速度,并减少到与对象开头的偏移量,该内存位置可能已经与对象的其余部分一起加载到缓存中。