https://www.cnblogs.com/alinh/p/9636500.html

考点:构造函数、析构函数和赋值函数的编写方法
出现频率:☆☆☆☆☆
已知类String的原型为:
        class String
        {
        public:
                String(const char *str = NULL);     //普通构造函数
                String(const String &other);        //拷贝构造函数
                ~ String(void);                    //析构函数
                String & operator =(const String &other); //赋值函数
        private:
                char *m_String;                  //私有成员,保存字符串
        };
解析:
程序代码如下:
        #include <iostream>
        using namespace std;
        class String
        {
        public:
                String(const char *str = NULL);          //普通构造函数
                String(const String &other);             //拷贝构造函数
                ~ String(void);                         //析构函数
                String & operator =(const String &other);  //赋值函数
        private:
                char *m_String;    //私有成员,保存字符串
        };
        
        String::~String(void)             
        {
                cout << "Destructing"<< endl;
                if (m_String != NULL)                  //如果m_String不为NULL,释放堆内存
                {
                        delete [] m_String;
                        m_String = NULL;                //释放后置为NULL
                }
        }
        
        String::String(const char *str)      
        {
                cout << "Construcing" << endl; 
                if(str == NULL)                        //如果str为NULL,存空字符串""
                {
                        m_String = new char[1];            //分配一个字节
                        *m_String = '\0';                   //将之赋值为字符串结束符
                }     
                else
                {
                        m_String = new char[strlen(str) + 1]; //分配空间容纳str内容
                        strcpy(m_String, str);              //拷贝str到私有成员
                }
        }
        
        String::String(const String &other)  
        {
                cout << "Constructing Copy" << endl;
                m_String = new char[strlen(other.m_String) + 1];  //分配空间容纳str内容
                strcpy(m_String, other.m_String);               //拷贝str到私有成员
        }
        
        String & String:perator = (const String &other)   
        {
                cout << "Operate = Function" << endl; 
                if(this == &other)             //如果对象与other是同一个对象
                {                           //直接返回本身
                        return *this;
                }
                delete [] m_String;           //释放堆内存
                m_String = new char[strlen(other.m_String)+1];         
                strcpy(m_String, other.m_String);
        
                return *this;
        }
        
        int main()
        {
                String a("hello");            //调用普通构造函数
                String b("world");           //调用普通构造函数
                String c(a);                //调用拷贝构造函数
                c = b;                     //调用赋值函数
        
                return 0;
        }
(1)普通构造函数:这里判断了传入的参数是否为NULL。如果是NULL,初始化一个字节的空字符串(包括结束符'\0');如果不是,分配足够大小长度的堆内存保存字符串。
(2)拷贝构造函数:只是分配足够小长度的堆内存保存字符串。
(3)析构函数:如果类私有成员m_String不为NULL,释放m_String指向的堆内存,并且为了避免产生野指针,将m_String赋为NULL。
(4)赋值函数:首先判断当前对象与引用传递对象是否是同一个对象,如果是,不做操作直接返回;否则先释放当前对象的堆内存,然后分配足够大小长度的堆内存拷贝字符串。
程序的执行结果如下:
        Construcing
        Construcing
        Construcing Copy
        Operate = Function
        Destructing
        Destructing
        Destructing
这里代码第63~66行会发生构造函数以及赋值函数的调用,而析构函数的调用发生在main()函数退出时

最新文章

  1. 在Linux上运行ASP.NET vNext
  2. Referenced file contains errors (http://www.springframework.org/schema...错误
  3. 原创:微信小程序源码解说:石头剪刀布(附源码下载)
  4. Jquery 操作CheckBox ,RadioButtonList,DropDownList
  5. 如何用UE(UltraEdit)删除重复行?--转
  6. MySql错误1045 Access denied for user &#39;root&#39;@&#39;localhost&#39; (using password:YES) windows下的解决方案(忘记密码)
  7. logstash filter grok 用法
  8. HDU 4757 Tree(可持久化trie)
  9. Mac联网恢复系统重新安装Lion
  10. c# 单例模式[Singleton]之深夜闲聊
  11. 【转】iOS开发者账号和证书
  12. [转]Delphi中进行延时的4种方法
  13. FPGA中改善时序性能的方法_advanced FPGA design
  14. kafka 入门笔记 #1
  15. 初识.Net IL
  16. HDU - 4625 JZPTREE(第二类斯特林数+树DP)
  17. 图-&gt;有向无环图-&gt;求关键路径
  18. maven发布jar包到私服
  19. 过河卒(NOIP2002)
  20. [转]bigdecimal 保留小数位

热门文章

  1. C# 离线人脸识别 ArcSoft V2.0 Demo
  2. Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
  3. 搭建Linux虚拟服务器
  4. (办公)mybatis工作中常见的问题(不定时更新)
  5. MyDAL - .Where() &amp; .And() &amp; .Or() 使用
  6. 数据库原理剖析 - 序列1 - B+树
  7. docker部署postgresql时,data目录不生效的问题探究
  8. java倒计时三种简单实现方式
  9. c编译器字节对齐指令
  10. Scrapy框架-Spider