1、运算符重载
1 class Byte 2 { 3 unsigned char b; 4 const Byte& operator++() 5 { 6 cout<<"++Byte"<<endl; 7 b++; 8 return *this; 9 } 10 const Byte& operator++(int) 11 { 12 cout<<"Byte++"<<endl; 13 Byte before(b); 14 b++; 15 return before; 16 } 17 };2、对象返回值问题
1 class Interger 2 { 3 int i; 4 const Interger operator+(const Interger &left, const Interger &right) 5 { 6 return Interger(left.i + right.i);//创建一个临时Interger对象并返回它7 /* 下面会执行三个步骤:
a、创建tmp对象,调用构造函数;
b、拷贝构造函数把tmp拷贝到外部返回值的存储单元;
c、当tmp在作用域的结尾调用析构函数,
8 Interger tmp(left.i + right.i); 9 return tmp; 10 */ 11 }12 };
3、关键字explicit
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。显示声明:CE e(1);CE e2(e1);这种显式调用外,其它都是非显式的。
1 class CNoE 2 { 3 public: 4 CNoE(int i):m_num(i){} 5 private: 6 int m_num; 7 }; 8 9 class CE 10 { 11 public: 12 explicit CE(int i):m_num(i){} 13 explicit CE(const CE& e):m_num(e.m_num){} 14 private: 15 int m_num; 16 }; 17 18 int main(void) 19 { 20 CNoE no=1; 21 CE e1(1); 22 CE e2=1;//错误:conversion from ‘int’ to non-scalar type ‘CE’ requested 23 CE e3(e1); 24 CE e4=e1;//错误:no matching function for call to ‘CE::CE(CE&)’
25 cout<<sizeof(CNoE)<<" "<<sizeof(CE)<<endl; //输出是:4 4; 26 return 0; 27 }