C++编写类String的构造函数、析构函数和赋值函数

考点:构造函数、析构函数和赋值函数的编写方法

一、代码

#pragma warning(disable:4996)       
 #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::operator = (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)赋值函数:首先判断当前对象与引用传递对象是否是同一个对象,如果是,不做操作直接返回;否则先释放当前对象的堆内存,然后分配足够大小长度的堆内存拷贝字符串。

二、执行结果

 

参考:

https://www.cnblogs.com/mwl523/p/10760745.html

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值