不在 class 中定义静态数组大小不好吗?——而是让它自动调整大小

Is it bad to not define a static array size in a class?--but rather to let it autosize

例如: 这是可以接受的吗?它编译并且似乎对我有用;那么这种形式不好吗?

.h 文件

class MyClass
{
  static char c[];
};

.cpp 文件

char MyClass::c[] = "abcde";

或者我必须这样做吗?

.h 文件

class MyClass
{
  static char c[10];
};

.cpp 文件

char MyClass::c[10] = "abcde";

一种技术比另一种技术有优势吗?我不确定我是否遗漏了什么。我不知道我不知道什么,你知道吗?

更新:

我发布的原始代码如下所示。我对其进行了编辑,使其如上所示,因为我并不是要讨论它的“私人”方面。在我的真实代码中(Arduino 上的 运行),我使用的是 .h 和 .cpp 文件,静态成员仅供 class 访问。 我想我也在学习一些新东西,因为关于下面代码的答案似乎告诉我私有静态成员与 public 静态成员相同,即:它们如果是静态的,两者都可以被 class 之外的任何东西修改。那个,我不知道。 错了,看answer by Alok Save here. More on static member variables here。这行对我特别有帮助:"因为静态成员变量不是单个对象的一部分,如果要将其初始化为非零值,则必须显式定义静态成员...此初始化程序应该放在 class 的代码文件中(例如 Something.cpp)。如果没有初始化行,C++ 会将值初始化为 0。“

class MyClass
{
  private:
  static char c[];
};

char MyClass::c[] = "abcde";

或者我必须这样做吗?

class MyClass
{
  private:
  static char c[10];
};

char MyClass::c[10] = "abcde";

私有变量只能在 class 范围内访问。当您将 private 不带 static 时,它是安全的,除了 class 之外,任何人都无法访问。在这种情况下,我认为任何人都可以更改此变量,在创建 class.because 时这是静态的。他应该只 crate new class ,他知道你的变量名,他可以改变它的值。

private 变量应该是私有的,并且该值不应该在没有内部 class 方法的情况下访问。请访问 OOP 概念。你可以得到更好的主意。访问 java 访问修饰符,你可以采取更好的想法。

你明白了,为什么我们要访问 modifiers.I 想想你,了解你的问题。

我认为这很糟糕。

考虑到成员是私有的,class 之外的任何东西都不能改变它。因此,不应使用任何一段代码。此外,我建议您使用标准库 std::valarraystd::vector 作为数值和对象数据的标准库,而不是在 C++ 中使用 C 风格的数组。 std::string 用于文本数据。

您可以在他们的文档中阅读更多关于他们的信息。

以你的例子为例:

class Object {
private:
    static int value[] = nullptr;

public:
   inline void setValue(int* newValue) {
        value = newValue;
    }
   inline int getValue() {
        return value;
    }
}

Object first{};
int a[10] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
first.setValue(a)
std::cout << first.getValue(); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Object second{};

int b[1] = [1];
first.setValue(b)
std::cout << second.getValue(); // [1]

问题似乎是关于是否显式写入数组的大小,而不是从赋值中推断出来。考虑一下:

如果需要更改数组初始化的字符串值怎么办?如果您明确定义大小,则需要在 3 个地方进行更改。首先在 class 定义中,其次在静态变量赋值中。第三,您还将最终更改分配的字符串的值。 Not 显式写入数组大小允许您仅在一个地方进行更改。此外,它消除了忘记在字符串末尾为空终止符添加 1 的可能性。

显然,这简化了未来的代码更改,并且不会牺牲代码的清晰度。

如果我错了请纠正我,但这是最能澄清我的困惑的答案。参考代码注释,标记为//<--。这些就是我的答案。这是正确的吗?

.h 文件

class MyClass
{
  static char c[]; //<--this allocates memory for a pointer, 
                   //and makes it a null pointer since it doesn't
                   //point anywhere yet
};

.cpp 文件

char MyClass::c[] = "abcde"; //<--this allocates 6 bytes 
  //(5 chars + null terminator) for the string, AND now 
  //sets the above pointer to point to the starting byte
  //of this newly allocated memory.