创建对象时 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.dataa.data 都指向同一内存区域。它们不是“副本”,因此当 ac 超出范围时,分配的内存将被释放两次(程序崩溃)。 您需要定义一个正确的复制赋值运算符 Vect::operator=.

其他要点:

  • Do not use using namespace std