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

news/2024/10/22 21:41:30/

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

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.ppmy.cn/news/1275794.html

相关文章

蜘点云原生之 KubeSphere 落地实践过程

作者&#xff1a;池晓东&#xff0c;蜘点商业网络服务有限公司技术总监&#xff0c;从事软件开发设计 10 多年&#xff0c;喜欢研究各类新技术&#xff0c;分享技术。 来源&#xff1a;本文由 11 月 25 日广州站 meetup 中讲师池晓东整理&#xff0c;整理于该活动中池老师所分享…

测试工具Jmeter:界面介绍、核心选项说明、核心选项用途

本文章主要介绍Jmeter的界面布局&#xff0c;以及各个选项的功能和它们的用途。 JMeter基本原理是建立一个线程池&#xff0c;多线程运行取样器产生大量负载&#xff0c;在运行过程中通过断言来验证结果的正确性&#xff0c;通过监听器来记录测试结果。 1. Jmeter主界面 当我…

SpringBoot 源码解析2:启动流程1

SpringBoot 源码解析2&#xff1a;启动流程1 1.启动方式2.SpringBootApplication3.SpringApplication3.1 构造器SpringApplication3.2 SpringApplication#run 3.3 SpringApplication#run 中关键方法3.1 SpringApplication#prepareEnvironment3.2 SpringApplication#prepareCont…

知识竞赛的组织程序

近年来&#xff0c;知识竞赛已由笔试发展到现场竞赛&#xff0c;由个人对赛发展到集体对赛&#xff0c;比赛的组织形式也日趋复杂。下面以公开赛为典型形式&#xff0c;来介绍知识竞赛的一般组织程序。 知识竞赛一般可分为赛前准备和正式比赛两个阶段。 1、赛前准备阶段是指…

C# WPF上位机开发(知识产权ip保护)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 上位机软件如果是和硬件模块搭配开发&#xff0c;这个时候大部分上位机基本上都是白送的&#xff0c;不会收取相关的费用。但是&#xff0c;如果上…

xcode无线真机调试详细图文步骤

步骤一、 步骤二&#xff1a; 步骤三&#xff1a; 配置完到这里&#xff0c;点击真机右键&#xff0c;菜单栏并未出现connect via ip address 选项&#xff0c;也没出现无线连接的小地球图标&#xff0c;别慌&#xff0c;接着进行下一步操作即可。 步骤四&#xff1a; 1.打开…

pytorch中nn.Sequential详解

1 nn.Sequential概述 1.1 nn.Sequential介绍 nn.Sequential是一个序列容器&#xff0c;用于搭建神经网络的模块被按照被传入构造器的顺序添加到容器中。除此之外&#xff0c;一个包含神经网络模块的OrderedDict也可以被传入nn.Sequential()容器中。利用nn.Sequential()搭建好…

WEB绘图插件Canvas基础应用

一、概述 canvas 是 html5 标准中提供的⼀个标签 顾名思义是定义在浏览器上的画布&#xff0c;通过其强大的绘图接口&#xff0c;我们可以实现各种各样的图形&#xff0c; 炫酷的动画 &#xff0c;甚至可以利用他开发⼩游戏&#xff0c;包括市面上很流行的数据可视化框架底层都…