关于 cpp 成员初始化列表,冒号后的 var()和 var{}的区别到底是什么呢?

2021-04-03 19:43:39 +08:00
 misakawaque
我个人理解里 var ( svar )中代表成员变量 var 赋成员变量 svar 值,如果 svar 和变量 var 同名,则代表 svar 是形参赋值给成员变量
而 var{svar}代表 svar 是形参赋值给成员变量 var
那么下列程序的输出应该是 1 1 2 1
但事实上输出为 1 2 2 2
这是为什么呢

class task1 {
public:
int a, n, p, q;
task1(int a, int n) :a(a), n(a), p{ n }, q(n) {
cout << a << " " << n << " " << p << " " << q << endl;
}

};
void main() {
task1 t1 = task1(1, 2);

}
1124 次点击
所在节点    问与答
4 条回复
yujincheng08
2021-04-03 20:01:47 +08:00
用 {} 的话,在有接收 initializer_list 的构造函数时候有区别。
另外就是 return 时候可以用 {} 当场后续一个对象。
misakawaque
2021-04-03 20:24:47 +08:00
@yujincheng08 大佬能举个例子么,不太明白
接收有初始化列表的构造函数是指继承父类么
还有 return 后续对象是什么意思呢?
page4aq
2021-04-04 14:10:29 +08:00
和 (), {} 没关系。

int a, n, p, q;
task1(int a, int n) :a(a), n(a), p{ n }, q(n)

构造函数参数和类成员变量重名。一般不会这么定义。
yujincheng08
2021-04-05 16:07:51 +08:00
@misakawaque
```cpp
#include <initializer_list>
#include <iostream>

struct Test {
template <typename T> Test(const std::initializer_list<T> &) {
std::cout << "ctor w/ initializer_list" << std::endl;
}
template<typename ...T> Test(T&&...) {
std::cout << "ctor w/o initializer_list" << std::endl;
}
};

Test test() {
return {1,2,3,4};
}

int main() {
Test x{1,2,3,4};
Test y(1,2,3,4);
auto z = test();
return 0;
}
```

Output:
```
ctor w/ initializer_list
ctor w/o initializer_list
ctor w/ initializer_list
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767831

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX