为什么此处C0 obj=3;是对的

来源:百度知道 编辑:UC知道 时间:2024/05/25 14:57:44
#include<iostream.h>
class C0
{
/********found********/
int m,n
/********found********/
public
/********found********/
C0(int p,int q)
{
m =p;
n =q;
}
void print()
{
cout<<"m="<<m<<" n="<<n;
cout<<endl;
}
};
void main()
{
C0 obj=3;
obj.print();
}
为什么此处C0 obj=3;是对的
而这个程序:
#include<iostream.h>
class C0
{
/********found********/
int const n, m;
public:
explicit C0(int t)
/********found********/
: n=t
{
m =0;
}

void Set(int y)
{
m = y;
}
void print()
{
cout<<"m="<<m<<" n="<<n;
cout<<endl;
}
};
void main()
{
/********found********/
C0 obj=3;
obj.Set(2);
obj.print();

貌似你的C0 obj=3并不成立,也就是说,即使C0定义成你上面的那个C0的模样,C0 obj=3;也不会编译通过。这样的赋值方法要求一个类型转换构造函数,也就是要求一个C0(int a);这样的函数构造,而你贴出的代码并没有提供这样的构造函数,所以这两个C0的定义都不会使C0 obj=3;编译通过的。
如果C0的类写成这样:
class C0
{
/********found********/
int m,n
/********found********/
public
/********found********/
C0(int p,int q=0)
{
m =p;
n =q;
}
void print()
{
cout<<"m="<<m<<" n="<<n;
cout<<endl;
}
};
倒可以编译通过。

当编译器遇到形如C0 obj = 3;这样的语句时,会发生一个隐式的类型转换,这个类型转换的前提条件就是,需要一个可以提供转换的构造函数,就像
C0::C0(int p,int q=0)
{
m =p;
n =q;
}

C0::C0(int p)
{
}
这样一来,遇到C0 obj=3时,编译器就会翻译成下面这样:
C0 obj = C0(3);
有时为了防止这样的类型转换,就要在构造函数前加上一个关键字:explicit,这个关键字就可以防止编译器来进行隐式的类型转换了。所以你贴出的代码的第二个C0的类定义不会使C0 obj=3;这样的语句编译通过,因为它的构造函数前加上了explicit关键字。