C++笔记4.64

知识点4 重载=运算符(重要)

类中没有指针成员时,不需要重载=运算符(使用默认的浅拷贝就可以完成)

如果类中有了指针成员,那就必须重载=运算符,且自定义拷贝构造函数

  1. #include <iostream>  
  2. #include <cstring>  
  3.   
  4. using namespace std;  
  5.   
  6. class Person  
  7. {  
  8. private:  
  9.     char *name;  
  10. public:  
  11.     Person()  
  12.     {  
  13.         name = NULL;  
  14.         cout << "无参构造" << endl;  
  15.     }  
  16.   
  17.     Person(char *name)  
  18.     {  
  19.         this->name = new char[strlen(name) + 1];  
  20.         strcpy(this->name,name);  
  21.         cout << "有参构造" << endl;  
  22.     }  
  23.   
  24.     ~Person()  
  25.     {  
  26.         cout << "析构函数" << endl;  
  27.         if(this->name != NULL)  
  28.         {  
  29.             delete [] this->name;  
  30.             this->name = NULL;  
  31.         }  
  32.     }  
  33.   
  34.     void showPerson(void)  
  35.     {  
  36.         cout << "name = " << name << endl;  
  37.     }  
  38.   
  39.     Person(const Person &ob)//ob代表的旧对象  
  40.     {  
  41.         cout << "拷贝构造函数" << endl;  
  42.         this->name = new char[strlen(ob.name) + 1];  
  43.         strcpy(this->name,ob.name);  
  44.     }  
  45.   
  46.     Person& operator=(Person &ob)  
  47.     {  
  48.         if (this->name != NULL)//清空以前的赋值  
  49.         {  
  50.             delete []this->name;  
  51.             this->name = NULL;  
  52.         }  
  53.         cout << "运算符重载" << endl;  
  54.         this->name = new char[strlen(ob.name) + 1];  
  55.         strcpy(this->name,ob.name);  
  56.         return *this;  
  57.     }  
  58. };  
  59.   
  60. int main()  
  61. {  
  62.     Person ob1("momoka");  
  63.     ob1.showPerson();  
  64.     Person ob2 = ob1;//调用拷贝构造  
  65.     Person ob3;  
  66.     Person ob4;  
  67.     ob4 = ob3 = ob1;//重载=运算符  
  68.     return 0;  
  69. }  

知识点5 重载等于和不等于(==、!=)

  1. bool operator==(Person &ob)  
  2. {  
  3.     if(strcmp(this->name,ob.name) == 0)  
  4.     {  
  5.         return true;  
  6.     }  
  7.       
  8.     return false;  
  9. }  
  10.   
  11. bool operator!=(Person &ob)  
  12. {  
  13.     if(strcmp(this->name,ob.name) != 0)  
  14.     {  
  15.         return true;  
  16.     }  
  17.       
  18.     return false;  
  19. }  

知识点6 函数调用符()的重载以及仿函数的定义

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class Fun  
  6. {  
  7. public:  
  8.     int my_add(int x, int y)  
  9.     {  
  10.         return x + y;  
  11.     }  
  12.   
  13.     //第一个()是重载的符号,第二个()是标明传递的参数  
  14.     int operator()(int x, int y)  
  15.     {  
  16.         return x + y;  
  17.     }  
  18. };  
  19.   
  20. int main()  
  21. {  
  22.     Fun fun;  
  23.     cout << fun.my_add(100,200) << endl;  
  24.   
  25.     cout << fun.operator() (100,200) << endl;  
  26.   
  27.     cout << fun(100,200) << endl;  
  28.     //此处不是一个真正的函数,是一个对象名和()结合,调用重载运算符,称为仿函数  
  29.   
  30.     cout << Fun()(100,200) << endl;//声明了匿名对象  
  31.     return 0;  
  32. }  

知识点7 不要重载&&和||

原因:用户无法实现&&和||的短路特性

A && B如果A是假的,B就不会执行

A || B 如果A是真的,B就不会执行

知识点8 符号重载的总结

运算符建议使用
所有的一元运算符成员
= () [] -> *必须是成员
+= -= /= *= ^= &= != %= >>= <<= ==成员
其他二元运算符 << >>非成员

知识点9 强化训练字符串类String

源代码

发表评论

邮箱地址不会被公开。 必填项已用*标注