【C语言】【面试题】C++中String类浅拷贝,深拷贝的传统写法与现代写法

原创 2016年05月30日 15:03:58

C++ 的一个常见面试题是让你实现一个 String 类,在这我把String类的各种写法写了一下

    1.浅拷贝

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//1.浅拷贝
class String
{
public:
    String(char* str)
        :_str(str)
    {}

    String(const String& s)
        :_str(s._str)
    {}

    //~String()
    //{
    //    delete[] _str;
    //} 不能释放两次,无论是构造函数还是,拷贝构造都只是把指针指向同一块空间
private:
    char* _str;

};

void Test1()
{
    String s1("s1");
    String s2(s1);
}

int main()
{
    Test1();
    
    system("pause");
    return 0;
}

    对于浅拷贝如果我们不写析构函数的话,这种写法是没有错误的,但是一旦写上析构函数,就会有问题了,因为这种写法像如果像测试函数Test1写的那样,就会释放两次s1指向的空间,程序就会崩溃,如果想更完善,就需要一种更健全的方法。

    

    2.深拷贝-->传统写法

这种写法的优点在于:在构造和拷贝构造时都重新开辟了空间,无论析构多少次程序都不会奔溃,而且可在操作性有所提高

class String
{
public:
    /*String()
        :_str(new char[1])
    {
        _str[0] = '\0';
    }*/

    String(char* str = "")
        :_str(new char[strlen(str) + 1])
    {
        strcpy(_str, str);
    }

    String(const String& s)
        :_str(new char[strlen(s._str) + 1])
    {
        strcpy(_str, s._str);
    }

    String& operator=(const String&s) //重载写法1,不完善
    {
        if (this != &s)
        {
            delete[] _str;
            _str = new char[strlen(s._str) + 1];
            strcpy(_str, s._str);
        }
        return *this;
    }

    String& operator=(const String& s)//重载写法2,思路更健全
    {
        char* tmp = new char[strlen(s._str) + 1];
        strcpy(tmp, s._str);
      delete[] _str;
        _str = tmp;
    }

    ~String()
    {
        /*if (_str)*/
        delete[] _str;
    } 

private:
    char* _str;
};

void Test1()
{
    String s1("s1");
    //String s3();
    String s2(s1);
}

int main()
{
    Test1();

    system("pause");
    return 0;
}

传统写法是根据大多数人的思路走的,这样写出来的程序可读性高,这个写法主要是两种重载的写法,第一种没有考虑new是否能开辟出足够大小的空间,就直接释放了原来的_str,第二种写法就是反过来先申请空间然后再释放,这种思路更严谨一些。

    

    3.深拷贝-->现代写法

现代写法是基于传统写法上改进的,代码更简洁高效,只是逻辑变得更复杂了。

class String
{
public:
    String(char* str = "")
        :_str(new char[strlen(str) + 1])
    {
        strcpy(_str, str);
    }

    String(const String& s)
        :_str(NULL)
    {
        String tmp(s._str);
        swap(_str, tmp._str);
    }

    String& operator=(String s)//针对已经存在的两个字符串类型 所以直接交换即可   隐试生成一块临时空间,交换后把可把原来的空间释放掉
    {
        swap(_str, s._str);
        return *this;
    }

    ~String()
    {
        /*if (_str)*/
        delete[] _str;
    }

private:
    char* _str;
};

void Test1()
{
    String s1("s1");
    //String s3();
    String s2(s1);
}

int main()
{
    Test1();

    system("pause");
    return 0;
}

总结传统写法和现代写法:

    传统写法:1.可读性高,符合人的正常思维

    现代写法:1.简洁 2.new/delete都在统一的地方,可维护性高


版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ String的传统和现代写法的深拷贝

传统写法#include using namespace std; class String { public: //构造函数 String(char*str=""); :_...
  • chuxinlgz
  • chuxinlgz
  • 2017年07月20日 21:45
  • 140

面试题:String类的浅拷贝、深拷贝、写时拷贝

String的拷贝是面试中的经常会被问到的问题,所以,学懂String类是非常重要的。下面我们先来看一段代码:class String { public: String(const char*...
  • ChaseRaod
  • ChaseRaod
  • 2017年04月16日 15:50
  • 364

c++深拷贝和浅拷贝

C++中类的拷贝有两种:深拷贝,浅拷贝当出现类的等号赋值时,会调用拷贝函数 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅...
  • u010700335
  • u010700335
  • 2014年10月06日 19:27
  • 1783

C++ 深拷贝 与 浅拷贝

本文分三部分阐释深拷贝于浅拷贝,着眼点主要还是在深拷贝。第一部分讲述为什么会有拷贝,即对象之间的复制。第二部分讲述为什么会有深拷贝于浅拷贝,即类成员存在资源分配。第三部分阐释深拷贝于浅拷贝的定义与使用...
  • u013630349
  • u013630349
  • 2015年06月01日 22:33
  • 971

结构体对齐,结构体深拷贝和浅拷贝

 3.结构体对齐,结构体深拷贝和浅拷贝
  • toto1297488504
  • toto1297488504
  • 2014年08月01日 01:27
  • 2053

C语言拾遗:位拷贝与值拷贝,浅拷贝与深拷贝

先留个题目,下午回来总结下。。。 吃饭去
  • top_along
  • top_along
  • 2014年05月19日 11:53
  • 1652

【C++】浅拷贝和深拷贝(String类)

浅拷贝 class String { public: String(const char *pStr = "") { if(NULL == pStr) { pstr = new ch...
  • qq_31828515
  • qq_31828515
  • 2016年10月19日 12:11
  • 2559

string深拷贝的传统与现代写法

#include using namespace std; //1.传统写法完成String深拷贝。 class String {  friend ostream& operator pu...
  • Adoiphs
  • Adoiphs
  • 2017年10月23日 09:44
  • 68

C语言中的深拷贝和浅拷贝

http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define...
  • sinat_35297665
  • sinat_35297665
  • 2017年11月26日 13:47
  • 158

【C语言】【面试题】C++中String类引用计数器的浅拷贝写法与深拷贝写法

Linux操作下String类的实现--引用计数器    1.引用计数器写法一写法一个人比较喜欢叫他双指针法,因为他是在类里面创建了两个指针来实现的一个是指针_str,另外一个是用来保存指向同一块空间...
  • zangyuanan320
  • zangyuanan320
  • 2016年05月30日 15:04
  • 156
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C语言】【面试题】C++中String类浅拷贝,深拷贝的传统写法与现代写法
举报原因:
原因补充:

(最多只允许输入30个字)