字符串类的构造函数,拷贝构造,赋值函数的实现

来源:互联网 发布:mac轻量级虚拟机 编辑:程序博客网 时间:2024/05/18 06:09

1.MyString.h

//MyString.h

#pragma once

class String
{
 public:
     String(const char *str = NULL);//普通构造函数
     String(const String &other);//拷贝构造函数
    ~String(void);//析构函数
     String & operator = (const String &other);//赋值函数
private:
    char *m_data;//用来保存字符串
 };

2.MyString.cpp

#include "stdafx.h"
#include <string.h>
#include "MyString.h"

  /*

  *普通构造函数

  *构造函数首先根据一个字符串常量创建一个String对象。

  *这个构造函数首先分配了足够的内存,然后把这个字符串常量复制到这块内存

  */
 String::String(const char *str)
 {
     if (str == NULL)
  {
         m_data = new char[1];
         *m_data = '\0';
     }
  else
  {
        int length = strlen(str);
        m_data = new char[length + 1];
        //strcpy(m_data, str);
  strcpy_s(m_data,length+1,str);
     }
 }


 /*

  *拷贝构造函数

  *所有需要分配系统资源的用户定义类型都需要一个拷贝构造函数

  *它可以在函数调用中以传值得方式传递一个String类型的参数

  *并且在当一个函数以值得形式返回String对象时实现“返回时复制”

  */
 String::String(const String &other)
 {
     int length = strlen(other.m_data);
     m_data = new char[length + 1];
     //strcpy(m_data, other.m_data);
  strcpy_s(m_data, length+1,other.m_data);
 }

 /*
  *定义析构函数是为了方式内存泄露,当一个String对象超出

  *它的作用域时,析构函数就会释放它所占用的内存

 */
 String::~String(void)
 {
    delete[] m_data;//m_data是内部数据类型,也可以写作delete m_data
 }

 /*
  *赋值函数实现字符串的传值活动
  */
 String & String::operator = (const String &other)
 {
     if (this == &other)//检查自赋值
         return *this;

     delete[] m_data;
     int length = strlen(other.m_data);//分配新的内存资源并复制其内容
     m_data = new char[length + 1];
     //strcpy(m_data, other.m_data);
  strcpy_s(m_data,length+1,other.m_data);
     return *this;//返回本对象的引用
 }

3.测试代码


#include "stdafx.h"
#include "MyString.h"

int _tmain(int argc, _TCHAR* argv[])
{
 String MyString("My first String test!!!");//普通构造函数
   
 String MyString2;//普通构造函数

 String MyString3 = MyString;//拷贝构造函数
   
 MyString2 = MyString;//赋值函数

 return 0;
}




0 0
原创粉丝点击