C++13.1.2合成复制构造函数----定义复制对象时会发生什么

本文深入探讨了复制构造函数的概念及其实现方式,包括合成构造函数的功能、如何定义自定义复制构造函数以及如何禁止对象的复制。同时介绍了复制构造函数在不同场景下的应用。

简介

  • 复制构造函数:就是构造函数的一种,只是形参是const类类型的引用。——— Sale_item(const Sale_item &orig)
//合成赋值操作符函数(下一节)
Sale_item& Sale_item::operator=(const Sale_item &rhs){//类外定义成员函数不要忘记加上类作用域Sale_item::
      isbn=rhs.isbn;//逐个进行复制
      units_sold=rhs.units_sold;
      revenue=rhs.revenue;
      return *this;//返回被赋值的那个对象
      //赋值操作符函数函数名写法:"operator ="
      //函数返回类型:类类型的引用Sale_item&
      //形参:const 类类型的引用
}
//合成复制构造操函数
Sale_item::Sale_item(const Sale_item &orig):

isbn(orig.isbn),

units_sold(orig.units_sold),

revenue(orig.revenue)

{}


//因为是构造函数,所以函数名是类名,无返回值。因为是复制构造函数,所以形参是const类类型的引用,对里面的每个元素进行复制。
//这个函数是在类外定义,所以加上类作用域Sale_item::
//**(感觉和具有初始化列表的构造函数差不多,只是形参不同,这里的形参是const类类型的引用)**
  • 用const类类型的引用做形参相当于是类的一个别名(想象一下const 普通类型的引用做形参)

  • 但是有些类必须对复制对象时发生的事情加以控制

    • 这样的类经常有一个数据成员是指针;
    • 或者有成员表示在构造函数中分配的其他资源。而另一些类在创建新对象时必须做一些特定工作。
  • 这两种情况,都必须定义复制构造函数

  • 但是有些类需要完全禁止复制。如iostream类就不允许复制。如果想要禁止复制,似乎可以省略复制构造函数,然而,如果不定义复制构造函数,编译器会默认合成一个。

  • 为了防止复制,类必须显示声明其复制构造函数为private

-如果复制构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。

  • 然而,类的友元和成员仍然可以访问,即仍然可以复制,如果想要连友元和成员中的复制也禁止,就可以声明一个private复制构造函数但不对其定义。

=========================================================================================================================

一、合成构造函数

  • 如果我们没有定义复制构造函数,编译器会为我们合成一个(默认的)。与合成的默认构造函数(12.4.1)不同,即使我们定义了其他构造函数,也会合成复制构造函数。合成复制构造函数是执行逐个成员初始化,将新对象初始化为原对象的副本。

  • 所谓逐个成员指的是编译器将现有对象的每个非static成员,依次复制到正在创建的对象。只有一个例外,每个成员的类型决定了复制该成员的含义,合成复制构造函数直接复制内置类型成员的值,类类型成员使用该类的复制构造函数进行复制。数组成员的复制是个例外,虽然一般不能复制数组,但如果一个类具有数据成员,则合成复制构造函数将复制数组,复制数组合成构造函数将复制数组的每一个元素。

class Sale_item{
private:
   std::string isbn;
   int unit_sold;
   double revenue;
};
//合成的复制构造函数
Sale_item::Sale_item(const Sale_item &orig):
isbn(orig.isbn),units_sold(orig.units_sold),revenue(orig.revenue)
{}

二、定义自己的复制构造函数

  • 复制构造函数就是接受单个类类型引用形参(const)的构造函数
clss Foo{
public:
   Foo();
   Foo(const Foo&);//声明一个复制构造函数,首先是构造函数,所以名称和类名一样,再者形参必须是const的类类型的引用

};
  • 无需显示定义复制构造函数。
  • 但是有些类必须对复制对象时发生的事情加以控制。这样的类经常有一个数据成员是指针,或者有成员表示在构造函数中分配的其他资源。而另一些类在创建新对象时必须做一些特定工作。这两种情况,都必须定义复制构造函数

  • 认识到什么情况下需要定义复制构造函数是困难的。复制构造函数也是构造函数,所以,没有返回值,名称与类名相同,可以(而且应)使用构造函数初始化列表初始化新创建对象的成员,可以在函数体中做任何其他必要工作。

三、禁止复制

  • 有些类需要完全禁止复制。如iostream类就不允许复制。如果想要禁止复制,似乎可以省略复制构造函数,然而,如果不定义复制构造函数,编译器会默认合成一个。

  • 为了防止复制,类必须显示声明其复制构造函数为private

-如果复制构造函数是私有的,将不允许用户代码复制该类类型的对象,编译器将拒绝任何进行复制的尝试。

  • 然而,类的友元和成员仍然可以访问,即仍然可以复制,如果想要连友元和成员中的复制也禁止,就可以声明一个private复制构造函数但不对其定义。
  • 声明而不定义成员函数是合法的,但是,使用未定义成员的任何尝试将导致链接失败。通过声明但不定义private复制构造函数,可以禁止任何复制类类型对象的尝试。
【语音分离】基于平均谐波结构建模的无监督单声道音乐声源分离(Matlab代码实现)内容概要:本文介绍了基于平均谐波结构建模的无监督单声道音乐声源分离方法,并提供了相应的Matlab代码实现。该方法通过对音乐信号中的谐波结构进行建模,利用音源间的频率特征差异,实现对混合音频中不同乐器或人声成分的有效分离。整个过程无需标注数据,属于无监督学习范畴,适用于单通道录音场景下的语音与音乐分离任务。文中强调了算法的可复现性,并附带完整的仿真资源链接,便于读者学习与验证。; 适合人群:具备一定信号处理基础和Matlab编程能力的高校学生、科研人员及从事音频处理、语音识别等相关领域的工程师;尤其适合希望深入理解声源分离原理并进行算法仿真实践的研究者。; 使用场景及目标:①用于音乐音频中人声与伴奏的分离,或不同乐器之间的分离;②支持无监督条件下的语音处理研究,推动盲源分离技术的发展;③作为学术论文复现、课程项目开发或科研原型验证的技术参考。; 阅读建议:建议读者结合提供的Matlab代码与网盘资料同步运行调试,重点关注谐波建模与频谱分解的实现细节,同时可扩展学习盲源分离中的其他方法如独立成分分析(ICA)或非负矩阵分解(NMF),以加深对音频信号分离机制的理解。
内容概要:本文系统介绍了新能源汽车领域智能底盘技术的发展背景、演进历程、核心技术架构及创新形态。文章指出智能底盘作为智能汽车的核心执行层,通过线控化(X-By-Wire)和域控化实现驱动、制动、转向、悬架的精准主动控制,支撑高阶智能驾驶落地。技术发展历经机械、机电混合到智能三个阶段,当前以线控转向、线控制动、域控制器等为核心,并辅以传感器、车规级芯片、功能安全等配套技术。文中还重点探讨了“智能滑板底盘”这一创新形态,强调其高度集成化、模块化优势及其在成本、灵活性、空间利用等方面的潜力。最后通过“2025智能底盘先锋计划”的实车测试案例,展示了智能底盘在真实场景中的安全与性能表现,推动技术从研发走向市场验证。; 适合人群:汽车电子工程师、智能汽车研发人员、新能源汽车领域技术人员及对智能底盘技术感兴趣的从业者;具备一定汽车工程或控制系统基础知识的专业人士。; 使用场景及目标:①深入了解智能底盘的技术演进路径与系统架构;②掌握线控技术、域控制器、滑板底盘等关键技术原理与应用场景;③为智能汽车底盘研发、系统集成与技术创新提供理论支持与实践参考。; 阅读建议:建议结合实际车型和技术标准进行延伸学习,关注政策导向与行业测试动态,注重理论与实车验证相结合,全面理解智能底盘从技术构想到商业化落地的全过程。
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模型,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安全性与鲁棒性。该模型通过Matlab代码实现,具备较强的工程应用价值和学术参考意义,适用于电力系统风险评估、脆弱性分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真与复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模与风险评估研究;②支撑高水平论文(如EI/SCI)的模型复现与算法验证;③为电网安全分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求解,提升科研效率。; 阅读建议:建议读者结合提供的网盘资源,下载完整代码与案例进行实践操作,重点关注双层优化结构与场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值