【发布时间】:2013-10-23 06:58:54
【问题描述】:
假设我有一个class A 并且有声明:
A a1(1);
A a2; a2(1);
这两种说法有什么区别?
我知道第一个陈述很简单,但是陈述 2 旁边发生了什么?
【问题讨论】:
-
希望你不是说
A a2 : a2(1);
标签: c++ class object constructor operator-overloading
假设我有一个class A 并且有声明:
A a1(1);
A a2; a2(1);
这两种说法有什么区别?
我知道第一个陈述很简单,但是陈述 2 旁边发生了什么?
【问题讨论】:
A a2 : a2(1);
标签: c++ class object constructor operator-overloading
A a1(1);
这通过调用带有参数1 的构造函数来创建类A 的实例a1。
A a2; a2(1);
这实际上是两个陈述。第一个 A a2; 通过调用 A 的默认构造函数创建类 A 的实例 a2。第二个,a2(1);,然后使用参数1 调用A::operator()(或在A 未定义operator() 的情况下产生错误)。
【讨论】:
不同的是,对于大多数类型,第二个不会编译。
第一个声明一个变量并用值1初始化它。从这样的值初始化称为直接初始化。
第二个声明一个变量并默认初始化它;然后它会尝试像函数一样调用它,该函数仅在它具有operator() 的合适重载时才有效。在这种情况下,它会执行定义该运算符的任何操作。
也许你的意思是:
A a2; a2 = 1;
默认初始化变量,然后赋值1。对于普通类型,这将与第一个具有相同的效果。对于定义构造函数和赋值运算符的类型,这将取决于它们是如何定义的。
【讨论】:
构造函数是在创建对象期间调用的特殊函数。因此,根据您的代码,第一个语句会编译,因为它有一个匹配的构造函数。但是第二个语句不会创建任何实例,因为您已经为它提供了实现。
*class Shape
{
private:
int cm;
public:
// Shape()
// {
// }
// Shape(int m_cm)
// {
// cm=m_cm;
// }
};*
上面的代码可以创建一个实例,但它不能像初始化值一样 s(7).
【讨论】: