C++ 对象内的数组
如果在arr之前定义了大小,则可以创建这样的数组C++ 对象内的数组,c++,arrays,object,C++,Arrays,Object,如果在arr之前定义了大小,则可以创建这样的数组 const int size = 5; int arr[size]; 但如果大小和arr位于对象或结构内部,则不可能: struct A{ A(int s) : size(s) {} const int size; int arr[size] }; A(5); 为什么会这样?这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时是已知的。如果在编译时之前不知道,则需要从堆中动态分配内存 int*arr=
const int size = 5;
int arr[size];
但如果大小和arr位于对象或结构内部,则不可能:
struct A{
A(int s) : size(s)
{}
const int size;
int arr[size]
};
A(5);
为什么会这样?这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时是已知的。如果在编译时之前不知道,则需要从堆中动态分配内存 int*arr=新的int[size] 如果不再需要内存,则应删除阵列 删除[]arr 正如Tony所说,最好使用standart图书馆向量 在这两种情况下,数组的大小在编译时是已知的 不,可以在运行时设置
const
类成员
事实上,即使是非成员也不总是有效的:
int x;
cin >> x;
const int y = x;
int z[y]; //ILLEGAL
只需使用一个按钮
这似乎有点不合逻辑,因为在这两种情况下,数组的大小在编译时是已知的
编译器无法区分您的示例和以下内容:
int i = std::rand(); // not a compile time constant
A a(i);
另一方面,它需要在编译时知道数组的大小。A
的两个实例的大小不能不同。因此,数组的大小不能依赖于运行时可以设置的内容
另一方面,C++11提供了,它允许您通过表达式传播编译时常量,并允许您使用这些来初始化数组。当编译器编译时,实际上不能保证它是编译时参数。正好是一个。我也可以这样做
int main() {
std::cin >> i;
A(i);
}
如果要向其传递constexpr参数,则需要使用模板。否则,您需要使用运行时容器,如std::vector。如果您想要动态调整大小的数组,您应该使用
std::vector
而不是原始数组
您不能在代码> >类<代码>或<代码>结构> /COD>内执行您的操作,因为您的代码>大小< /代码>成员没有定义值。因为在C++中,当初始化具有大小参数的C样式数组时,大小必须是编译时积分常数。 否则,编译器在编译时不知道变量的大小
如果您不喜欢这样,那么无论如何都应该使用
vector
。在第二种情况下,如果您只考虑编译时不知道类定义数组大小的话
如果允许创建这样的类,您可以编写
A(5);
A(6);
这将是不同大小的对象,这将破坏很多,例如,不可能将这些对象保持在同一个数组中。说这些对象具有不同的类型是合乎逻辑的,如果您将类模板和传递大小作为模板参数,这是可能的
如果要使用不同大小的数组,请使用std::vector或templates。在类/结构中不可能,因为
size
未初始化为值,这意味着您的数组可以有任何大小,这是无效的。改为使用std::vector
。我知道vector或template,我只是想知道,为什么在编译时知道(如果)大小就不可能。所以,编译器无法检测函数参数编译时间是否为常量?还是只有使用constexpr和c++11才能实现?那么,我的例子在构造函数中使用constexpr合法吗?是的。但如果在编译时已知,那么对于一个简单数组也是可能的。@Amomum是的,但在这些情况下不是。问题是,为什么如果常量在编译时已知,那么对于结构内部的数组是不可能的,但在“外部”是可能的?@Amomum是的,但在您的情况下,常量在编译时是未知的。如果它是“5”,怎么可能在编译时不知道呢?再说一遍,为什么编译器可以对一个简单数组区分“int i;int arr[i]”和“const int i=2;int arr[i]”,但对结构内部的数组却不能做到这一点?我没有说“总是知道”,只是在这两种情况下。@Amome OK,我改变了措辞。底线是,在c++11之前,您被卡住了,使用c++11您可以使用constexpr
。我看不出有什么区别。如果我不能用变量初始化常量,为什么结构中的常量应该不同?@amomem你可以用变量初始化常量。但是,当您声明一个类时,需要在声明时知道其大小或数组。size变量只在实例化时设置。但是如果我用变量初始化一个常量,我不能使用这个常量作为数组大小。若常数是编译时间常数,那个么我可以。关键是,如果数组在struct内部,我不能在两种情况下都这样做-这是不合逻辑的部分。有什么区别?