C++中类类型的隐式转换示例
<pre>#include <iostream>
class A{
public:
A() :a(0){} //默认构造函数
A(int i) :a(i){} //自定义构造函数
void print(){ std::cout << a << std::endl; }
private:
int a;
};
int main(){
A b = true; //隐式转换并执行拷贝初始化,布尔值转换为类类型A的一个实例,调用了自定义构造函数
b.print();
return 0;
}</pre>注:C++中类类型的隐式转换只支持一步转换,以上代码只执行了一次转换,即将布尔值转换为int值带入自定义构造函数。
如下面的示例所示
<pre>#include <iostream>
include <string>
class A{
public:
A() :str(0){} //默认构造函数
A(std::string s) :str(s){} //自定义构造函数
void print(){ std::cout << str << std::endl; }
A& add(const A &a){ str += a.str; return *this; }
private:
std::string str;
};
int main(){
A b = "hello"; //隐式转换
b.add(" world"); //错误,执行了两次转换,应改为b.add(std::string(" world"))
b.print(); //输出 hello world
return 0;
}</pre>
下面的示例展现了一个有趣的现象
<pre>#include <iostream>
class A{
public:
A() :a(0){} //默认构造函数
//A(int i) :a(i){}
void print(){ std::cout << a << std::endl; }
A& operator=(int i){ a = i; return *this; } //拷贝赋值函数
private:
int a;
};
int main(){
A b = 2; //失败,不存在适当的构造函数进行隐式转换
A c; //调用默认构造函数
c = 2; //成功,存在匹配的拷贝赋值函数
c.print();
return 0;
}</pre>
网友评论