重载=号的时候,copy这一步使用深拷贝非常重要

原创 2018年04月17日 19:24:18
#include <iostream>
#include <cstring>
using namespace std;

class SString
{
private:
    char* s_;
    size_t len_;//size_t等价于unsigned int也就是>=0的意思;s_=newchar(2*len_);
    size_t siz_;//2*len_;空洞,对内存的使用更有利;分配内存空间;siz=2*len_;
public:
    SString():len_(0),siz_(0),s_(NULL) {}
    SString(const char* s);
    SString(const SString& s);
    void show();
    ~SString()
    {
        delete []s_;
        cout<<"destruction**********************"<<endl;
    }
    SString& operator=(const SString& s);
    friend ostream& operator<<(ostream& os,SString& s)
    {
        os<<s.s_<<endl;
        return os;
    }
    SString& copy(const SString& s);//拷贝的时候要考虑互拷,长度比较大小,能不能容得下;
};
SString::SString(const char* s):len_(0),s_(NULL)
{
    while(s[len_]!=0)len_++;
    siz_=2*len_;
    s_=new char[siz_];
    for(int i=0; i<len_; i++)s_[i]=s[i];
    s_[len_]=0;//等同于'\0';
}
SString::SString(const SString& s):s_(NULL),len_(s.len_),siz_(s.siz_)
{
    s_=new char[siz_];
    for(int i=0; i<len_; i++)s_[i]=s.s_[i];
    s_[len_]=0;
}
void SString::show()
{
    for(int i=0; i<len_; i++)
        cout<<s_[i];
    cout<<endl;
}
SString& SString:: operator=(const SString& s)//默认的等号只是把指针的地址给它了;
{
    cout<<"operator=::::::::";
    copy(s);
    return *this;
}
//ostream& operator<<(ostream& os,SString& s)

SString& SString:: copy(const SString& s)//非常重要;
{
    if(len_<s.len_)
    {
        delete []s_;
        s_=new char[s.len_*2];
        len_=s.len_;
        siz_=s.siz_;
    }
    for(int i=0; i<len_; i++)s_[i]=s.s_[i];
    s_[len_]=0;
    return *this;
}
int main()
{
    char a[10]="efghij";
    SString str1,str4;
    SString str2("xyabcd");
    SString str3(str2);//如果没有赋值的话,要考虑一下这块内存够不够;
    str4=str1=str2;//在类内部仅有这种简单的赋值的话,也就是浅拷贝,从来没有new过运算符的时候需要重载运算符,从而给它分配一个新的空间;
//    str2.show();
//    str3.show();
//    str1.show();
//    str4.show();
    cout<<str1<<endl;
    cout<<str2<<endl;
    cout<<str3<<endl;
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/79979351

C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝

C++类的赋值运算符“=”重载,以及深拷贝和浅拷贝 在面向对象程序设计中,对象间的相互拷贝和赋值是经常进行的操作。 如果对象在申明的同时马上进行初始化操作,则称之为拷贝运算。例如: class1 A(...
  • liubing8609
  • liubing8609
  • 2014-11-23 14:51:30
  • 3183

Objective-C中copy的使用(深拷贝、浅拷贝详解)

摘要 在Objective-C中,一个对象可以调用copy或mutableCopy方法来创建一个副本对象,本文着重讲解如何正确使用copy的功能.  首先,什么是copy?  ...
  • hongfengkt
  • hongfengkt
  • 2015-08-14 14:44:03
  • 1505

C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字

1、在C++编码过程中,类的创建十分频繁。 简单的功能,当然不用考虑太多,但是从进一步深刻理解C++的内涵,类的结构和用法,编写更好的代码的角度去考虑,我们就需要用到标题所提到的这些内容。 最近,在看...
  • shine_journey
  • shine_journey
  • 2016-11-08 14:39:29
  • 2680

【iOS】自定义对象深拷贝、浅拷贝

问题情境 其实这是学习ios第二天,看了斯坦福大学的2013年秋季iOS公开课,做了一个纸牌匹配小游戏。其中遇到的问题不少,关于object-c的学习就不再赘述,其中的一个问题我觉得在这里记一笔,对今...
  • yzt33
  • yzt33
  • 2015-05-20 21:28:32
  • 1871

python 深拷贝使用

python深拷贝使用,很有意思的一段代码
  • littlebo01
  • littlebo01
  • 2014-04-09 17:45:47
  • 2498

iOS 浅拷贝和深拷贝的区别? copy和mutableCopy的区别?

1.概念       我们在声明一个变量时怎么给变量赋值呢?      第一种情况:将其它变量的值直接拿过来赋值,例如Person *person = 0x100104520;      Person...
  • vbirdbest
  • vbirdbest
  • 2016-07-09 16:54:03
  • 1421

copy和mutableCopy到底是浅拷贝还是深拷贝?

请尊重原作者的辛苦劳动,转载请注明出处。 实践是检验真理的唯一标准。下面就让我们在实践中认识copy和mutableCopy的共同点和区别。 1.copy和mutableCopy的实现过程。 想要一个...
  • joe1209
  • joe1209
  • 2014-08-14 19:57:19
  • 1642

漫步IOS--引用计数函数和深浅拷贝

引用计数函数 1 alloc  开辟内存空间,让被开辟的空间的引用计数变为1,这是从0到1得过程 什么时候看到alloc什么时候开辟空间。 类方法是没办法去调用实例方法的,也没办法改变实例变量。 凡...
  • u013465022
  • u013465022
  • 2015-01-20 16:54:43
  • 800

ios-关于深拷贝和浅拷贝和属性中的copy和strong的区别

深拷贝就是把内容拷贝一份产生一份新的对象,新对象计数器为1,源对象计数器不变。而浅拷贝是指针拷贝,把地址给你,你和我指向同一个对象,源对象计数器加一,源对象和副本的计数器相同。我们知道在OC中的拷贝函...
  • ZCMUCZX
  • ZCMUCZX
  • 2017-07-14 21:06:29
  • 432

NSString深浅复制的见解

由此可以看出:对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的)...
  • u013770512
  • u013770512
  • 2014-05-22 09:54:33
  • 1197
收藏助手
不良信息举报
您举报文章:重载=号的时候,copy这一步使用深拷贝非常重要
举报原因:
原因补充:

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