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

 如果你不自己声明,编译器会替你声明(编译器版本的)拷贝构造函数、拷贝赋值运算符和析构函数。此外,如果你没有声明任何构造函数,编译器会为你声明一个默认构造函数。

class Empty{};

本质上和写成下面这样是一样的:

class Empty {
public:
Empty() { ... } 			// 默认构造函数
Empty(const Empty& rhs) { ... } 	// 拷贝构造函数
~Empty() { ... } 			// 析构函数Empty& operator=(const Empty& rhs) { ... } // 拷贝赋值运算符
};
  • 默认构造函数和析构函数主要为编译器提供了一个放置“幕后”代码的地方,例如调用基类和非静态数据成员的构造函数和析构函数。
  • 拷贝构造函数和拷贝赋值运算符:编译器生成的版本只是简单地将源对象的每个非静态数据成员拷贝到目标对象。
     只要我们自己定义的类中存在构造函数,编译器就不会默认为我们提供构造函数,如下:
template<typename T>
class NamedObject {
public:NamedObject(const char* name, const T& value);NamedObject(const std::string& name, const T& value);...
private:std::string nameValue;T objectValue;
};NamedObject<int> no1("Smallest Prime Number", 2);
NamedObject<int> no2(no1); // 调用拷贝构造函数

如果我们的类中存在以下情况:存在引用或者常量的情况,编译器可能拒绝为你的类生成相应的代码。
在这里插入图片描述
我们可以看到报错了,这时候我们需要自己实现。

#include <iostream>template<class T>
class NamedObject {
public:// 这个构造函数不再接受常量名称,因为nameValue现在是非常量字符串的引用。NamedObject(std::string& name, const T& value):nameValue(name), objectValue(value){}// 和以前一样,没有声明operator=void operator=(const NamedObject& item){this->nameValue = item.nameValue;}void printInfo();
private:std::string& nameValue; 	// 现在这里是引用const T objectValue; 	// 现在这里是常量
};template<class T>
void NamedObject<T>::printInfo()
{std::cout << "name:" << nameValue << "  age:" << objectValue << std::endl;
}
int main()
{std::string newDog("Persephone");std::string oldDog("Satch");NamedObject<int> p(newDog, 2); 	// Persephone, 2岁NamedObject<int> s(oldDog, 36); 	// Satch,36岁p.printInfo();p = s; // p中的数据成员应该如何处理?p.printInfo();
}

在这里插入图片描述
 最后一种需要注意的情况,如果基类的拷贝赋值运算符声明为private,它的派生类将无法生成拷贝赋值运算符,因为无法调用基类部分的函数处理基类部分。
编译器可以隐式地生成类的默认构造函数、拷贝构造函数、拷贝赋值运算符和析构函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/282874.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全球汽车行业的数字化转型:产品和后端的渐进之旅

如何管理汽车行业的数字化转型?在我们本篇文章中了解更多有关如何设定长期目标的信息。 正在改变汽车行业的26个数字化主题 最近一篇关于汽车行业数字化转型的论文确定了26个数字技术主题&#xff08;论文详情请点击阅读原文&#xff09;&#xff0c;分为三个主要集群: 1)驾驶…

小姐姐跳舞,AI 视频生成太酷了

大家好&#xff0c;我是章北海 最近AI视频领域的研究进展神速&#xff0c;看得眼花缭乱。 这里老章就把最近几天看过印象深刻的四个项目介绍给大家&#xff0c;同时附上项目相关简介、论文、代码等资料&#xff0c;感兴趣的同学可以深度研究一下。 《SMPLer-X:放大表达性人体…

数据结构之<树>的介绍

树的基本概念 在数据结构中&#xff0c;树&#xff08;Tree&#xff09;是一种层次结构&#xff0c;由节点和边组成。树的基本概念包括根节点、子节点、父节点、兄弟节点等。节点拥有零个或多个子节点&#xff0c;除了根节点外&#xff0c;每个节点有且仅有一个父节点。树的层…

基于ssm居家养老系统论文

居家养老系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了居家养老系统的开发全过程。通过分析高校学生综合素质评价管理方面的不足&#xff0c;创建了一个计算机管理居家养老系统的方案。文章介绍了居家…

DOS 系统(命令行)

文章目录 DOS 系统DOS 常用命令DOS 高级命令DOS 批处理命令DOS 应用场景 DOS 系统 操作系统的发展史&#xff08;DOS/Windows篇&#xff09; DOS操作系统的历史 DOS&#xff08;Disk Operating System&#xff09; 是 磁盘操作系统 的缩写&#xff0c;是一种早期的个人计算机操…

设计模式(2)--对象创建(5)--单件

1. 意图 保证一个类仅有一个实例&#xff0c;并提供一个访问它的全局访问点。 2. 一种角色 单件(Singleton) 3. 优点 3.1 对唯一实例的受控访问 3.2 缩小名空间(对全局变量的改进) 3.3 允许对操作和表示精化(可以有子类) 3.4 允许可变数目的实例 3.5 比类操作更灵活 4. 缺点…

FPGA引脚分配的问题

今天在做一个FPGA的实验时&#xff0c;在引脚分配时失败了&#xff0c;出现了如下报错&#xff1a; 我当时分配的引脚是PIN_AE19&#xff0c;然而奇怪的是我之前并未分配这个引脚&#xff0c;我使用的开发工具是Quartus II 9.1 Web Edition&#xff0c;算个老版本了。 有的网站…

云渲染技术下的虚拟现实:技术探索与革新思考

虚拟现实&#xff08;含增强现实、混合现实&#xff09;是新一代信息技术的重要前沿方向&#xff0c;是数字经济的重大前瞻领域&#xff0c;将深刻改变人类的生产生活方式&#xff0c;产业发展战略窗口期已然形成。但是虚拟现实想要深入改变影响我们的生活&#xff0c;以下技术…

linux sed批量修改替换文件中的内容/sed特殊字符

sed系列文章 linux常用命令(9)&#xff1a;sed命令(编辑/替换/删除文本)linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行linux sed批量修改替换文件中的内容/sed特殊字符 文章目录 sed系列文章一、sed替换文本语法1.1、基础语法1.2、高阶语法 二、实战/实例2.1…

(5)shell命令以及Linux的权限

写在前面 本章我们将重点讲解 Linux 权限&#xff0c;这是 Linux 基础部分中非常重要的一部分。内容比较干&#xff0c;我会稍稍正经些去讲解。话不多说&#xff0c;我们直接切入正题。 shell 命令及运行原理 严格意义上说的是一个操作系统&#xff0c;我们称之为 —— &…

【案例】--“特别抢购”案例

目录 一、案例背景二、技术方案思路三、技术方案具体设计3.1、表设计3.2、Java代码实现一、案例背景 A公司向供应商B公司买了一套软件产品。B公司的这套产品有多个应用系统服务【如appId1、appId2、appId3】,每个应用都有各自的业务应用场景,但都需要管理文档,那么就需要磁…

PMP项目管理 - 资源管理

系列文章目录 PMP项目管理 - 质量管理 PMP项目管理 - 采购管理 PMP项目管理 - 资源管理 PMP项目管理 - 风险管理 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in…