【 在 foliver (Oliver) 的大作中提到: 】
: 标 题: Re: 没搞明白 {} 初始化
: 发信站: 水木社区 (Tue Jul 27 20:58:26 2021), 站内
:
:
: 扯的越来越远了,回到楼主的问题
:
: 对于成员变量来说:
: 小括号调用构造函数创造实例,这在声明时是不允许的。可以改成A():str("abc")。
: 花括号等同于成员变量默认值初始化。string atr{"abc"}等同于string str="abc"。
:
: 下面具体的解释
: 小括号匹配对应的构造函数并调用。对于基本类型则强制类型转换,怎么实现的不管。对于类类型,则调用构造函数。
:
: 花括号初始化则相当复杂,重新看了下C++标准,C++11,17,20等都不同(参考List initialization和Aggregate initialization,
https://en.cppreference.com/w/cpp/language/aggregate_initialization),很多大牛的参考书也有错误。简单概括下如下:
: (1)如果该类没有提供构造函数,则按照成员变量顺序一一赋值,否则
说了,这个叫做集合初始化。这个要求是很多的,比如你这个类的成员不能是私有的或者保护的,不能有虚函数等等。基本就是说你这个成员必须是一个struct,或者array
: (2)查找并调用std::initializer_list为参数的构造函数,否则
: (3)去掉最外层的花括号,调用对应的普通构造函数。否则
这两个都是构造函数,这个是最常见的情况。initializer_list构造函数优先
: (4)错误。
:
:
: 【 在 here080 的大作中提到: 】
: : 这个不叫构造函数。这些都是类型转换。
: : 说这个没有意义。你直接定义一个类验证一下不就知道了?
: :
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 140.206.195.*]
--
FROM 76.126.252.*