运算符函数的定义格式二:成员函数
返回类型operator运算符(除第一个操作数之外的参数表)
双目:运算结果类型operator运算符(第二个操作数)
单目:运算结果类型operator运算符()
以成员函数形式定义时,第一个操作数作为了当前对象,不需要作为实参传递,只需要传递剩余的操作数就可以了。在运算符函数里可以通过*this或者this->来访问第一个操作数。
规定只能用成员函数的[],(),=,->,类型转换
如果有指针成员指向动态内存,还应该自己写复制运算符函数来实现跟拷贝构造函数相似的功能。三大:拷贝够着、赋值、析构
//[]{}->=type 这些运算符只能是成员函数#include#include using namespace std;class S{ char* p; int len;private: S(const S& x);//私有拷贝构造,禁止拷贝public: S(const char* str=""){ len = strlen(str); p = new char[len+1]; strcpy(p,str); } ~S(){ delete[] p;p=NULL; } S& operator=(const S& s1){ //以当前对象作为赋值结果 成员函数 if(&s1==this) return *this; // 如果传入参数是自己,就直接返回 len = s1.len; delete[] p;//释放旧的动态内存 p=new char[len+1];//为p开辟新动态内存 strcpy(p,s1.p);//复制动态内存中的字符串过来 return *this;//返回当前对象 } friend ostream& operator<<(ostream& o,const S& x){ return o<
类型转换运算符函数格式为
operator 类型名()
不写返回类型,返回类型跟“类型名”一致,只能是成员函数。
#include#include using namespace std;class Person{ string name; int age; float salary;public: Person(const char* n ,int a,float s):name(n),age(a),salary(s){}//排名不分先后 operator string(){ return name;} operator double(){ return salary;} operator int(){ return age;}};int main(){ Person a("芙蓉",18,80000); string info = a; // a.operator string() double money = a;// a.operator double() int age = a;//a.operator int() cout< <<","< <<","< <
圆括号作为运算符时,参数个数不定。函数定义格式:
返回类型 operator()(参数表)
支持圆括号运算符的对象也称为函数对象,因为使用的形式特别像调用函数。
#includeusing namespace std;class A{ int* p; int len;public: A(int n,int v=0):p(new int[n]),len(n){ for(int i=0;i