• 重载运算符函数及其注意事项


      1 #include "stdafx.h"
      2 #include <string>
      3 
      4 class CMyString
      5 {
      6 public:
      7     CMyString(char* pData = NULL);
      8     CMyString(const CMyString& str);
      9     ~CMyString(void);
     10 
     11     CMyString& operator = (const CMyString& str);
     12 
     13     void Print();
     14       
     15 private:
     16     char* m_pData;
     17 };
     18 
     19 CMyString::CMyString(char *pData)
     20 {
     21     if(pData == NULL)
     22     {
     23         m_pData = new char[1];
     24         m_pData[0] = '';
     25     }
     26     else
     27     {
     28         int length = strlen(pData);
     29         m_pData = new char[length + 1];
     30         strcpy(m_pData, pData);
     31     }
     32 }
     33 
     34 CMyString::CMyString(const CMyString &str)
     35 {
     36     int length = strlen(str.m_pData);
     37     m_pData = new char[length + 1];
     38     strcpy(m_pData, str.m_pData);
     39 }
     40 
     41 CMyString::~CMyString()
     42 {
     43     delete[] m_pData;
     44 }
     45 
     46 CMyString& CMyString::operator = (const CMyString& str)
     47 {
     48     if(this == &str)
     49         return *this;
     50 
     51     delete []m_pData;
     52     m_pData = NULL;
     53 
     54     m_pData = new char[strlen(str.m_pData) + 1];
     55     strcpy(m_pData, str.m_pData);
     56 
     57     return *this;
     58 }
     59 
     60 // ====================测试代码====================
     61 void CMyString::Print()
     62 {
     63     printf("%s", m_pData);
     64 }
     65 
     66 void Test1()
     67 {
     68     printf("Test1 begins:
    ");
     69 
     70     char* text = "Hello world";
     71 
     72     CMyString str1(text);
     73     CMyString str2;
     74     str2 = str1;
     75 
     76     printf("The expected result is: %s.
    ", text);
     77 
     78     printf("The actual result is: ");
     79     str2.Print();
     80     printf(".
    ");
     81 }
     82 
     83 // 赋值给自己
     84 void Test2()
     85 {
     86     printf("Test2 begins:
    ");
     87 
     88     char* text = "Hello world";
     89 
     90     CMyString str1(text);
     91     str1 = str1;
     92 
     93     printf("The expected result is: %s.
    ", text);
     94 
     95     printf("The actual result is: ");
     96     str1.Print();
     97     printf(".
    ");
     98 }
     99 
    100 // 连续赋值
    101 void Test3()
    102 {
    103     printf("Test3 begins:
    ");
    104 
    105     char* text = "Hello world";
    106 
    107     CMyString str1(text);
    108     CMyString str2, str3;
    109     str3 = str2 = str1;
    110 
    111     printf("The expected result is: %s.
    ", text);
    112 
    113     printf("The actual result is: ");
    114     str2.Print();
    115     printf(".
    ");
    116 
    117     printf("The expected result is: %s.
    ", text);
    118 
    119     printf("The actual result is: ");
    120     str3.Print();
    121     printf(".
    ");
    122 }
    123 
    124 int _tmain(int argc, _TCHAR* argv[])
    125 {
    126     Test1();
    127     Test2();
    128     Test3();
    129 
    130     return 0;
    131 }

    剑指offer里面提到,如果让写一个重载运算符函数需要注意的4个事项

    1:返回值一定要是引用,也就是自身*this,这样才能保证连续赋值

    2::形参要是引用不能是实例,否则会自身调用复制构造函数,造成浪费,减慢效率,同时为了不修改,应该const 修饰

    3:在分配内存之前要释放以前的内存

    4:最初一定要判断*this和传入的是否是同一个,如果是同一个,那么直接返回,否则,会delete全部删除

  • 相关阅读:
    CSS选择符-----关系选择符
    CSS选择符-----元素选择符
    jQuery效果--show([speed,[easing],[fn]])和hide([speed,[easing],[fn]])
    大型网站架构系列:电商网站架构案例
    大型网站架构系列:负载均衡详解(上)
    JBOSS集群和安装
    webwork或Struts配置网站根路径的默认页面办法
    SQL Server 删除重复记录,只保留一条记录
    删除JBOSS eap4.3下的jmx-console、web-console、ws-console、status服务
    SLF4J versions 1.4.0 and later requires log4j 1.2.12 or later 终极解决
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/6392158.html
Copyright © 2020-2023  润新知