设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间03 现在时间03 缓存数据 我的天 我居然可以遇见活的大佬

我的天 我居然可以遇见活的大佬 -- 空山新雨后

查看: 1381|回复: 2

C++ 复制控制之复制构造函数的实现

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
43
主题
35
精华
0
金钱
123
积分
78
注册时间
2023-9-29
最后登录
2025-5-31

发表于 2024-5-2 00:03:10 | 显示全部楼层 |阅读模式
目录


  • 如果没有为类声明复制构造函数会怎样
  • 编译器合成的复制构造函数做了什么
  • 禁止复制
C++类用三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程
复制构造函数首先是一个构造函数,它同所有其他的构造函数一样与类同名,没有返回值。它有一个唯一的参数(错误),是该类类型的引用(一般将它声明为const,源于用于赋值的对象一般不用改变它本身的值)。于是复制构造函数的原型为:
  1. class BOOK
  2. {
  3.    public:
  4.     BOOK(const BOOK& rhs); //构造函数一
  5.     BOOK(string &name,float price = 0):_bookName(name),_price(price){}; //构造函数二
  6.     BOOK():_price(0),_bookName(""){}; //构造函数三

  7.   private:
  8.     float _price ;
  9.     string _bookName;
  10.   //....
  11. };
复制代码
什么时候被调用
复制构造函数在需要复制类对象的时候被调用,这些调用情况可以总结为:
根据一个同类型的对象显示或隐式地初始化一个对象。
1.当定义一个新对象并用一个同类型的对象对它进行初始化的时候,将显式使用复制构造函数,如:
  1. BOOK book1;
  2. BOOK book2(book1);
复制代码
当将该类型的对象传递给函数或从函数返回该类型的对象时,将隐式地调用复制构造函数。
1.作为值传递的实参传递给一个函数。
2.函数返回时复制一个对象。
3.初始化顺序容器中的元素。
如:
  1. vector<string> svec(5);
复制代码
编译器首先调用string类默认构造函数创建一个临时值,再用复制构造函数将临时值复制到每一个元素。
1.根据元素初始化列表初始化数组元素。
如:
  1. BOOK books[]={
  2.   string("book1"),
  3.   string("book2"),
  4.   string("book3"),
  5.   BOOK()
  6. };
复制代码
book数组的前三个元素将调用构造函数二进行隐式类型转换(C++隐式类型转换),然后调用复制构造函数进行数组元素的复制。如果类禁止隐式类型转换(构造函数使用了explicit声明),或希望不指定实参或多个实参,需要使用完整的构造函数语法,如数组最后一个元素的初始化。

如果没有为类声明复制构造函数会怎样

如果你没有声明一个复制构造函数,那么编译器会给声明一个。实际上,如果你自己没有声明,编译器会为类声明一个复制构造函数 ,一个赋值操作符以及一个析构函数,此外如果你没有声明任何构造函数的话,编译器也会为你声明一个合成默认构造函数。(错误)所有这些编译器自动生成的类成员函数皆为pubilc 且 inline。编译器创建的复制构造函数单纯地将来源对象的每一个非static成员拷贝到目标对象,这在很多时候是不能满足类需求的,特别是类中含有指针时,这时候就需要我们自己来写复制控制的三个特殊成员函数了。

编译器合成的复制构造函数做了什么

合成复制构造函数的行为是:对每一个非static成员进行逐个成员初始化。成员类型不同,初始化方式不一样:

  • 内置类型(如int):直接复制值。
  • 类类型:调用该类的复制构造函数进行复制。
  • 数组:这个比较特殊,因为我们知道一般不能复制数组,但在类中,复制数组时合成复制构造函数将复制数组的每一个值。
另外,合成复制构造函数对类数据成员的初始化都是放在构造函数初始化列表中进行的。

禁止复制

如果我们想禁止某个类的复制行为,我们当然不会想去定义一个复制构造函数,然而编译器却会自动为我们定义一个,那么到底该如何阻止一个类的复制行为呢?
我们可以将复制构造函数定义为private,不允许用户代码复制该类类型的对象,若进行复制将在编译时发生错误。然而类的友元和成员仍可以进行复制,解决办法是我们可以声明一个private复制构造函数却不进行定义,类成员或友元进行复制尝试时,将在程序运行时发生错误。
到此这篇关于C++ 复制控制之复制构造函数的实现的文章就介绍到这了,更多相关C++ 复制构造函数内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:20
  • 打卡月天数:0
  • 打卡总奖励:253
  • 最近打卡:2025-04-18 22:50:46
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
291
积分
44
注册时间
2023-4-17
最后登录
2025-4-18

发表于 2024-10-23 07:42:12 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
23
积分
26
注册时间
2022-12-26
最后登录
2022-12-26

发表于 7 天前 | 显示全部楼层
路过,支持一下
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

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