Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 686|回复: 0

[默认分类] c++ 拷贝构造函数优缺点

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-1 10:07:09 | 显示全部楼层 |阅读模式

         前一段时间去面试,被人问了一个这个问题, 突然不知道怎么回答了, 后来查了查,才知道原来是怎么样了, 现在总结一下吧。
    拷贝构造函数和赋值运算符用于创建对象的副本。在某些情况下由编译器隐式调用拷贝构造函数,例如按值传递对象的时候。

    优点:
    拷贝构造函数可以很容易地复制对象。 STL容器要求所有内容可拷贝和赋值。拷贝构造函数可以比copyfrom()式的解决方法更有效,因为它们将构造和复制结合在一起。

    缺点:
    对象的隐式拷贝是C++中是错误和性能问题的来源之一。它也降低了代码的可读性,并使得对象子程序中的传递和改变变得难以跟踪。
    只有很少的类需要拷贝。绝大部分的类既不需要拷贝构造函数,也不需要赋值操作符函数。在大多数情况下,使用指针或引用可以完成相同的任务,并具有更好的性能。例如,可以通过引用或指针,而不是通过值传递函数的参数。在STL容器中存储对象的指针,而不是存储对象的拷贝。

    如果你的类需要拷贝,可以提供用于复制的方法,如copyfrom()或者clone(),而不是使用拷贝构造函数,因为这种方法不能被编译器隐式调用。如果提供的复制方法不够用,在具体情况下(如性能方面的原因,或者是因为你的类需要按值存储在STL容器中),考虑同时提供拷贝构造函数和赋值操作符函数。

    如果你的类并不需要拷贝构造函数或赋值操作符函数,你必须显式地禁用它们。要做到这一点,可以在类的私有(private)部分,添加拷贝构造函数和赋值操作符函数的空申明,但不提供任何相应的定义。因此,任何使用它们的企图都会导致链接错误(link error)。
    为了方便, 可以使用DISALLOW_COPY_AND_ASSIGN宏:

    1. // A macro to disallow the copy constructor and operator= functions
    2. // This should be used in the private: declarations for a class
    3. #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
    4. TypeName(const TypeName&);               \
    5. void operator=(const TypeName&)
    复制代码

    然后在类Foo中这样使用:


    1. class Foo { public:
    2.   Foo(int f);
    3.   ~Foo();
    4. private:
    5.   DISALLOW_COPY_AND_ASSIGN(Foo);
    6. };
    复制代码

    这样就好了


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 07:28 , Processed in 0.367761 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表