[Effective C++]条款05:了解C++默默编写并调用哪些函数

矩阵LED和矩阵按键 先说矩阵LED,如图: 下面以行几、列几的表达方法说明 三极管可以当做开关使用 由图可知,如果想让一个LED亮,那么它对应的行和列的三极管都要导通。如果这个矩阵每次只亮一个LED,那么正常写程序没问题。 如果我们想让LED1和LED6亮,其他灯不亮,则需要开启行1、行2、列1、列2,随之带来的问题就是LED2和LED5也会跟着亮起来。 解决方法类似于扫描,因为单片机运行速度很快,可以在很短的时间内开关数次而肉眼看不到。所以我们可以每次只亮一列(排)灯,亮单位时间后关掉同时开启另外一列(排),如此四次一循环 阅读详情

1、当你创建一个空的 class 类时,编译器会自动一些函数
空的 class 类

class MyClass {
    // 空的类,没有任何成员变量或成员函数
};

编译器自动生成的函数

  • 默认构造函数
  • 默认析构函数
  • 拷贝构造函数
  • 拷贝赋值操作符
  • 移动构造函数(C++11 起)
  • 移动赋值操作符(C++11 起)
class MyClass {
public:
    // 1. 默认构造函数
    MyClass() = default;

    // 2. 默认析构函数
    ~MyClass() = default;

    // 3. 拷贝构造函数
    MyClass(const MyClass& other) = default;

    // 4. 拷贝赋值操作符
    MyClass& operator=(const MyClass& other) = default;

    // 5. 移动构造函数(C++11 起)
    MyClass(MyClass&& other) = default;

    // 6. 移动赋值操作符(C++11 起)
    MyClass& operator=(MyClass&& other) = default;
};

上述函数调用触发时机

MyClass obj;  // 调用默认构造函数

{
    MyClass obj;  // 对象创建
}  // 对象销毁,调用析构函数

MyClass obj1;
MyClass obj2 = obj1;  // 调用拷贝构造函数

MyClass obj1, obj2;
obj1 = obj2;  // 调用拷贝赋值操作符

MyClass obj1;
MyClass obj2 = std::move(obj1);  // 调用移动构造函数

MyClass obj1, obj2;
obj1 = std::move(obj2);  // 调用移动赋值操作符

2、如果定义了任何构造函数(例如带参数的构造函数)

  • 编译器将不再生成默认构造函数,但其他函数(如析构函数、拷贝构造函数等)仍然会自动生成,除非你显式定义它们。
class MyClass {
public:
    MyClass(int x) {}  // 自定义构造函数
};

3、构造函数的参数为 reference 引用类型时

  • 在 C++ 中,引用(reference) 在初始化后不能更改其绑定的对象。如果一个类的成员变量是引用类型,那么在对象的整个生命周期中,该引用必须始终指向同一个对象。
class MyClass {
public:
    int& ref;  // 引用类型的成员变量

    // 构造函数
    MyClass(int& value) : ref(value) {}
};
  • 如果实现默认的拷贝赋值操作符,会遇到问题:
MyClass& operator=(const MyClass& other) {
    if (this != &other) {
        ref = other.ref;  // 错误:不能修改引用绑定的对象
    }
    return *this;
}

解决方案:
方法 1:使用指针代替引用

class MyClass {
public:
    int* ptr;  // 使用指针代替引用

    // 构造函数
    MyClass(int& value) : ptr(&value) {}

    // 拷贝赋值操作符
    MyClass& operator=(const MyClass& other) {
        if (this != &other) {
            ptr = other.ptr;  // 指针可以重新赋值
        }
        return *this;
    }
};

方法 2:禁用拷贝赋值操作符

class MyClass {
public:
    int& ref;  // 引用类型的成员变量

    // 构造函数
    MyClass(int& value) : ref(value) {}

    // 禁用拷贝赋值操作符
    MyClass& operator=(const MyClass& other) = delete;
};

思维导图笔记请添加图片描述

华为OD机试双机位C卷-恢复数字序列 (Py/Java/C/C++/Js/Go) 华为OD机试双机位C卷 恢复数字序列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 恢复数字序列。 阅读详情

相关推荐

qcom bypass node介绍

介绍qcom bypass node,以及如何让其生效

haodada1226的博客 2042

Effective C++ 条款05:了解C++默默编写并调用哪些函数

Effective_C++_05

君鼎的博客 836

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

Effective C++ 条款05:了解 C++ 默默编写并调用哪些函数

深入解析 Effective C++ 条款05,揭秘编译器自动生成的默认构造函数、拷贝构造函数、拷贝赋值操作符和析构函数的行为,理解它们何时生成、如何工作,以及如何避免默认行为带来的陷阱。

凡人叶枫的博客 757

SuperPoint + LightGlue实战:低纹理墙面重建保姆级教程(附完整代码)

本文提供了一份针对低纹理墙面三维重建的实战教程。通过详细解析SuperPoint与LightGlue的核心参数调优,指导读者如何有效提取并匹配低纹理目标的特征点,并结合COLMAP完成从稀疏到稠密的重建流程,最终实现高精度建模。

weixin_29034963的博客 223

【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)

本文详细介绍了将YOLO图像分类C++部署项目从CMake迁移到Visual Studio控制台应用的全过程。针对低配CPU性能瓶颈问题,作者通过替换多线程HPP代码为官方实现,并采用448x448固定输入尺寸优化推理速度。项目配置包含OpenCV和ONNX Runtime环境设置,实现了图像批量处理、分类结果显示及结果日志输出功能。关键步骤包括依赖库配置、DLL部署和代码调试,最终在Windows平台成功实现高效CPU推理。该方案显著提升了低配硬件的兼容性,为图像分类任务提供了稳定的部署解决方案。

深耕CV 354

Effective C++ 条款 05:了解 C++ 默默编写并调用哪些函数

如果你的类中包含引用成员,且希望支持赋值操作,你必须自定义拷贝赋值操作符。编译器不会自动为含有引用成员的类生成拷贝赋值操作符,因此需要手动实现对引用成员的处理。

weixin_42255569的博客 601

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

8.5华为OD机试真题 新系统 - 最长不连续子串 (Java/Py/C/C++/Js/Go)

算法大师! 626

Effective C++之条款05:了解C++默默编写并调用哪些函数

声明: 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。 条款05:了解C++默默编写并调用哪些函数 Know what functions C++ silently writes and calls. 直接进入正题。 如果没有声明,编译器会默认声明:默认构造函数、拷贝...

HakunaMatata的博客 228

MATLAB应用实战系列(四十三)-基于MATLAB的光伏并网系统仿真设计

在Matlab中建立光伏电站接入系统模型,包括光伏发电逆变器及负荷模型等,仿真分析接入点处的电能质量,实现高品质并网运行。 壹 构建太阳能电池模型。 初始化参数如下图所示。 贰 构建MPPT控制模型。 具体封装如下所示: 通过PWM算法实现DC-DC稳步输出最大点。 叁 三、构建直流短距离输电线路。 仿真模型如下图: 通过电容来均衡线路电压,使得线路电压保持可靠性。 肆 通过逆变器变换,使得直流线路转换成...

wenyusuran的专栏 3169

Lammps纳米压痕接触面积—Matlab接触面积计算(两种方法)

Lammps纳米压痕接触面积计算

Rockyoung 5448

Effective C++条款05解读: 了解C++默默编写并调用哪些函数

C++编译器会在背后做许多事情, 这也是C++复杂的原因之一。 比如, 如果你写了一个空类: #include using namespace std; class Empty { }; int main() { return 0; } 实际上就好像写了如下的程序一样: #include using namespace std; class Empty { pu

认知 行动 坚持 7323

【华为OD机试真题】282、求满足条件的最长子串的长度 | 机试真题+思路参考+代码分析 (C++、Java、Py、C语言、JS)

题目描述 >给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求: >  1、只包含1个字母(a~ z,A~Z), 其余必须是数字; 2、字母可以在子 串中的任意位置; >  如果找不到满足要求的子串,如全是字母或全是数字,则返回-1

KJ.JK 1万+

effective c++:条款05:了解C++默默编写并调用哪些函数

1.会默认生成的函数 需要这些函数的时候编译器才会默认生成这些函数,不需要(代码中没有相关操作)则编译器不生成相应的函数。 编译器默认生成的析构函数不是虚函数,除非基类中的析构函数时虚函数。 2.copy constructor class NamedObject { public: NamedObject(const char* name, const int& value) ...

princeteng's blogs 241

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Effective C++ 条款05:了解C++默默编写并调用的函数

Effective C++ 条款05:了解C++默默编写并调用的函数 结论: ​ 通常,概念上,如果类的设计者自己没有声明,编译器会自动生成编译器版本的默认构造函数、拷贝构造函数、拷贝赋值函数、析构函数;而实际上,编译器只在需要调用相应函数的时候才会生成响应的函数; (一)、默认构造函数 (1)合成时机: 类中包含成员对象,且该成员对象的类有默认构造函数(手动声明或者编译器合成); 派生自带有默认构造函数的基类; 带有虚函数或者虚基类的类的类; (2)构造函数的扩充: ​ 如果类的设计者已经实现了一个或

zs_fengjian的博客 249

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Effective C++读书笔记之条款05 了解C++默默编写并调用哪些函数。

条款05 了解C++默默编写并调用哪些函数。 1、我们编写的每个类几乎都有一个或多个构造函数、一个析构函数和一个赋值运算符。他们操控类对象基本的生死行为。 2、如果自己没有声明,编译器就会为类声明一个default 构造函数,一个copy构造函数,一个copy assignment操作符和一个析构函数.所有这些函数都是 public 而且 inline(第30条)。 PS:空类(empty cla...

Struggling_Jeff的博客 240

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Effective C++条款05:了解C++默默编写并调用哪些函数

class Empty{}; class Empty{ Empty(){}; Empty(const Empty& rhs){}; ~Empty(){}; Empty& operator=(const Empty& rhs){}; }; 只有当生成的代码合法且证明它有意义时编译器才会为class生成operator= template&l...

weixin_30307267的博客 105

[Effective C++]条款05:了解C++默默编写并调用哪些函数

编译器可以暗自为 class 创建 defaut 构造函数、copy 构造函数、 copy assignment 操作符,以及析构函数 写下一个 empty class,如果你自己没声明,编译器就会为它声明(编译器版本的)一个 copy 构造函数、一个 copy assignment 操作符和一个析构函数。如果你也没有声明任何构造函数,编译器也会为你声明一个 default 构造函数。所有这些函数都是 public 且 inline 的。 你写下: class Empty {}; 就好像你写下: cl.

qq_45803411的博客 165

读书笔记《Effective C++》条款05:了解C++默默编写并调用哪些函数

对于一个空类(如果自己没声明),编译器就会为它声明(编译器版本的)一个default构造函数、一个copy构造函数、一个copy assignment操作符和一个析构函数。所有这些函数都是public且inline。 如果没有声明任何构造函数,编译器会为你声明一个default构造函数,如果已有构造函数,编译器就不会在为你声明一个default构造函数。

Do-Program的专栏 302

Effective C++ 阅读心得-条款05:了解C++默默编写并调用哪些函数

类的缺省函数,很适合当面经用哦~

weixin_42208702的博客 138

「Effective C++」条款05: 了解c++默默编写并调用了哪些函数

析构函数不是用来销毁对象的,而是在编译器销毁对象的时候自动调用析构函数来清理资源的;作为基类的时候析构函数加virtual关键字,子类才能够销毁对象时释放资源;取地址重载和const取地址重载:一般不单独考虑。不涉及资源的释放可以不写;析构函数不可以重载;

weixin_43830176的博客 245

Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)

Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)

CltCj的博客 675

Effective C++ 学习笔记——条款05:了解C++默默编写并调用的那些函数

Effective C++ 学习笔记——条款05:了解C++默默编写并调用的那些函数

weixin_42047439的博客 905

[Effective C++]条款05 了解C++默默编写并调用哪些函数

一、如果你自己没

Roger King的打怪练级房 637

《Effective C++》学习笔记条款05了解C++默默编写并调用哪些函数

了解C++默默编写并调用哪些函数

UE引擎开发工程师 1181

effective C++读书笔记--【条款05:了解C++默默编写并调用哪些函数】

蓝图 码农没干 -->编译器代劳 -->编译器什么时候动手 -->编译器的劳动产出的特殊之处 -->编译器的copy assigment的坑 空类 作者提出了一个所谓的“空类”的概念,对于普通码农来讲,空结构体可能更易...

liangll的博客 288
上一篇: [Effective C++]条款04:确定对象被使用前已先被初始化
下一篇: [Effective C++]条款06:若不想使用编译器自动生成的函数,就该明确拒绝
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值