C语⾔构造函数不返回值,标题:构造函数为什么不返回类型标题:构造函数为什么不返回类型
我们知道,C++中的构造函数是没有返回值的。构造函数是⼀种很特殊的函数,因为他没有返回值。这和‘返回值为void’有极⼤的差别。返回void时,⼀般函数并不返回任何东西,但是⼀般的函数能够选择是否要返回些什么东西。构造函数则绝对不返回任何东西,⽽且你也没有任何选择。如果它有⼀个返回值,⽽且你有权利选择你⾃⼰的返回型别(returntype),编译器势必得通过某种⽅式来知道如何处理那个返回值。
在《think in c++》⾥有这么⼀段解释C++构造函数为什么没有提供返回值的理由:
Both the constructor and destructor are very unusual types of
functions: they have no return value. This is distinctly different from a void
return value, in which the function returns nothing but you still have the
option to make it something else. Constructors and destructors return nothing
and you don’t have an option. The acts of bringing an object into and out of the
program are special, like birth and death, and the compiler always makes the
function calls itself, to make sure they happen. If there were a return value,
and if you could select your own, the compiler would somehow have to know what
to do with the return value, or the client programmer would have to explicitly
call constructors and destructors, which would eliminate their safety.
上⾯的英语说明简单来说就是如果有返回值,就代表着有选择权,即使返回是void。编译器调⽤构造函数只是确定它发⽣,如果有返回值的话编译器就不得不知道针对返回值该怎么去做,程序员也可以随意调构造函数了,这样会威胁到程序的安全。
通过C++中临时对象的使⽤情况可以看出,构造函数返回的应当是所构造的对象。
⽐如有如下2个重载的函数:
void func(int a) {...} //(1)
void func(const A& a) {...} //(2)
那么,对于下⾯的调⽤:
func(A()); //(3),究竟调⽤谁?
对于(3),我们希望调⽤的是(2),但如果构造函数⽀持返回值,⽐如A::A()有int类型的返回值,那么究竟是调(1)好呢,还是调⽤(2)好呢。于是,我们的重载体系,乃⾄整个的C++的语法体系都⾯临⼆义性问题。
c语言编译器怎么用不了这⾥的核⼼是表达式的类型。⽬前,表达式A()的类型是类A。但如果A::A()有返回类型R,那么表达式A()的类型应当是R,⽽不是A,于是便会引发上述的类型问题。
为什么构造函数不能使⽤virtual关键字修饰?
构造函数⽤来创建⼀个新的对象,⽽虚函数的运⾏是建⽴在对象的基础上(请参见:多态与虚函数),在构造函数执⾏时,对象尚未形成,所以不能将构造函数定义为虚函数。
通常析构函数才会⽤virtual修饰
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论