【发布时间】:2020-07-28 15:30:34
【问题描述】:
有这个课程:
class A
{
int number;
int number2;
public:
A(int _number):number(_number),number2(0)
{
cout<<"Normal constructor\n";
}
A()
{
cout<<"Default constructor\n";
}
A(const A& source)
{
number = source.number;
number2 = source.number2;
cout<<"Copy constructor\n";
}
A & operator=(const A& source)
{
number = source.number;
number2 = source.number2;
cout<<"Assignment operator\n";
return *this;
}
};
如果vector<A> obj {1,2,3}被创建,normal constructor被调用3次,因为它没有被声明为explicit,因此它被用作converting constructor。然后copy constructor被调用了3次。
- 是否可以在跳过复制操作时声明和实例化
vector?
如果执行vector<A> obj_1;,则会创建一个可以容纳A 类型对象的空向量——没有调用构造函数,但对象存在。 p>
- 为什么没有调用构造函数?
- 我是否声明了对象完全可以使用?
来自this link:
复制构造函数用于从其他对象的数据初始化以前未初始化的对象。
赋值运算符用于将先前初始化的对象的数据替换为其他对象的数据。
执行obj_1 = obj,如果我的 obj_1 先前已初始化,会导致在我的类 A 中调用 copy constructor 而不是 operator= 函数,正如我所期望的那样?
另外,在vector 内部已经有一个operator= 函数。我怎么知道每个人什么时候被调用?
vector<A> obj {1,2,3};
vector<A> obj_1;
obj_1 = obj; // Why copy constructor called instead of function operator= inside my class
【问题讨论】:
-
vector<A> obj_1;是一个空向量。这就是没有构造函数调用的原因。 -
如何声明一个空的东西?当我声明
int a时,a为空但有数据 -
因为向量使用动态分配。基本上你所拥有的是一个
A*的包装器。如果您使用A* foo;,您将拥有A*,但没有创建A。 -
@JesperJuhl 你想告诉我什么?我应该选择初始化列表吗?
-
@CătălinaSîrbu 查看我的更新评论。