两个方向的类型转换函数

class A
{
public:
 A(){}
 A(int i){a = i; cout << "constructor i" << endl;}

/*
 A& operator+ (const A& rhs)
 {
  cout << "operator +" << endl;
  a += rhs.a;
  return *this;
 }

*/


private:
 int a;
};

int main()
{
 A a(3);
 A b = 3;
 b = a + 3;
 return 0;
}

 

A a(3)和A b =3调用两次构造函数

第一次构造对象a,第二次构造临时对象tmp,然后使用“按成员初始化行为”构造对象b,使用编译器提供的默认拷贝构造函数,与“按成员赋值”相区分

b =a +3;这是一个错误表达式,因为class A未定义重载的operator,a.operator +()这个函数根本不存在,更不存在有参数int的operator +了,注意这里编译器不会利用3构造一个临时对象tmp(本质需个类型转换,转换一个int类型对象为A类型对象,恰好,单参数构造函数可以作一个转换函数),因为首先operator就不存在;

当定义了operator时,首先表达式所用的operator +找到了,然后看参数,实参为int,而形参需A类型对象,类型不匹配,这时需什么呢,对,就是一个类型转换函数,而单参数的构造函数恰好可以作一个类型转换函数

既然是类型转换,那就存在两个方向

1。其它类型转换成类类型,这些转换事实上都是构造函数,因为把个其它类型的对象转换成了类类型的对象,构造了个类对象(用在表达式中操作符的操作数时,函数的参数时)

2。类类型的对象转换成其它类型的对象(用在表达式中操作符的操作数时,函数的参数时)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值