C++重载操作符operator
operator是C++关键字,用于对C++进行扩展;
1、可以被重载的操作符:new,new[],delete,delete[],+,-,*,/,%,^,&,|,~,!,=,<,>,+=,<<,>>,<<=,>>=,++,!=,<=,>=,&&,||,++,--,->*,->,(),[]
不可以被重载的操作符:. .* :: ?:
2、基类对赋值操作符(=)重载不能被派生类继承。
“+”操作符重载:通常,重载一个二元操作符,操作符重载函数只有一个参数。重载一个一元操作符,其函数不需要任何参数。
3、重载不能改变操作符的优先级和语法。
4、[],=,(),-> 必须以类成员函数的形式进行重载。
5、除内存管理操作符new,new[],delete,delete[],一个以顶层函数形式被重载的操作符必须在他的参数表中包含一个类的对象。操作符以顶层函数实现时,至少带一个类对象参数的理由:让编译系统区分操作符是内建还是用户自定义的。
顶层函数:C++中有很多包含头文件,也包含很多库函数,顶层函数是object库函数。顶层函数重载操作符时,比用成员函数重载操作符时多一个参数。只要定义了可用于转型的构造函数,使用顶层函数进行重载的一个优点就是非对象操作符可以出现在操作符的左边。而使用类成员函数时,第一个操作符必须是类的对象。
一个类的friend函数可以访问该类的私有成员和保护成员。但该friend函数不是类的成员函数。其可以出现在类的private、public、protected的任意部分。(仅在重载操作符时使用friend函数)。
重载operator++操作符
C++语言得到了扩展,允许重载increment 和 decrement操作符的两种形式。
然而有一个句法上的问题,重载函数间的区别决定于它们的参数类型上的差异,但是不论是increment或decrement的前缀还是后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类型参数,当函数被调用时,编译器传递一个0做为int参数的值给该函数:
class UPInt { // "unlimited precision int" public: UPInt& operator++(); // ++ 前缀 const UPInt operator++(int); // ++ 后缀 UPInt& operator--(); // -- 前缀 const UPInt operator--(int); // -- 后缀 UPInt& operator+=(int); // += 操作符,UPInts // 与ints 相运算 ... }; UPInt i; ++i; // 调用 i.operator++(); i++; // 调用 i.operator++(0); --i; // 调用 i.operator--(); i--; // 调用 i.operator--(0);
这个规范有一些古怪,不过你会习惯的。而尤其要注意的是这些操作符前缀与后缀形式返回值类型是不同的。前缀形式返回一个引用,后缀形式返回一个const类型。下面我们将讨论++操作符的前缀与后缀形式,这些说明也同样使用与--操作符。
从你开始做C程序员那天开始,你就记住increment的前缀形式有时叫做“增加然后取回”,后缀形式叫做“取回然后增加”。这两句话非常重要,因为它们是increment前缀与后缀的形式上的规范。
#include<iostream> using namespace std; class A { public: A():value(0){cout<<"i am gouzao"<<endl;} A(A&):value(0){cout<<"i am gouzao"<<endl;}; ~A(){cout<<"xigou"<<endl;} A& operator++() { cout<<"++A"<<endl; ++value; return *this; } const A operator++(int) { cout<<"A++"<<endl; A tmp=*this; value++; return tmp; } void show() { cout<<"value:"<<value<<endl; } private: int value; }; int main() { A a; a++; a.show(); ++a; a.show(); return 0; }