C++里面各种各样的运算符都可以拿来重载,虽然不是所有的运算符都可以重载,但是绝大部分都是可以重载的,比方说这个类型转换运算符的重载,自增自减运算符的重载.
我们知道C++中内置的一些类型之间是可以相互装换的:
- int a;
- double b=3.14;
- a=(double)b3;
我们希望自己写的类也可以进行类型转化
(1)将其他类型转换为我们写的类类型:只需要在构造函数中添加该类型的参数,然后将该参数的值赋给成员变量
- class Person
- {
- public:
- int age;
- Person(int i=0):age(i){
- }
- };
- Person p;
- p = (Person)4;
(2)将自己的类类型转化为其他类型,需要重载类类型操作符,函数形式如:operator 类型名称() const{返回其他类型的变量}
- class Person
- {
- public:
- int age;
- operator int() const{
- return age;
- }
- };
- Person p;
- p.age = 12;
- int a = (int)p;
上面的转换都是显示的转换,也可以写成隐式转换,Person p;p = 4;和Person p;p.age=12;int a = p;
这样直接的隐式转换有时候会在我们不经意间就实现了,甚至我们本不想让其进行转换,所以为了避免这种情况。C++允许在上面的构造函数或者重载类类型的方法前面加上explicit关键字,之后就不能进行隐式的类型转换了。
自增和自减代表着哪两个运算符呢?
自增:变量名"++"
自减:变量名"- -"
我们都知道自增运算符++、自减运算符--有前置/后置之分,为了区分所重载的是前,置运算符还是后置运算符,C++规定:
- int main()
- {
- CDemo d(5);
- cout << (d++ ) << ","; //等价于 d.operator++(0);
- cout << d << ",";
- cout << (++d) << ","; //等价于 d.operator++();
- cout << d << endl;
- cout << (d-- ) << ","; //等价于 operator--(d,0);
- cout << d << ",";
- cout << (--d) << ","; //等价于 operator--(d);
- cout << d << endl;
- return 0;
- }
- class CDemo {
- private :
- int n;
- public:
- CDemo(int i=0):n(i) { }
- CDemo & operator++(); //用于前置形式
- CDemo operator++( int ); //用于后置形式
- operator int ( ) { return n; }
- friend CDemo & operator--(CDemo & ); //友元函数,可以访问私有成员
- friend CDemo operator--(CDemo & ,int); //友元函数,可以访问私有成员
- };
- CDemo & CDemo::operator++()
- { //前置 ++
- n ++;
- return * this;
- } // ++s即为: s.operator++();
- CDemo CDemo::operator++( int k )
- { //后置 ++
- CDemo tmp(*this); //记录修改前的对象
- n ++;
- return tmp; //返回修改前的对象
- } // s++即为: s.operator++(0);
- CDemo & operator--(CDemo & d)
- {//前置--
- d.n--;
- return d;
- } //--s即为: operator--(s);
- CDemo operator--(CDemo & d,int)
- {//后置--
- CDemo tmp(d);
- d.n --;
- return tmp;
- } //s--即为: operator--(s, 0);
- #include
- using namespace std;
- class CDemo {
- private :
- int n;
- public:
- CDemo(int i=0):n(i) { }
- CDemo & operator++(); //用于前置形式
- CDemo operator++( int ); //用于后置形式
- operator int ( ) { return n; }
- friend CDemo & operator--(CDemo & ); //友元函数,可以访问私有成员
- friend CDemo operator--(CDemo & ,int); //友元函数,可以访问私有成员
- };
- CDemo & CDemo::operator++()
- { //前置 ++
- n ++;
- return * this;
- } // ++s即为: s.operator++();
- CDemo CDemo::operator++( int k )
- { //后置 ++
- CDemo tmp(*this); //记录修改前的对象
- n ++;
- return tmp; //返回修改前的对象
- } // s++即为: s.operator++(0);
- CDemo & operator--(CDemo & d)
- {//前置--
- d.n--;
- return d;
- } //--s即为: operator--(s);
- CDemo operator--(CDemo & d,int)
- {//后置--
- CDemo tmp(d);
- d.n --;
- return tmp;
- } //s--即为: operator--(s, 0);
- int main()
- {
- CDemo d(5);
- cout << (d++ ) << ","; //等价于 d.operator++(0);
- cout << d << ",";
- cout << (++d) << ","; //等价于 d.operator++();
- cout << d << endl;
- cout << (d-- ) << ","; //等价于 operator--(d,0);
- cout << d << ",";
- cout << (--d) << ","; //等价于 operator--(d);
- cout << d << endl;
- return 0;
- }
运算符重载这个单元算是彻底讲完了,给大家说一下注意事项: