首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否为数组/向量插入调用赋值运算符或复制构造函数?

是否为数组/向量插入调用赋值运算符或复制构造函数?
EN

Stack Overflow用户
提问于 2018-10-25 03:04:53
回答 1查看 970关注 0票数 2

语言: C++

我的问题是,在以下情况下是否调用复制构造函数或赋值运算符。在此之前,我了解以下内容:

代码语言:javascript
复制
MyClass a(3);      // single param constructor
MyClass b(a);      // copy constructor invoked
MyClass c = b;     // copy constructor invoked
MyClass d;         // default constructor
d = c;             // assignment operator invoked

然而,我希望有人能给出一个类似的分类:

1)对于第2-3行,是否调用了赋值运算符或复制构造函数?

代码语言:javascript
复制
MyClass arr[10];
arr[2] = a;
arr[5] = MyClass(1);

2)构造函数,然后复制构造函数?或者构造函数,然后是赋值运算符?

代码语言:javascript
复制
MyClass arr2[] = {MyClass(), MyClass(9)};

3)假设向量v的内部表示有多个对象的空间,是否使用赋值运算符或复制构造函数复制新元素?

代码语言:javascript
复制
std::vector<MyClass> v;
v.push_back(MyClass(2));
...
...

4)假设向量v的内部表示超出空间,必须重新分配空间,旧元素是否使用赋值运算符或复制构造函数复制?

代码语言:javascript
复制
v.push_back(MyClass(2)); // Assuming vector is out of space; must realloc
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-25 03:27:29

当你有了

代码语言:javascript
复制
type variable_name = some_value

然后你声明了一个变量,并且总是调用它的构造函数(如果它有构造函数的话)。这称为复制初始化,这永远不会被赋值

因此,在

代码语言:javascript
复制
MyClass arr[10];      // 1
arr[2] = a;           // 2
arr[5] = MyClass(1);  // 3

第1行创建了一个包含10个MyClass的数组,并缺省地构造了每一个。第2行和第3行是赋值。

在……里面

代码语言:javascript
复制
MyClass arr2[] = {MyClass(), MyClass(9)};

您可以初始化一个包含2个对象的数组,使用*braced init-list`中的值作为数组成员的初始化器。管理list initialization的规则很多,但它们有一个共同点,那就是不会发生赋值,只会进行构造函数调用。

使用

代码语言:javascript
复制
std::vector<MyClass> v;
v.push_back(MyClass(2));

假设向量没有重新分配,您有一个构造函数调用MyClass(2),然后从临时对象复制构造向量中的元素。如果向量必须增长,那么所有当前元素都被复制/移动构造到一个新的缓冲区,然后临时元素被复制到最后构造。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52976257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档