CPP

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) 究竟调用谁?
上一篇 下一篇

猜你喜欢

热点阅读