当前位置: 首页 > news >正文

条款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.lryc.cn/news/263622.html

相关文章:

  • Apache RocketMQ 5.0 腾讯云落地实践
  • FIFO的Verilog设计(三)——最小深度计算
  • JavaWeb笔记之JavaWeb JDBC
  • pytorch网络的增删改
  • Tomcat (Linux系统)详解全集
  • [德人合科技]——设计公司 \ 设计院图纸文件数据 | 资料透明加密防泄密软件
  • 数字化转型中的6S管理
  • Linux学习(1)——初识Linux
  • 2.5 - 网络协议 - HTTP协议工作原理,报文格式,抓包实战
  • 新增工具箱管理功能、重构网站证书管理功能,1Panel开源面板v1.9.0发布
  • 棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程
  • 《Kotlin核心编程》笔记:设计模式
  • hive企业级调优策略之数据倾斜
  • MATLAB版本、labview版本、UHD版本 互相对应
  • 13 v-show指令
  • 23级新生C语言周赛(6)(郑州轻工业大学)
  • 关于“Python”的核心知识点整理大全24
  • Vue - 基于Element UI封装一个表格动态列组件
  • 计算机网络:DNS域名解析系统
  • java面试:==和equals有什么区别?
  • 数字人SaaS系统无限生成AI数字人!
  • 【MySQL】——数据类型及字符集
  • Redis cluster集群设置密码
  • Docker 核心技术
  • 15 使用v-model绑定单选框
  • go语言指针变量定义及说明
  • 基于“Galera+MariaDB”搭建多主数据库集群的实例
  • arcgis javascript api4.x加载天地图cgs2000坐标系
  • 算法学习——回溯算法
  • C语言—小小圣诞树