衡水 网站开发,简述网站的建站流程,免费申请微信收款码,企业营销型网站制作多少钱运算符重载注意
重载的运算符要易读内置的数据类型的表达式的运算符是不可以改变的不要重载 和 | | 运算符#xff0c;[]和-运算符只能通过成员函数进行重载和只能通过全局函数配合友元函数进行重载
加号运算符重载 如果想让自定义数据类型 进…运算符重载注意
重载的运算符要易读内置的数据类型的表达式的运算符是不可以改变的不要重载 和 | | 运算符[]和-运算符只能通过成员函数进行重载和只能通过全局函数配合友元函数进行重载
加号运算符重载 如果想让自定义数据类型 进行****运算那么就需要重载 ****运算符 在成员函数 或者 全局函数里 重写 一个****运算符的函数 函数名operate(){} 运算符重载可以不停重载接着重载 #includeiostreamusing namespace std;class Person{public:Person(){}Person(int a, int b) :m_A(a), m_B(b){}//号运算符重载 成员函数/*Person operator(Person p){Person tmp;tmp.m_A this-m_A p.m_A;tmp.m_B this-m_B p.m_B;return tmp;}*/int m_A;int m_B;};//利用全局函数进行号运算符的重载Person operator(Person p1, Person p2) //二元{Person tmp;tmp.m_A p1.m_A p2.m_A;tmp.m_B p1.m_B p2.m_B;return tmp;}//函数重载 附带运算符再次重载Person operator(Person p1, int a) //二元{Person tmp;tmp.m_A p1.m_A a;tmp.m_B p1.m_B a;return tmp;}void test01(){Person p1(10, 10);Person p2(10, 10);Person p3 p1 p2; //p1p2 从什么表达式转变的 p1.operator(p2) operator(p1,p2)Person p4 p1 10;//重载的版本cout p3的m_A p3.m_A endl p3的m_B p3.m_B endl;}int main(){test01();system(pause);return 0;}左移运算符重载 不要随意乱用符号重载 内置数据类型的运算符不可以重载 cout 直接对Person自定义数据类型 进行输出 写到全局函数中 ostream operator(ostream cout,Person p1){} 如果重载时想访问p1的私有成员那么全局函数要做Person的友元函数 #includeiostreamusing namespace std;class Person{friend ostream operator (ostream cout, Personp1);public:Person(){}Person(int a, int b){this-m_A a;this-m_B b;}/*void operator() 重载左移运算符不可以写到成员函数中{}*/private:int m_A;int m_B;};//cout是属于ostream类 //如果向访问私有成员就要用友元函数ostream operator (ostream cout, Personp1) //第一个参数cout 第二个参数p1{cout m_A p1.m_A m_B p1.m_B;return cout;}void test01(){Person p1(10, 10);cout p1endl;}int main(){test01();system(pause);return 0;}前置后置 运算符重载 自己实现int类型MyIntege 内部维护int 数据 MyInteger myint myint 后置 myint前置 重载运算符 operator()前置 operator(int )后置 前置理念 先 后返回自身 后置理念 先保存原有值 内部 返回临时数据 #includeiostreamusing namespace std;class MyInteger{friend ostream operator(ostream cout, MyInteger myInt);public:MyInteger(){m_Num 0;}//前置重载//返回引用MyInteger operator(){this-m_Num;return *this;}//用占位参数区分前置和后置//后置重载//返回值MyInteger operator(int){//先保存目前的数据MyInteger tmp *this;//实际数据m_Num;//返回前的数值return tmp;}//所以前置好因为返回引用少一份开销int m_Num;};ostream operator(ostream cout, MyInteger myInt){cout myInt.m_Num;return cout;}void test01(){MyInteger myInt;//前置值cout myInt endl;//后置值cout myInt endl;//本身的值cout myInt endl;}int main(){test01();system(pause);return 0;}赋值运算符重载 系统默认给类提供 赋值运算符写法 是简单值拷贝 导致如果类中有指向堆区的指针就可能出现深浅拷贝的问题 所以要重载运算符 链式编程return *this #define _CRT_SECURE_NO_WARNINGS#includeiostreamusing namespace std;class Person{public:Person(int a){this-m_A a;}int m_A;};void test01(){Person p1(10);Person p2(0);p2 p1;cout p2的m_A p2.m_A endl;}class Person2{public:Person2(char * name){this-pName new char[strlen(name) 1];strcpy(this-pName, name);}//类中重载 赋值运算符Person2 operator(const Person2 p){//判断如果原来已经堆区有内容先释放if (this-pName ! NULL){delete[]this-pName;this-pName NULL;}this-pName new char[strlen(p.pName) 1];strcpy(this-pName, p.pName);return *this;}~Person2(){if (this-pName ! NULL){delete[]this-pName;this-pName NULL;}}char * pName;};void test02(){Person2 p1(狗蛋);Person2 p2(狗剩);Person2 p3();p3p2 p1;cout p2.pName endl;cout p3.pName endl;cout p2.pName endl;int a 10;int b 20;int c;c a b; //都是20cout a b c endl;}int main(){test02();system(pause);return 0;}关系运算符重载 #includeiostream#includestringusing namespace std;class Person{public:Person(string name, int age){this-m_Name name;this-m_Age age;}bool operator(Person p){if (this-m_Name p.m_Namethis-m_Age p.m_Age){return true;}return false;}bool operator!(Person p){if (this-m_Name p.m_Namethis-m_Age p.m_Age){return false;}return true;}string m_Name;int m_Age;};void test01(){Person p1(小明, 10);Person p2(小强, 15);Person p3(小强, 15);/*int a 10;int b 10;if (a b){cout a,b相等 endl;}*/if (p1 p2){cout p1和p2相等 endl;}else{cout 不相等 endl;}if (p3 p2){cout p3和p2相等 endl;}else{cout 不相等 endl;}if (p1 ! p2){cout p1和p2不相等 endl;}else{cout 相等 endl;}}int main(){test01();system(pause);return 0;}函数调用运算符重载 #includeiostream#includestringusing namespace std;// ()重载class MyPrint{public:void operator()(string text){cout text endl;}};void test01(){MyPrint myPrint;myPrint(hello world); //仿函数}class MyAdd{public:int operator()(int v1,int v2){return v1 v2;}};void test02(){/*MyAdd myAdd;cout myAdd(1, 1) endl;*/cout MyAdd()(1, 1) endl; //匿名对象}int main(){//test01();test02();system(pause);return 0;}