C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第8节:拷贝对象

QGroundControl实现多机控制 前言 作为西安电子科技大学的本科生一名,目前在研究关于无人机导航规划与轨迹控制方面。 目前在跟导师做关于雷达无人机的一个项目,在这里记录一下关于QGC地面站实现多机控制的一些方法。 某些地方写的可能不是很完善,欢迎大家补充。 目前该文章还未写完,后期本人会继续编写 多机控制原理 多机地面站支持TCP,UDP和串口等三种连接方式,首先我们需要对这两种连接方式抽象出一个基类LinkInterface,提供两个虚函数分别对应于数据接受和发送处理,针对于不同的连接方式实现TCP,UDP和串口连接相对应的子类TCPL 阅读详情

12.8 拷贝对象

1.      一个对象有两种拷贝的途径:初始化(包括函数参数传递、返回值)和赋值。概念上,这两种操作都是通过拷贝构造函数和赋值操作符实现的。

2.      如果类 X 非模板构造函数的第一个参数类型是 X& 、 const X& 、 volatile X& 或 const volatile X& ,且没有其他参数或其他参数有默认值,那么该构造函数就是个拷贝构造函数。 【例如: X::X(const X&) 和 X::X(X&, int=1) 都是拷贝构造函数。

class X {

// ...

public:

X(int);

X(const X&, int = 1);

};

X a(1); // 调用 X(int);

X b(a, 0); // 调用 X(const X&, int);

X c = b; // 调用 X(const X&, int);

】【注:可以同时声明各种各样的拷贝构造函数。】【例

class X {

// ...

public:

X(const X&);

    X(X&); // OK

}; 】【注:如果一个类 X 仅有一个参数为 X& 的拷贝构造函数, const X 或 volatile X 类型的初始化器不能用来初始化该类 X 的对象(不论是否 cv 限定)。【例:

struct X {

X(); // 默认构造函数

X(X&); // 非 const 类型参数的拷贝构造函数

};

const X cx;

X x = cx; // 错误 – X::X(X&) 不能把 cx 拷贝给 x

】】

【按:因为这种构造函数没有任何存在的意义;如果是内置类型的这种重载,倒是还有存在的意义】

3.         类 X 的构造函数的第一个参数如果是 X 类型并且没有其他参数,或其他参数都有默认值,那么这个声明是非法的。永远不能实例化试图拷贝自己所在类的对象的模板成员函数。【例:

struct S {

template<typename T> S(T);

};

S f();

void g() {

S a( f() ); // 不能实例化成员模板

}

4.         如果用户没有显式声明拷贝构造函数,编译器会隐式地声明一个。这样,如下形式的定义:

struct X {

X(const X&, int);

};

会隐式地声明一个拷贝构造函数。如果用户声明的构造函数后来定义为:

X::X(const X& x, int i =0) { /* ... */ }

    那么,在使用拷贝构造函数的地方就会出现非法的二义性;这种情况不需要诊断信息 。

5.         类 X 的隐式拷贝构造函数是 X::X(const X&) 这种形式,如果它满足以下条件:

a)         X 的每个直接基类或虚基类 B 都有一个第一个参数是 const B& 或 const volatile B& 的拷贝构造函数,并且

b)        对于 X 的每个类型为 M 类(或对象数组)的非静态数据成员,每个这样的类都有一个第一个参数是 const M& 或 const volatile M& 的拷贝构造函数。

否则, X 的隐式拷贝构造函数会是 X::X(X&) 这种形式。

隐式拷贝构造函数是 inline public 属性的。

6.         类 X 隐式声明的拷贝构造函数满足如下条件就被称为是 trivial 的:

a)         X 没有虚函数,没有虚基类,并且

b)        每个直接基类都有一个 trivial 的拷贝构造函数,并且

c)        对于 X 的每个类型为类(或对象数组)的非静态数据成员都有一个 trivial 的拷贝构造函数;

否则,拷贝构造函数就不是 trivial 的。

7.         如果使用隐式声明的拷贝构造函数来初始化该类或其继承类的一个对象,它会被隐式地定义。【注:在某些情况下编译器会做优化而不使用拷贝构造函数,但它仍然被隐式定义。】隐式定义拷贝构造函数的类如果有以下情况之一,程序就是非法的:

a)         类的非静态类成员(或对象数组)的拷贝构造函数无法访问或有二义性

b)        基类的拷贝构造函数无法访问或有二义性

在拷贝构造函数隐式定义之前,该类的所有直接基类和虚基类的拷贝构造函数都必须已经隐式定义。【注:隐式拷贝构造函数有一个异常说明。】

8.         隐式定义的拷贝构造函数对其子对象执行按成员拷贝。拷贝的顺序与用户自定义的构造函数中的初始化顺序一致。每个子对象都按照适合它们的类型来拷贝:

a)         如果子对象是类,就使用该类的拷贝构造函数;

b)        如果子对象是数组,每个元素按照其合适的类型拷贝;

c)        如果子对象是标量,就使用内建的赋值操作符。

隐式定义的拷贝构造函数对虚基类子对象只能拷贝一次。

9.         用户声明的拷贝赋值操作符 X::operator= 是 X 的非静态、非模板成员函数,只有一个参数,为 X 、 X& 、 const X 、 volatile X& 、或者 const volatile X& 。【注:赋值操作符只能重载为一个参数的函数,参加 13.5.3 】【注:可以声明多个拷贝赋值操作符】【注:如果用户声明的拷贝赋值操作符的参数类型为 X& , const X 类型的表达式不能赋值给 X 类型的对象。【例:

struct X {

X();

X& operator=(X&);

};

const X cx;

X x;

void f() {

x = cx; // 错误 : X::operator=(X&) 不能将 cx 赋值给 x

}

】

10.     如果类定义没有显式声明一个拷贝赋值操作符,编译器会隐式声明一个。形式如下为: X::operator=(const X&) ,如果满足以下条件:

a)         X 的每个直接基类或虚基类 B 都有一个第一个参数是 const B& 或 const volatile B& 的拷贝赋值操作符,并且

b)        对于 X 的每个类型为 M 类(或对象数组)的非静态数据成员,每个这样的类都有一个第一个参数是 const M& 或 const volatile M& 的拷贝赋值操作符。

否则, X 的隐式拷贝赋值操作符会是 X::operator=(X&) 这种形式。

类 X 的隐式拷贝赋值操作符返回类型是 X& ,返回调用者那个对象,即用来给别人赋值的对象。隐式拷贝赋值操作符的属性是 inline public 。如果用户不声明的话,拷贝赋值操作符总是被隐式声明,所以基类的拷贝赋值操作符总是被派生类的隐藏。使用 using-declaration 从基类介绍进来的带一个参数的赋值操作符,看起来可以作为派生类的拷贝赋值操作符,却不会被认为是拷贝赋值操作符的显式声明,因而也不会阻止隐式拷贝赋值操作符的声明; using-declaration 介绍进来赋值操作符会被派生类的隐式拷贝赋值操作符隐藏掉。

11.     类 X 的隐式拷贝赋值操作符如果满足以下条件就被认为是 trivial 的:

a)         X 没有虚函数,没有虚基类,并且

b)        每个直接基类都有一个 trivial 的拷贝赋值操作符,并且

c)        对于 X 的每个类型为类(或对象数组)的非静态数据成员都有一个 trivial 的拷贝赋值操作符;

否则,拷贝赋值操作符就不是 trivial 的。

12.     如果使用隐式声明的拷贝赋值操作符来初始化该类或其继承类的一个对象,它会被隐式地定义。隐式定义拷贝赋值操作符的类如果有以下情况之一,程序就是非法的:

a)         有一个非静态的 const 数据成员

b)        有一个非静态的引用类型的数据成员

c)        类的非静态类成员(或对象数组)的拷贝赋值操作符无法访问或有二义性

d)        基类的拷贝赋值操作符无法访问

在拷贝赋值操作符隐式定义之前,该类的所有直接基类和虚基类的拷贝赋值操作符都必须已经隐式定义。【注:隐式拷贝赋值操作符有一个异常说明。】

13.     隐式定义的拷贝构造函数对其子对象执行按成员拷贝。直接基类子对象以它们在继承列表中的出现顺序先拷贝,接着是非静态数据成员以他们声明的顺序拷贝。每个子对象都按照适合它们的类型来拷贝:

a)         如果子对象是类,就使用该类的拷贝赋值操作符(就好像被显式地限定了一样,即忽略任何可能的来自更继承类的虚函数覆盖);

b)        如果子对象是数组,每个元素按照其合适的类型拷贝;

c)        如果子对象是标量,就使用内建的赋值操作符。

虚基类的子对象被隐式的赋值操作符赋值多少次是没有定义的。【例:

struct V { };

struct A : virtual V { };

struct B : virtual V { };

struct C : B, A { };

V 的子对象是否被 C 的赋值操作符赋值赋值了 2 次是没有定义的。】

14.     对象的拷贝构造函数、拷贝赋值函数被隐式调用但是这些特殊函数却没有访问权限,那么程序是非法的。【注:使用拷贝构造函数、拷贝赋值函数将一个对象拷贝到另一个对象是不会改变任何对象的内存布局的。】

15.     当某些条件满足时,允许编译器省略拷贝构造函数,即使该对象的拷贝构造函数 / 析构函数有副作用。这种情况下,编译器将省略了拷贝操作的源和目的对象看做是访问同一个对象的不同方法;对象的销毁时机是在:如果不做优化,最后一个对象销毁的时候。在下述情况中,拷贝构造函数是允许省略的(为了消除多次拷贝):

a)         函数的返回类的 return 语句,当表达式是 non-volatile 的自动对象的名字,且返回类型的 cv 限定性与自动对象相同时,拷贝构造函数可以省略,此时自动对象被直接在返回值处构造

b)        当一个还没被引用绑定的临时对象要被拷贝到一个同样 cv 限性定的对象时,拷贝构造函数可以省略,此时临时对象被直接在目标对象处构造

【例:

       class Thing {

public:

Thing();

˜Thing();

Thing(const Thing&);

};

Thing f() {

Thing t;

return t;

}

Thing t2 = f();

这里,省略的条件可以被合并,这样就可以避免 2 次调用 Thing 类的拷贝构造函数:本地自动对象 t 拷贝到 return 的临时对象;临时对象拷贝到 t2 中。其实站在效率的角度来说,本地自动对象 t 可以看做是用来直接初始化全局对象 t2 的,然后 t 在程序退出时销毁。

】

 

 

YOLO26魔改神技:YOLO26引入SimAM(无参注意力):不增加网络参数的3D能量函数提点黑科技 文章摘要 2026年YOLO26模型发布引发边缘计算革命,但特定场景精度不足问题催生注意力机制改进需求。本文聚焦无参数注意力机制SimAM,基于神经科学理论通过3D能量函数直接计算神经元权重,实现零参数量提升模型性能。文章深度解析YOLO26四大创新架构,对比SimAM与传统注意力机制差异,并探讨其在YOLO26中的集成方案。研究显示,SimAM在不增加模型体积前提下显著提升mAP指标,特别适合边缘端部署。全文涵盖架构设计、代码实现、竞品对比、部署方案等维度,为轻量化视觉模型优化提供系统解决方案。 阅读详情

相关推荐

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第1节:构造函数

12. 特殊成员函数【按:以下简称特殊函数或这些函数;如没有特别说明,对象是指类实例化的对象, 最外层的对象是指最继承子对象】特殊成员函数包括默认构造函数、拷贝构造函数、拷贝赋值操作符和析构函数。除了12.1中的情况,当程序不显式地声明这些函数时,编译器会隐式声明它们;如果使用了它们,编译器还会隐式地定义这些函数,如12.1,12.4和12.8所示。

declspec的专栏 756

html python mysql交互_干货!Python与MySQL数据库的交互实战

安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上,就用如下链接找一个合适的安装包,进行安装,这个就不细说了。https://www.lfd.uci.edu/~gohlke/pythonlibs/使用Python连接MySQL数据库1)六个常用的连接参数参数...

weixin_31043555的博客 1561

C++标准ISO-IEC-14882-2003:第9章:类 -第1节:类名

 9 类1.        类是一种类型。在它的作用域内,该类型的名字称为类名。类名:       标识符       模板idClass-specifiers和elaborated-type-specifiers用来描述类名。类的对象是由一系列(可能为空)的成员和基类对象。clas

declspec的专栏 936

ZYNQ新手必看:你的PS端DDR和QSPI配置真的对了吗?从原理到实操的避雷指南

本文深入解析ZYNQ PS端外设配置的关键要点,特别是DDR匹配和QSPI时钟优化的实战技巧。通过详细案例和配置清单,帮助开发者避免常见错误,确保系统稳定性和启动可靠性。适合ZYNQ新手和需要优化最小系统的开发者参考。

weixin_28675839的博客 445

S32K144 ADC硬件触发+DMA传输实战:从寄存器配置到数据采集全流程

本文详细解析了S32K144微控制器中ADC硬件触发与DMA传输的协同工作机制,提供了从寄存器配置到数据采集的全流程实战指南。通过PDB定时触发ADC转换,并利用DMA实现数据自动搬运,构建了高效、实时的汽车级数据采集系统,有效释放CPU资源,满足汽车电子应用的严苛要求。

weixin_29194693的博客 475

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第2节:临时对象

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Styl

declspec的专栏 566

​开源大模型实战:GLM-4.1V-Thinking本地部署教程(附API调用代码)

​在AI应用从“能用”向“好用”进阶的当下,​的需求愈发强烈:企业需保障数据安全(如医疗影像、金融报告不外传),开发者追求定制化能力(如微调模型适配垂直场景),科研团队则依赖离线环境处理敏感数据。智谱AI开源的​(10B级参数,支持图像、视频、文档多模态推理)凭借的优势,成为本地部署的热门选择。不过,对于“不想折腾技术”的普通用户或快速验证需求的团队而言,​,无需安装配置,打开即用,堪称“零门槛”体验的捷径。本文将分为两部分:先手把手教你​(适合有技术背景的用户),再对比介绍。

gogoMark的博客 1340

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第6节:初始化

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

declspec的专栏 760

2026 企查查/天眼查:IP频率限制 + 验证码策略,企业工商数据采集实战

企业工商数据采集技术解析与解决方案 本文深度剖析了2026年企查查和天眼查平台的反爬机制与技术对抗方案。主要内容包括: 反爬机制分析: 采用JA4+ TLS指纹识别、极验v6验证码等多层防护 IP限制策略严格区分未登录/普通/VIP账号 精准识别并封禁数据中心IP 核心解决方案: 构建高可用住宅代理池,动态轮换真实用户IP 基于YOLOv8的验证码缺口识别技术(准确率99%) 分布式架构设计,支持千万级数据采集 多账号池管理与行为模拟技术 技术亮点: 动态住宅IP池实现1%以下封禁率 Playwright浏

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1327

地平线旭日X3 安装xfce桌面+VNC查看USB摄像头

VNC是Virtual Network Computing的缩写,它是一种使用RFB(Remote Frame Buffer)协议的用于控制远程电脑的图形桌面分享系统。xfce桌面相比于GNOME桌面更加轻量,占用的资源更少,在没有GPU的设备上也可以运行(旭日的Desktop版本从外观上好像就是xfce桌面,具体没有尝试)。可以使用专用的VNC客户端连接到开发板,例如vnc viewer。板子默认带有openssh-server,因此,WiFi热点连接成功后,就可以使用ssh登录开发板了。

bingdund的博客 509

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第3节:类型转换

12.3 类型转换1.        对象的类型转换可以用构造函数和转换函数来指定。这些转换称为用户自定义的转换,用作隐式类型转换、初始化和显式类型转换。2.        只有在无二义性的情况下,用户自定义的转换才有效。转换遵循权限控制规则。权限检查在二义性解析之后发生。3.        【13.3讨论了函数中

declspec的专栏 527

xtop:multi_driven_net与incomplete_timing_cell fail reason 分析

man multi_driven_net”可以得知,这个问题是multi driven结构引起的,使用命令“get_failed_pins -reason multi_driven_net”,获取violation pin。“man incomplete_timing_cell”可以得知,这个fail reason的原因是缺少timing library cell,检查并补全后这个错误就显示了。这里选择的解决方法是修改lib文件,把inout改成input,重新lib2idb。通过这种方法解决了问题。

m0_61544122的博客 567

一起来看看,C++11标准,那些超实用的新特性有哪些?

C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称,也称为C++0x。它由国际标准化组织(ISO)和国际电工委员会(IEC)旗下的C++标准委员会(ISO/IEC JTC1/SC22/WG21)于2011年8月12日公布,并于2011年9月正式出版。 C++11标准对C++98标准做了重大的修正和改进,C++11标准引入了许多新特性。

天恩软件工作室 974

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 245

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 392

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 341

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 79

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 349

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 305

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 439

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 215

C 语言 malloc() 详解与实战 Demo

本文详解C语言malloc()函数,涵盖其语法、内存原理及实战应用。通过动态整数、数组、结构体与链表的Demo,演示如何安全申请、使用与释放内存,强调避免内存泄漏与空指针检查的重要性,帮助开发者掌握动态内存管理核心技能。

tangPHP的博客 373

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 146

【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针

C++类与对象知识(面向过程和面向对象的初步认识,类的初步认识,类的访问限定符及封装,类的作用域、实例化,类的对象模型,this指针)

2601_96587588的博客 887

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 794
上一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第7节:构造与析构
下一篇: C++标准ISO-IEC-14882-2003:第9章:类 -第1节:类名
declspec
博客等级 码龄21年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值