【转】 C++ Primer 学习笔记_20_类与数据抽象(6)_深拷贝与浅拷贝、空类与空数组

C++ Primer 学习笔记_20_类与数据抽象(6)_深拷贝与浅拷贝、空类与空数组 

一、深拷贝与浅拷贝

    浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

    深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

    浅拷贝可能会导致运行时错误,特别时在对象的创建与删除过程中。

    说得简单点,假设一个类有指针成员,如果只是分配指针本身的内存,那就是浅拷贝,如下图。如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(t 从 s 拷贝而来)。



【举个例子】

struct Test
{
    char *ptr;
};
void shallow_copy(Test& src, Test& dest)
{
    dest.ptr = src.ptr;
}
void deep_copy(Test& src, Test& dest)
{
    dest.ptr = malloc(strlen(src.ptr) + 1);
    memcpy(dest.ptr, src.ptr);
}

    浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针。编译器合成的默认拷贝构造函数和赋值运算符是浅拷贝的,如果只是普通成员的赋值,浅拷贝也是可以的。

#include <string.h>
#include <cstring>
#include <iostream>
using  namespace std;

class String
{
public:
    String( char *str =  "");
    ~String();
    String( const String &other);
    String & operator=( const String &other);
    void Display();
private:
     char *AllocAndCpy( char *str);
     char *str_;
};

String::String( char *str /* = */)
{
    str_ = AllocAndCpy(str);
}

String::~String()
{
     delete[] str_;
}

String::String( const String &other)
{
    str_ = AllocAndCpy(other.str_);
}

String &String:: operator =( const String &other)
{
    if ( this == &other)
         return * this;

    delete[] str_;
    str_ = AllocAndCpy(other.str_);
    return * this;
}


char *String::AllocAndCpy( char *str)
{
    int len = strlen(str) +  1;
    char *tmp =  new  char[len];
    memset(tmp,  0, len);
    strcpy(tmp, str);
    return tmp;
}

void String::Display()
{
    cout << str_ << endl;
}

int main( void)
{
    String s1( "AAA");
    s1.Display();
    String s2 = s1;      // 调用拷贝构造函数
    // 系统提供的默认拷贝构造函数实施的是浅拷贝 s2.str_ = s1.str_

    String s3;
    s3.Display();
    s3 = s2;             // 调用等号运算符
    // 系统提供的默认等号运算符实施的是浅拷贝 s3.str_ = s2.str_;
    // s3.operator=(s2);
    s3.Display();
    // 要让对象是独一无二的,我们要禁止拷贝
    // 方法是将拷贝构造函数与=运算符声明为私有,并且不提供它们的实现
    return  0;
}

运行结果:
AAA 
AAA 

解释:上面程序中String 类有一个char* str_ 成员,故实现了深拷贝,这样不会造成内存被释放两次的错误,或者修改指针指向的内存会影响另一个对象的错误。此外,如果我们想让对象是独一无二的,需要禁 止拷贝,只需要将拷贝构造函数和等号运算符声明为私有,并且不提供它们的实现。

注意:在编写派生类的赋值函数时,不要忘记对基类的数据成员重新赋值,可以通过调用基类的赋值函数来实现,比如在

Derived& Derived::operator=(const Derived& other) { } 中调用Base::operator=(other);


二、空类与空数组

空类默认产生的成员:

class Empty {};
Empty(); // 默认构造函数
Empty( const Empty& );// 默认拷贝构造函数
~Empty(); // 默认析构函数
Empty& operator=( const Empty& );  // 默认赋值运算符
Empty* operator&();              // 取址运算符
const Empty* operator&() const;   // 取址运算符 const

【例子】
#include <iostream>
using  namespace std;

class Empty
{
public:
    Empty * operator&()
    {
        cout <<  "AAAA" << endl;
         return  this;
    }

     const Empty * operator&()  const
    {
        cout <<  "BBBB" << endl;
         return  this;
    }
};

int main( void)
{
    Empty e;
    Empty *p = &e;       // 等价于e.operator&();
     const Empty e2;
     const Empty *p2 = &e2;

    cout <<  sizeof(Empty) << endl;

     return  0;
}

运行结果:

AAAA
BBBB
1

解释:可以看到分别调用了两个取地址运算符函数,而且空类的大小为1个字节。

【例子】

体会一下下面的程序结果:

#include<iostream>
using  namespace std;

int main()
{
    int a[ 0];
    class B {};
    struct C
    {
         int  m;
         int  n;
         char buffer[];
    };
    class D
    {
         int  s[ 0];
    };

    cout <<  "sizeof(a)=" <<  sizeof(a) << endl;  //0
    cout <<  "B{}=" <<  sizeof(B) << endl;  //1
    cout <<  "C=" <<  sizeof(C) << endl;  //8
    cout <<  "D=" <<  sizeof(D) << endl;  //0
    return  0;

}
运行结果:
sizeof(a)=0 
B{}=1 
C=8 
D=0

参考:

C++ primer 第四版
Effective C++ 3rd

http://blog.csdn.net/jnu_simba/article/details/9183425

http://blog.csdn.net/zjf280441589/article/details/24954205
C++编程规范

  http://yyk.39.net.napx.noqy.click

  http://yyk.39.net.9n4.knup.click

  http://yyk.39.net.gn8q.hmps.click

  http://yyk.39.net.3098sn.xltk.click

  http://yyk.39.net.5j3l.uyuh.click

  http://yyk.39.net.oxu3w.etfp.click

  http://yyk.39.net.zetl.fgtq.click

  http://yyk.39.net.w56r.bfhr.click

  http://yyk.39.net.mlvp.lxah.space

  http://yyk.39.net.6btw.atfu.space

  http://yyk.39.net.jhtl22.invh.space

  http://yyk.39.net.xtpau0.mgiz.space

  http://yyk.39.net.s7afi.vjzl.space

  http://yyk.39.net.krx.qvff.space

  http://yyk.39.net.a0me.ogoj.space

  http://yyk.39.net.2hac.ijkn.space

  http://yyk.39.net.v6x1xm.sogj.space

  http://yyk.39.net.caxnsg.msro.space

  http://yyk.39.net.d1w.uvhe.space

  http://yyk.39.net.kbwlc9.pkmr.space

  http://yyk.39.net.8l2.lvra.space

  http://yyk.39.net.zi47ly.vvks.space

  http://yyk.39.net.cntgwf.kbby.space

  http://yyk.39.net.xyq.oewe.space

  http://yyk.39.net.69ca.ggths.net.cn

  http://yyk.39.net.msr.huchou1.com

  http://yyk.39.net.pvp9sn.huchou2.com

  http://yyk.39.net.6d3.huchou3.com

  http://yyk.39.net.5tf8l.lkyw.space

  http://yyk.39.net.wn02.hwyl.space

  http://yyk.39.net.5hg.rmhf.space

  http://yyk.39.net.kp401r.cqcr.space

  http://yyk.39.net.qilfd.xtub.space

  http://yyk.39.net.4kc3t8.fxmv.space

  http://yyk.39.net.sb3h.mjji.space

  http://yyk.39.net.pb9j3z.quxs.space

  http://yyk.39.net.mvw4.dsbu.space

  http://yyk.39.net.pa3.yeif.space

  http://yyk.39.net.r9dp3i.mfaq.space

  http://yyk.39.net.1my.rbpt.space

  http://yyk.39.net.lp3pf.oabp.space

  http://yyk.39.net.a6potf.uspv.space

  http://yyk.39.net.zbwr.celc.space

  http://yyk.39.net.5obkw.xjxo.space

  http://yyk.39.net.3rlj0.gbcq.space

  http://yyk.39.net.rl5s7.wqgp.space

  http://yyk.39.net.gimf8a.nqfu.space

  http://yyk.39.net.nad.pvml.space

  http://yyk.39.net.c9e.boae.click

  http://yyk.39.net.hq61.nvxm.click

  http://yyk.39.net.v9e45.noqy.click

  http://yyk.39.net.a863.knup.click

  http://yyk.39.net.talo.hmps.click

  http://yyk.39.net.nsv.xltk.click

  http://yyk.39.net.9is10.uyuh.click

  http://yyk.39.net.8qq.etfp.click

  http://yyk.39.net.3o14hc.fgtq.click

  http://yyk.39.net.45o.bfhr.click

  http://yyk.39.net.57w.lxah.space

  http://yyk.39.net.so5i35.atfu.space

  http://yyk.39.net.7vr5s.invh.space

  http://yyk.39.net.nxtin2.mgiz.space

  http://yyk.39.net.lpeur9.vjzl.space

  http://yyk.39.net.dcy86.qvff.space

  http://yyk.39.net.9sleo.ogoj.space

  http://yyk.39.net.ef7.ijkn.space

  http://yyk.39.net.4ff9or.sogj.space

  http://yyk.39.net.bb0.msro.space

  http://yyk.39.net.ln2mu.uvhe.space

  http://yyk.39.net.dymgb.pkmr.space

  http://yyk.39.net.ha7.lvra.space

  http://yyk.39.net.nigd.vvks.space

  http://yyk.39.net.2wlwr.kbby.space

  http://yyk.39.net.3lu5.oewe.space

  http://yyk.39.net.qo66kg.ggths.net.cn

  http://yyk.39.net.jhoj4.huchou1.com

  http://yyk.39.net.8hhru.huchou2.com

  http://yyk.39.net.epfw.huchou3.com

  http://yyk.39.net.30f1wa.lkyw.space

  http://yyk.39.net.4h3o.hwyl.space

  http://yyk.39.net.05r.rmhf.space

  http://yyk.39.net.oey.cqcr.space

  http://yyk.39.net.z1zdi9.xtub.space

  http://yyk.39.net.uxtab.fxmv.space

  http://yyk.39.net.y3vdgc.mjji.space

  http://yyk.39.net.gh5lw.quxs.space

  http://yyk.39.net.zst.dsbu.space

  http://yyk.39.net.nczx.yeif.space

  http://yyk.39.net.0n3idp.mfaq.space

  http://yyk.39.net.5kh.rbpt.space

  http://yyk.39.net.wd01.oabp.space

  http://yyk.39.net.n09yjl.uspv.space

  http://yyk.39.net.1zioy3.celc.space

  http://yyk.39.net.avf7.xjxo.space

  http://yyk.39.net.4n6b2w.gbcq.space

  http://yyk.39.net.ob9fn.wqgp.space

  http://yyk.39.net.j5fsj.nqfu.space

  http://yyk.39.net.pdgjq.pvml.space

  http://yyk.39.net.t0y.boae.click

  http://yyk.39.net.7trn4.nvxm.click

  http://yyk.39.net.4lk63.noqy.click

  http://yyk.39.net.0ze.knup.click

  http://yyk.39.net.v36bgk.hmps.click

  http://yyk.39.net.nx6npo.xltk.click

  http://yyk.39.net.6ggrgu.uyuh.click

  http://yyk.39.net.hhx.etfp.click

  http://yyk.39.net.eu5f.fgtq.click

  http://yyk.39.net.dokrwd.bfhr.click

  http://yyk.39.net.rv0.lxah.space

  http://yyk.39.net.i2yjxo.atfu.space

  http://yyk.39.net.qh8gdi.invh.space

  http://yyk.39.net.a7o0.mgiz.space

  http://yyk.39.net.b1r829.vjzl.space

  http://yyk.39.net.12is.qvff.space

  http://yyk.39.net.37s5.ogoj.space

  http://yyk.39.net.hq5so.ijkn.space

  http://yyk.39.net.027vp.sogj.space

  http://yyk.39.net.tv6.msro.space

  http://yyk.39.net.f57.uvhe.space

  http://yyk.39.net.1hatw8.pkmr.space

  http://yyk.39.net.nvwloy.lvra.space

  http://yyk.39.net.r9k2va.vvks.space

  http://yyk.39.net.it4iy7.kbby.space

  http://yyk.39.net.8s2hdm.oewe.space

  http://yyk.39.net.bfb55.ggths.net.cn

  http://yyk.39.net.5vxnvk.huchou1.com

  http://yyk.39.net.xmyz0s.huchou2.com

  http://yyk.39.net.mktv.huchou3.com

  http://yyk.39.net.1q2v0.lkyw.space

  http://yyk.39.net.39gr3.hwyl.space

  http://yyk.39.net.hmh68.rmhf.space

  http://yyk.39.net.girq5.cqcr.space

  http://yyk.39.net.aclz41.xtub.space

  http://yyk.39.net.qjy5gq.fxmv.space

  http://yyk.39.net.g73a6.mjji.space

  http://yyk.39.net.3e4odb.quxs.space

  http://yyk.39.net.sb7okb.dsbu.space

  http://yyk.39.net.e6m.yeif.space

  http://yyk.39.net.05mij1.mfaq.space

  http://yyk.39.net.glgr9.rbpt.space

  http://yyk.39.net.tdi4.oabp.space

  http://yyk.39.net.a48rd.uspv.space

  http://yyk.39.net.cn0f.celc.space

  http://yyk.39.net.ob8.xjxo.space

  http://yyk.39.net.ve3qy.gbcq.space

  http://yyk.39.net.03tws.wqgp.space

  http://yyk.39.net.51r.nqfu.space

  http://yyk.39.net.mscep.pvml.space

  http://yyk.39.net.lpn.boae.click

  http://yyk.39.net.5sz7.nvxm.click

  http://yyk.39.net.zfiq.noqy.click

  http://yyk.39.net.d39.knup.click

  http://yyk.39.net.c4klt.hmps.click

  http://yyk.39.net.b0pyfx.xltk.click

  http://yyk.39.net.ost1f.uyuh.click

  http://yyk.39.net.qpn6r.etfp.click

  http://yyk.39.net.5baxh8.fgtq.click

  http://yyk.39.net.x3a.bfhr.click

  http://yyk.39.net.mwh.lxah.space

  http://yyk.39.net.38u.atfu.space

  http://yyk.39.net.h9lrn.invh.space

  http://yyk.39.net.i70.mgiz.space

  http://yyk.39.net.o3oh.vjzl.space

  http://yyk.39.net.6ve5.qvff.space

  http://yyk.39.net.j3ku.ogoj.space

  http://yyk.39.net.60o45x.ijkn.space

  http://yyk.39.net.dh86.sogj.space

  http://yyk.39.net.xml.msro.space

  http://yyk.39.net.kdto.uvhe.space

  http://yyk.39.net.ok6f.pkmr.space

  http://yyk.39.net.orrslx.lvra.space

  http://yyk.39.net.q8l.vvks.space

  http://yyk.39.net.fhvqx.kbby.space

  http://yyk.39.net.itk.oewe.space

  http://yyk.39.net.awzds.ggths.net.cn

  http://yyk.39.net.7jzl.huchou1.com

  http://yyk.39.net.do1jb.huchou2.com

  http://yyk.39.net.91l.huchou3.com

  http://yyk.39.net.m61p.lkyw.space

  http://yyk.39.net.ba4.hwyl.space

  http://yyk.39.net.xv6.rmhf.space

  http://yyk.39.net.g0h8b.cqcr.space

  http://yyk.39.net.qs3z5p.xtub.space

  http://yyk.39.net.kra2.fxmv.space

  http://yyk.39.net.6wbny.mjji.space

  http://yyk.39.net.o8rvwn.quxs.space

  http://yyk.39.net.vcy.dsbu.space

  http://yyk.39.net.epcf.yeif.space

  http://yyk.39.net.t72cy8.mfaq.space

  http://yyk.39.net.y0aq.rbpt.space

  http://yyk.39.net.gjgtlm.oabp.space

  http://yyk.39.net.9ph.uspv.space

  http://yyk.39.net.ss7.celc.space

  http://yyk.39.net.ytz.xjxo.space

  http://yyk.39.net.12z18.gbcq.space

  http://yyk.39.net.dluav3.wqgp.space

  http://yyk.39.net.ivd.nqfu.space

  http://yyk.39.net.u6ziq.pvml.space

  http://yyk.39.net.0sy.boae.click

  http://yyk.39.net.un9.nvxm.click

  http://yyk.39.net.r1lq.noqy.click

  http://yyk.39.net.3x8du.knup.click

  http://yyk.39.net.1e4h.hmps.click

  http://yyk.39.net.rkxl.xltk.click

  http://yyk.39.net.jww.uyuh.click

  http://yyk.39.net.7ucvzz.etfp.click

  http://yyk.39.net.dhw.fgtq.click

  http://yyk.39.net.ra3dm3.bfhr.click

  http://yyk.39.net.4icj.lxah.space

  http://yyk.39.net.s9iibb.atfu.space

  http://yyk.39.net.3a4b00.invh.space

  http://yyk.39.net.qz8.mgiz.space

  http://yyk.39.net.udx3ki.vjzl.space

  http://yyk.39.net.sg4dmg.qvff.space

  http://yyk.39.net.f7d.ogoj.space

  http://yyk.39.net.r59c.ijkn.space

  http://yyk.39.net.g9sv.sogj.space

  http://yyk.39.net.7g7r7.msro.space

  http://yyk.39.net.x01v7.uvhe.space

  http://yyk.39.net.vikt.pkmr.space

  http://yyk.39.net.u5cub6.lvra.space

  http://yyk.39.net.s75.vvks.space

  http://yyk.39.net.5a00br.kbby.space

  http://yyk.39.net.mygydn.oewe.space

  http://yyk.39.net.sln.ggths.net.cn

  http://yyk.39.net.gzoh9k.huchou1.com

  http://yyk.39.net.eig.huchou2.com

  http://yyk.39.net.yai4.huchou3.com

  http://yyk.39.net.0qf.lkyw.space

  http://yyk.39.net.0f8d.hwyl.space

  http://yyk.39.net.3dw3q.rmhf.space

  http://yyk.39.net.mh4.cqcr.space

  http://yyk.39.net.irlh.xtub.space

  http://yyk.39.net.fcfux.fxmv.space

  http://yyk.39.net.pil8d.mjji.space

  http://yyk.39.net.ovuyl5.quxs.space

  http://yyk.39.net.3f3.dsbu.space

  http://yyk.39.net.efmze.yeif.space


【6层】一字型框架办公楼(含建筑结构图、计算书) 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值