C++ 中的构造函数为什么没有返回值
2018-10-08 本文已影响55人
顽强的猫尾草
今天在写一个类的时候,突然发现为什么类内的构造函数没有返回值呢?是没必要还是有别的什么原因,以前就只是那样写了从来没有往深想过...
以一个简单的类为例:
class Text {
public:
Text(): x(0) {} // 无参构造函数
Text(int i): x(i) {} // 带参构造函数
private:
int x;
};
这两种构造函数的使用示例:
int main() {
Text a(); // (1) 调用无参构造函数
Text b = Text(); // (2) 调用无参构造函数
Text c(3); // (3) 调用无参构造函数
Text d = Text(3); // (4) 调用无参构造函数
return 0;
}
如果构造函数可以有返回值,比如 int:
int C(): x(0) {
return 1; // 1 表示构造成功, 0 表示失败
}
那么实例中的代码会发生什么事呢?(1)(3) 不会有影响,(2)(4) 就会有歧义。
以 (2) 为例,Text()
调用了无参数构造函数,该构造函数返回 int 值 1。Text 类内还有一个带参构造函数 Text(int i)
,于是混乱来了。按照 C++ 原本的规定,Text b = Text();
这句话是用默认构造函数创建一个临时对象,并用这个临时对象初始化 b。此时,b.x 的值应该是 0。但是,如果 Text::Text()
有返回值,并且返回了 1(表示成功),则 C++ 会用 1 去初始化 b,即调用带参构造函数 Text::Text(int i)
。得到的 c.x 便会是 1。于是,语义产生了歧义。
构造函数的调用之所以不设返回值,是因为构造函数的特殊性决定的。从基本语义角度来讲,构造函数返回的应当是所构造的对象。否则,我们将无法使用临时对象:
void f(int a) {...} // (1)
void f(const Text& a) {...} // (2)
f(Text()); // (3) 究竟调用谁?