创建对象时 int 变量的默认大小?
Default size of an int variable, when an object is created?
class Vect {
public:
Vect(int n);
~Vect();
Vect(const Vect& original);
private:
int* data;
int size;
};
Vect::Vect(int n) {
size = n;
data = new int[n];
}
Vect::~Vect() {
delete [] data;
}
Vect::Vect(const Vect& original) {
size = original.size;
data = new int[size];
for (int i = 0; i < size; ++i) {
data[i] = original.data[i];
}
}
#include <bits/stdc++.h>
using namespace std;
int main(void) {
Vect a(100);
Vect b = a;
Vect c;
c = a;
return 0;
}
我现在有一个 Vect class,在 main 中我创建了一个变量 c 保存的 Vect 对象,c.size 的默认大小是多少?
或者它不会有任何默认值?
如果它没有默认值,那么 b 怎么会有 100(如 a.size 现在等于 b.size)?
What will be the default size of c.size
??
除非您提供默认值,否则没有默认值。如果你想覆盖它,你应该有一个默认构造函数(否则使用未初始化的变量是未定义的行为)。
例如:
Vect::Vect() : data(nullptr), size(0)
{}
If it does not have a default value then how does b
have 100
?
其实写Vect b = a;
就相当于Vect b(a);
。换句话说,调用了复制构造函数(这是复制初始化)。
然而,当你写:
Vect c;
c = a;
这是一个复制作业。而且您没有提供一个问题,因为您需要处理 data
成员的动态分配(防止自我分配,如果不是 nullptr
则解除分配,然后使用新内容重新分配),等...
您应该为 Vect
class 定义 operator=()
以使您的程序格式正确。
回答您的问题:Vect::size
没有默认值,除非您在 class 声明中提供默认值,例如
int size = 0;
如果您不初始化 Vect::size
,您将招致 undefined behavior。
此外,这段代码有很多问题,实际上它无法编译。
基本问题:
没有Vect
的无参构造函数,也没有隐式声明default constructor因为你定义了Vect::Vect(int n)
。因此行 Vect c;
无法编译。
代码c = a
不会调用你的拷贝构造函数Vect::Vect(const Vect& original)
,因为变量c
已经存在(假设你已经解决了上面的问题)。相反,它会调用隐式定义的 copy assignment operator,您尚未明确定义它。然而,这只是复制成员变量,因此它没有“正确”的逻辑,因为在这样的复制之后,c.data
和 a.data
都指向同一内存区域。它们不是“副本”,因此当 a
和 c
超出范围时,分配的内存将被释放两次(程序崩溃)。
您需要定义一个正确的复制赋值运算符 Vect::operator=
.
其他要点:
Do not use using namespace std
class Vect {
public:
Vect(int n);
~Vect();
Vect(const Vect& original);
private:
int* data;
int size;
};
Vect::Vect(int n) {
size = n;
data = new int[n];
}
Vect::~Vect() {
delete [] data;
}
Vect::Vect(const Vect& original) {
size = original.size;
data = new int[size];
for (int i = 0; i < size; ++i) {
data[i] = original.data[i];
}
}
#include <bits/stdc++.h>
using namespace std;
int main(void) {
Vect a(100);
Vect b = a;
Vect c;
c = a;
return 0;
}
我现在有一个 Vect class,在 main 中我创建了一个变量 c 保存的 Vect 对象,c.size 的默认大小是多少? 或者它不会有任何默认值? 如果它没有默认值,那么 b 怎么会有 100(如 a.size 现在等于 b.size)?
What will be the default size of
c.size
??
除非您提供默认值,否则没有默认值。如果你想覆盖它,你应该有一个默认构造函数(否则使用未初始化的变量是未定义的行为)。
例如:
Vect::Vect() : data(nullptr), size(0)
{}
If it does not have a default value then how does
b
have100
?
其实写Vect b = a;
就相当于Vect b(a);
。换句话说,调用了复制构造函数(这是复制初始化)。
然而,当你写:
Vect c;
c = a;
这是一个复制作业。而且您没有提供一个问题,因为您需要处理 data
成员的动态分配(防止自我分配,如果不是 nullptr
则解除分配,然后使用新内容重新分配),等...
您应该为 Vect
class 定义 operator=()
以使您的程序格式正确。
回答您的问题:Vect::size
没有默认值,除非您在 class 声明中提供默认值,例如
int size = 0;
如果您不初始化 Vect::size
,您将招致 undefined behavior。
此外,这段代码有很多问题,实际上它无法编译。
基本问题:
没有
Vect
的无参构造函数,也没有隐式声明default constructor因为你定义了Vect::Vect(int n)
。因此行Vect c;
无法编译。代码
c = a
不会调用你的拷贝构造函数Vect::Vect(const Vect& original)
,因为变量c
已经存在(假设你已经解决了上面的问题)。相反,它会调用隐式定义的 copy assignment operator,您尚未明确定义它。然而,这只是复制成员变量,因此它没有“正确”的逻辑,因为在这样的复制之后,c.data
和a.data
都指向同一内存区域。它们不是“副本”,因此当a
和c
超出范围时,分配的内存将被释放两次(程序崩溃)。 您需要定义一个正确的复制赋值运算符Vect::operator=
.
其他要点:
Do not use
using namespace std