只谈C++11新特性 - 默认函数

devtools/2024/12/27 6:12:09/

默认函数

C++11之前的问题

在C++11之前,如果给一个类显式地声明了构造函数(无论是默认构造函数还是自定义的),系统就不会再生成默认的抽象赋值函数和拷贝构造函数。这带来了一些不方便和隐藏的问题。举一个简单的例子:

#include <iostream>class MyClass {
public:MyClass() {}~MyClass() {}
};int main() {MyClass obj1;// MyClass obj2 = obj1; // 这里会报错:拷贝构造函数未声明return 0;
}

在上述代码中,由于类中显式地声明了构造函数,系统就不再自动生成拷贝构造函数,致使实例化该类时存在问题。如果想要保留拷贝构造函数,必须显式地实现。

C++11中的默认函数特性

C++11中新增了default关键字,用于显式说明一个类的构造函数、拷贝构造函数和赋值函数为“默认”。这样一旦需要,系统就会自动生成该函数,而不需要手动实现。

下面代码示例显示如何使用“默认函数”:

#include <iostream>class MyClass {
public:MyClass() = default; // 显式声明默认构造函数MyClass(const MyClass&) = default; // 显式声明默认拷贝构造函数~MyClass() = default; // 显式声明默认销毁函数
};int main() {MyClass obj1;MyClass obj2 = obj1; // 正常使用拷贝构造函数return 0;
}

以下例子展示了= default的重要性,特别是在有继承关系时:

使用 = default
#include <iostream>class Base {
public:Base() = default;Base(const Base&) = default;virtual ~Base() = default;
};class Derived : public Base {
public:Derived() = default;Derived(const Derived&) = default;~Derived() = default;
};int main() {Derived d1;Derived d2 = d1; // 正常使用默认的拷贝构造函数return 0;
}
手动实现拷贝构造函数和析构函数
#include <iostream>class Base {
public:Base() {}Base(const Base&) {  }virtual ~Base() {  }
};class Derived : public Base {
public:Derived() {}Derived(const Derived& other) : Base(other) {}~Derived() {  }
};int main() {Derived d1;Derived d2 = d1; // 使用手动实现的拷贝构造函数return 0;
}

在没有default关键字的情况下,我们需要手动为派生类实现拷贝构造函数和析构函数,否则编译器可能因为无法正确推导而导致错误或不期望的行为。通过显式使用= default,我们可以确保派生类正确继承基类的行为,同时简化代码。

总结

在C++11中导入“默认函数”,是为了更简化和可控程序的设计。它解决了为了自定义函数而造成的隐藏问题,提高了程序的可读性和编写效率。对于需要增强控制的类,这一功能根据需要显式声明或撤销,是C++11重要的优化之一。


http://www.ppmy.cn/devtools/145736.html

相关文章

2-196基于matlab的混沌改进蚁群算法优化PID

基于matlab的混沌改进蚁群算法优化PID。以控制误差为PID控制参数优化的目标函数&#xff0c;输入比例系数、积分比例系数、微分比例系数等参数进行优化&#xff0c;输出最佳的控制参数。程序已调通&#xff0c;可直接运行。 2-196基于matlab的混沌改进蚁群算法优化PID

无需公网 IP 实现外部访问 Puter 一站式云平台

Puter 是一款隐私至上的个人云&#xff0c;它是开源桌面环境&#xff0c;运行在浏览器中&#xff0c;这款桌面环境具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境&#xff0c;也可以作为云存储服务、远程服务器、Web 托管平台等的界面。 第一步&#xf…

报表工具DevExpress Reporting v24.2亮点 - AI功能进一步强化

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 报表工具DevExpress Reporting v24.2将于近期发…

决策树(理论知识3)

目录 评选算法信息增益&#xff08; ID3 算法选用的评估标准&#xff09;信息增益率&#xff08; C4.5 算法选用的评估标准&#xff09;基尼系数&#xff08; CART 算法选用的评估标准&#xff09;基尼增益基尼增益率 评选算法 决策树学习的关键在于&#xff1a;如何选择最优划…

CCF-A类 USENIX ATC 2025截稿指南

一、会议资讯&#xff1a; USENIX Annual Technical Conference (USENIX ATC)2025&#xff0c;即2025年USENIX年度技术会议&#xff0c;是CCF推荐A类会议&#xff0c;Core Conference Ranking A类会议。会议汇集了领先的系统研究人员&#xff0c;展示尖端的系统研究&#xff0…

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中&#xff0c;OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始&#xff0c;OpenAI连续12天每天发布一个新应用或功能&#xff0c;标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布&#xff0c;带你一探究竟。 OpenAI发布会概览 Ope…

并发编程 - 死锁的产生、排查与解决方案

在多线程编程中&#xff0c;死锁是一种非常常见的问题&#xff0c;稍不留神可能就会产生死锁&#xff0c;今天就和大家分享死锁产生的原因&#xff0c;如何排查&#xff0c;以及解决办法。 线程死锁通常是因为两个或两个以上线程在资源争夺中&#xff0c;形成循环等待&#xf…

Kafka、RocketMQ、RabbitMQ 对比

面试中对 Kafka 、 RocketMQ 、和 RabbitMQ 的对比是常见问题&#xff0c;可以从以下几个维度进行分析&#xff1a; 1️⃣ 基础概念 特性KafkaRocketMQRabbitMQ开发语言Java ScalaJavaErlang定位分布式流处理平台分布式消息中间件高效、可靠的消息队列消息模型Topic &#xf…