class A{
private:
double re, im;
public:
A(){}
A(double r, double i) : re{r}, im{i} {}
double real() { return re; }
};
int main(){
A a(1, 2);
A c(a); // 这一句
cout << c.real();
A d();
cout << d.real(); // error: request for member 'real' in 'd', which is of non-class type 'A()'
A e{};
cout << e.real(); // 随机的一个 double 数
}
为什么我没有定义用一个对象去初始化另一个对象的构造器, A c(a) 还是可以呢?
另外,想问一下 () 和 {} 有什么区别呢?
{} 用来初始化,() 就是用来传参嘛?
为什么 d 和 e 行为不一样呢?
A c(a)
会调用A::A(const A&)
,是 A 的拷贝构造函数,它与控构造函数一样,如果不自定义,编译器会自动生成一个。使用花括号来初始化对象是 C++11 的标准:
std::initializer_list
来捕获这个列表。http://zh.cppreference.com/w/...
例一,基本类型可以直接填充:
int a{10}
。例二,
std::array
是一个结构体,内部是原生数组,也可以自动填充:std::array<int, 3> f3{1, 2, 3};
。例三,
std::vector
实现了std::initializer_list
构造:std::vector<int> v{10, 3}
(得到长 2 的 vector,v[0] 是 10,v[1] 是 3)。std::vector<std::string> v{10, "hello"}
,会得到长度是 10 的 vector。因为与上面的例三对比,它匹配vector(std::initializer_list<T>, const Allocator& alloc = Allocator())
失败了。http://zh.cppreference.com/w/...
A a()
的作用往往出人意料,它不是用空参数构造器构造一个A
类型的对象,而是声明一个返回类型是A
,函数名是a
,并且函数参数列表空的函数;期待的空参数构造方式应该是A a
。11 标准选取了A a{}
,其作用与A a
无异。