C++中的构造函数为什么没有返回值
2008-03-10 21:00
225 查看
class C
{
public:
C() : x(0) {} //无参构造函数
C( int i ) : x(i) {} //带参构造函数
private:
int x
};
如果C的构造函数可以有返回值,比如int:
int C():x(0) { return 1; //1表示构造成功,0表示失败}
那么下列代码会发生什么事呢?
C c=C(); //此时c.x==1!
很明显,C()调用了C的无参数构造函数。该构造函数返回int值1。恰好C有一个但参数构造函数C(int i)。于是,混乱来了。按照C++的规定,C c=C();是用默认构造函数创建一个临时对象,并用这个临时对象初始化c。此时,c.x的值应该是0。但是,如果C::C()有返回值,并且返回了1(为了表示成功),则C++会用1去初始化c,即调用但参数构造函数C::C(int i)。得到的c.x_便会是1。于是,语义产生了歧义。使得C++原本已经非常复杂的语法,进一步混乱不堪。
构造函数的调用之所以不设返回值,是因为构造函数的特殊性决定的。从基本语义角度来讲,构造函数返回的应当是所构造的对象。否则,我们将无法使用临时对象:
void f( int a ) {...} //(1)
void f( const C& a ) {...} //(2)
f(C()); //(3),究竟调用谁?
对于(3),我们希望调用的是(2),但如果C::C()有int类型的返回值,那么究竟是调(1)好呢,还是调用(2)好呢。于是,我们的重载体系,乃至整个的语法体系都会崩溃。
这里的核心是表达式的类型。目前,表达式C()的类型是类C。但如果C::C()有返回类型R,那么表达式C()的类型应当是R,而不是C,于是便会引发上述的类型问题。
{
public:
C() : x(0) {} //无参构造函数
C( int i ) : x(i) {} //带参构造函数
private:
int x
};
如果C的构造函数可以有返回值,比如int:
int C():x(0) { return 1; //1表示构造成功,0表示失败}
那么下列代码会发生什么事呢?
C c=C(); //此时c.x==1!
很明显,C()调用了C的无参数构造函数。该构造函数返回int值1。恰好C有一个但参数构造函数C(int i)。于是,混乱来了。按照C++的规定,C c=C();是用默认构造函数创建一个临时对象,并用这个临时对象初始化c。此时,c.x的值应该是0。但是,如果C::C()有返回值,并且返回了1(为了表示成功),则C++会用1去初始化c,即调用但参数构造函数C::C(int i)。得到的c.x_便会是1。于是,语义产生了歧义。使得C++原本已经非常复杂的语法,进一步混乱不堪。
构造函数的调用之所以不设返回值,是因为构造函数的特殊性决定的。从基本语义角度来讲,构造函数返回的应当是所构造的对象。否则,我们将无法使用临时对象:
void f( int a ) {...} //(1)
void f( const C& a ) {...} //(2)
f(C()); //(3),究竟调用谁?
对于(3),我们希望调用的是(2),但如果C::C()有int类型的返回值,那么究竟是调(1)好呢,还是调用(2)好呢。于是,我们的重载体系,乃至整个的语法体系都会崩溃。
这里的核心是表达式的类型。目前,表达式C()的类型是类C。但如果C::C()有返回类型R,那么表达式C()的类型应当是R,而不是C,于是便会引发上述的类型问题。
相关文章推荐
- C++12.4.1 构造函数(与类名相同,没有返回类型)----有初始化列表的构造函数
- C++中的构造函数为什么没有返回值
- 构造函数为什么没有返回值
- c++的构造函数为什么不能是虚函数,而基类的析构函数必须是虚函数?
- Java为什么没有C/C++运行快
- 构造函数析构函数为什么没有返回值?
- c++中为什么不允许虚构造函数?
- 为什么C++没有内建支持多线程
- C++之构造函数为什么不能为虚函数
- (C++)error C2533: “CInitSock::{ctor}”: 构造函数不能有返回类型
- JAVA为什么没有C/C++运行速度快
- 为什么有虚析构函数,没有虚构造函数啊
- 在C++中,为什么构造函数不能有返回值?
- java的main函数为什么没有返回值
- c++赋值运算符为什么要返回引用?
- C++:类的语法错误 error c2533:constructors not allowed a return type(构造函数不允许返回一个类型)
- c++中有些重载运算符为什么要返回引用?
- C++(1):成员变量的访问、构造函数的返回
- C++初始化列表时,为什么不能直接在构造函数中输出
- C++中为什么构造函数不能是虚函数,析构函数是虚函数