gpt4 book ai didi

c++ - 指定构造函数时的不同行为列表初始化

转载 作者:行者123 更新时间:2023-12-01 22:47:26 24 4
gpt4 key购买 nike

例如,我有这样的代码:

class A {
public:
int x;

A() {
std::cout << "Constructor Called !" << std::endl;
}
A(int y):x(y) {
std::cout << "Constructor Param Called !" << std::endl;
}

A(const A& copy) {
std::cout << "Copy Constructor Called !" << std::endl;
}
}

class B {
public:
A value;
//B(const A& val) : value(val){}
}

int main(){
B b { A(22)};
}

如果我注释掉 B 构造函数,输出只是“Constructor Param Called”,但如果我取消注释 B 构造函数,输出将是“Constructor Param Called”和“Copy Constructor Called”。我的问题:

  1. 如果我注释掉构造函数,为什么输出会不同? (我读过聚合类和聚合初始化,是吗?)
  2. aggregate initialization 之间有什么区别? & direct initialization

最佳答案

当您删除 B 的用户提供的构造函数时,B 变成一个聚合。因此,在类的每个元素都是从初始化列表的元素复制初始化的情况下执行聚合初始化。由于 A(22) 是与 B 的元素属于同一类的纯右值,因此复制省略发生在将值直接存储到对象中而无需调用任何复制构造函数。这是 C++17 的新内容。

当您为 B 声明构造函数时,它不再是聚合,因此在您进行初始化时会考虑构造函数。

直接初始化只是意味着在初始化对象时没有= 符号。聚合初始化是在您初始化聚合时发生的事情,您可以查看 definition关于 cppreference。

关于c++ - 指定构造函数时的不同行为列表初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74997941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com