美文网首页CPP
C++ 中的构造函数为什么没有返回值

C++ 中的构造函数为什么没有返回值

作者: 顽强的猫尾草 | 来源:发表于2018-10-08 20:47 被阅读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) 究竟调用谁?

相关文章

  • C++ 中的构造函数为什么没有返回值

    今天在写一个类的时候,突然发现为什么类内的构造函数没有返回值呢?是没必要还是有别的什么原因,以前就只是那样写了从来...

  • C++ 构造过程

    构造函数 C++中每个类必须有一个构造函数,如果用户没有自行编写构造函数,则C++会自动提供一个无参数的构造函数,...

  • Swift小tips

    便利构造函数:1>convenience开头,没有返回值 2>在构造函数中必须明确调用一个设计的构造函数(self...

  • 初始化和清理

    构造函数 构造函数名称和class名称相同。构造函数是一种很独特的函数,因为它没有返回值。这和“返回值为void”...

  • JS——new与return

    默认情况下,函数的返回值为undefined(即没有定义返回值)。但是构造函数比较例外,new构造函数在没有ret...

  • 4.2C++虚析构函数

    为什么构造函数不能声明虚函数 在C++中,构造函数用于在创建对象时进行初始化工作,不能声明为虚函数。因为在执行构造...

  • C/C++ 返回值、参数列表、缺省等区别

    一、返回值 C中:如果函数未指定返回值类型,则默认为int C++中:如果一个函数没有返回值,返回值类型必须指定为...

  • [C++之旅] 10 构造函数

    [C++之旅] 10 构造函数 构造函数的特点 构造函数在对象实例化时被自动调用 构造函数与类同名 构造函数没有返...

  • C++ tip5 构造函数和析构函数

    构造函数: 在对象实例化的时候被自动调用。 构造函数与类同名构造函数没有返回值。构造函数可以进行重载。实例化对象时...

  • C++中的二阶构造模式

    构造函数回顾 关于构造函数的回顾类的构造函数用于对象的初始化构造函数与类同名并且没有返回值构造函数在对象定义时自动...

网友评论

    本文标题:C++ 中的构造函数为什么没有返回值

    本文链接:https://www.haomeiwen.com/subject/hsajaftx.html