C ++说我们不能从构造函数中返回任何内容?它背后的历史原因是什么? 为什么Bjarne不允许指导者返回与其他任何成员函数不同的东西?
答案 0 :(得分:4)
因为当在new
语句或变量初始值设定项中构造对象时,返回的对象是正在构造的新对象。对于从构造函数返回的对象,您会做什么?它无法在任何地方返回;它是被返回的构造对象。在调用构造函数之前已经(部分)创建了该对象(否则,构造函数将没有要处理的对象),并且它必须是从构造函数返回的内容,因此使用户没有意义通过尝试返回不同的东西来归还或让他们迷惑自己。
答案 1 :(得分:3)
我认为构造函数是返回自身,但不必有return
语句。
如果它自己返回,则它不能返回任何其他内容。
答案 2 :(得分:2)
我不能代表Bjarne,但是查看构造函数的惯用方法是返回它构造的对象。
答案 3 :(得分:2)
除了让构造函数返回某些东西会给构造函数做两件事而不只是一件事(这通常是一件不受欢迎的事情),请注意构造函数不能被命名,所以不可能明确地调用它们。
由于构造一个显式调用构造函数的表达式是不可能的,因此在任何情况下都不可能分配或引用构造函数的返回值。
尝试从构造函数返回某些东西根本不符合语言设计。
构造函数不“返回”对象,它们初始化调用它们的内存区域中的对象。如果声明具有静态存储持续时间的类类型的对象(并且该类型具有用户声明的构造函数),则为程序的生命周期保留内存,并且实现确保调用构造函数以在该位置初始化对象在该计划的适当时间。
类似地,如果使用自动存储持续时间声明和对象,则实现会保留空间(非正式地为某些堆栈空间),并在每次执行声明语句时调用构造函数。
对于新表达式,内存是动态分配的,实现调用相应的构造函数来初始化对象。
请注意,如果X
是类类型,则所有这些语句中的X
始终引用类型的名称,而不是实际上没有名称的构造函数。声明或定义构造函数的语法是特殊的,并不意味着构造函数具有名称。假设X
具有用户声明的构造函数。
X x; // Initialize an object of type X using the default constructor
X(); // Value initialize a temporary of type X. Not an explicit constructor call.
new X(); // new expression: value-initialize a dynamically allocated X
X(a); // A function style cast
X(a, b); // Construct an X from the expression list. X must have a
// suitable constructor but the X still refers to the type.
答案 4 :(得分:1)
构造函数只能生成对象本身......
答案 5 :(得分:0)
构造函数没有retunrn类型,因为它已经将refrence_id返回到refrence变量(被称为对象),例如: - Emp e1 = new Emp(refrence_id) 这里Emp是class_name e1是参考变量 new用于动态分配 Emp()是Emp类的构造函数 在此构造函数中,将refrence_id返回到refrence变量e1