标签:
运算符函数的定义格式二:成员函数
返回类型operator运算符(除第一个操作数之外的参数表)
双目:运算结果类型operator运算符(第二个操作数)
单目:运算结果类型operator运算符()
以成员函数形式定义时,第一个操作数作为了当前对象,不需要作为实参传递,只需要传递剩余的操作数就可以了。在运算符函数里可以通过*this或者this->来访问第一个操作数。
规定只能用成员函数的[],(),=,->,类型转换
如果有指针成员指向动态内存,还应该自己写复制运算符函数来实现跟拷贝构造函数相似的功能。三大:拷贝够着、赋值、析构
//[]{}->=type 这些运算符只能是成员函数 #include<iostream> #include<cstring> 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<<x.p; } char& operator[](int index){//成员函数 return p[index]; } }; int main() { S a,b("furong");//是初始化,不是赋值 S c; //... c=a=b;//c.operator=(a.operator=(b)) cout<<a<<","<<b<<","<<c<<endl; b=b;//b.operator=(b) cout<<b<<endl; cout<<a[3]<<endl;//operator[] a,3 a[1]=‘o‘; cout<<a<<endl; system("pause"); return 0; }
类型转换运算符函数格式为
operator 类型名()
不写返回类型,返回类型跟“类型名”一致,只能是成员函数。
#include<iostream> #include<string> 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<<info<<","<<money<<","<<age<<endl; system("pause"); }
圆括号作为运算符时,参数个数不定。函数定义格式:
返回类型 operator()(参数表)
支持圆括号运算符的对象也称为函数对象,因为使用的形式特别像调用函数。
#include<iostream> using 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<len;i++) p[i] =v; } void operator()(int start,int step){ for(int i=0;i<len;i++) p[i] = start + i*step; } int operator()(){ int sum=0; for(int i = 0;i<len;i++) sum +=p[i]; return sum; } friend ostream& operator<<(ostream& o,const A& x){ for(int i = 0;i<x.len;i++) o<<x.p[i]<<" "; return o; } }; int main() { A a(10); a(5,1);//从5开始步长为1填充这个数组 a.operator()(5,1) cout<<a<<endl; cout<<a()<<endl;//a.operator()() cout<<a<<endl; system("pause"); return 0; }
标签:
原文地址:http://www.cnblogs.com/visions/p/5463925.html