C++——类的六大默认成员构造函数

news2024/11/17 14:42:07

文章目录

  • 1.默认成员函数思维导图
  • 2.构造函数
    • 定义
    • 特性
  • 2.析构函数
    • 定义
    • 特性
  • 3.拷贝构造函数
    • 定义
    • 特性
  • 4.赋值构造函数
    • 定义
    • 特性
  • 5.重载取地址运算符
    • 定义
    • 特性
  • 6.重载const取地址运算符
    • 定义
    • 特性

在这里插入图片描述

1.默认成员函数思维导图

在这里插入图片描述

2.构造函数

定义

在面向对象编程中,构造函数是一种特殊的方法,用于在创建对象时初始化对象的属性或数据成员。它通常与类一起使用,并且在实例化对象时自动调用。

class MyClass
{
public:
	MyClass()
	{
		{
			cout << "默认构造函数" << endl;
		}
	}
	MyClass(int x)
	{
		cout << "带参数的构造函数" << endl;
	}
};
int main()
{
	MyClass obj1; // 调用默认构造函数
	MyClass obj2(10); // 调用带参数的构造函数,将10作为参数传递
	return 0;
}

特性

  1. 函数名与类型相同
  2. 无返回值
  3. 对象实例化时编译器自动调用对应的构造函数
  4. 构造函数可以重载
  5. 如果用户没有定义构造函数,编译器会自动生成一个无参的默认构造函数;如果用户定义了构造函数,编译器将不再生成。
  6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

2.析构函数

定义

与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

class MyClass {
public:
    // 构造函数
    MyClass();
    
    // 析构函数
    ~MyClass();
    
    // 成员函数
    void doSomething();
    
private:
    int _data;
    // ...
};

// 构造函数的定义
MyClass::MyClass() {
    // 构造函数的实现
}

// 析构函数的定义
MyClass::~MyClass() {
    // 析构函数的实现
}

// 成员函数的定义
void MyClass::doSomething() {
    // 成员函数的实现
}

特性

  1. 析构函数名是在类名前加上字符~
  2. 无参数无返回值类型
  3. 一个类只能有析构函数,若未显式定义,系统会自动生成默认的析构函数。(析构函数不能重载)
  4. 对象生命周期结束时,C++编译系统自动调用析构函数
  5. 编译器生成的默认析构函数,对自定类型成员调用它的析构函数
  6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数;有资源申请时,一定要写,否则会造成资源泄露。

3.拷贝构造函数

定义

拷贝构造函数是一种特殊的构造函数,用于将一个对象的值复制到另一个对象中。它通常用于对象间的赋值和传递,以确保新对象具有与原对象相同的状态和数据。

拷贝构造函数的语法与普通构造函数相同,但它的参数是一个同类对象的常引用。例如:

class MyClass {
public:
    MyClass(); // 默认构造函数
    MyClass(const MyClass& other); // 拷贝构造函数
};

在这个例子中,MyClass类有一个默认构造函数和一个拷贝构造函数。拷贝构造函数的参数是一个同类对象的常引用,用于指定要复制的对象。

当您使用拷贝构造函数创建一个新对象时,它会以与原对象相同的值初始化新对象。例如:

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

在这个例子中,我们使用拷贝构造函数将obj1的值复制到了obj2中。这是通过将obj1作为参数传递给拷贝构造函数来实现的。

特性

  1. 拷贝构造函数是构造函数的一个重载形式
  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用
  3. 若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序拷贝,这种拷贝叫做浅拷贝,或者值拷贝

4.赋值构造函数

定义

赋值构造函数是一种特殊的构造函数,用于在创建一个新对象时将已有对象的值赋给新对象。与拷贝构造函数不同,赋值构造函数是在对象已经被创建之后才会被调用,用于将一个已经存在的对象的值赋给另一个对象。

class MyClass {
public:
    // 构造函数
    MyClass();
    
    // 带参数的构造函数
    MyClass(int data);
    
    // 赋值构造函数
    MyClass(const MyClass& other);
    
    // 成员函数
    void doSomething();
    
private:
    int _data;
    // ...
};

// 构造函数的定义
MyClass::MyClass() {
    // 构造函数的实现
}

// 带参数的构造函数的定义
MyClass::MyClass(int data): _data(data) {
    // 带参数的构造函数的实现
}

// 赋值构造函数的定义
MyClass::MyClass(const MyClass& other) {
    _data = other._data;
}

// 成员函数的定义
void MyClass::doSomething() {
    // 成员函数的实现
}

特性

  1. 赋值构造函数是在对象已经被创建之后才会被调用,用于将一个已经存在的对象的值赋给另一个对象。
  2. 赋值构造函数的参数是一个同类对象的常引用,用于指定要赋值的对象。
  3. 赋值构造函数不返回任何值,但是通常会返回一个指向当前对象的引用,以便支持链式赋值操作。
  4. 赋值构造函数应该实现为自我赋值安全的。这意味着在赋值构造函数的实现中应该始终检查要赋值的对象是否与当前对象相同,以避免发生自我赋值的情况。
  5. 如果您没有定义赋值构造函数,编译器会自动生成一个默认赋值构造函数。但是,如果您的类中有指针或其他资源,可能需要自定义赋值构造函数来确保复制对象的行为正确。
  6. 赋值构造函数通常用于对象的初始化操作,以确保新对象具有与原对象相同的状态和数据。通常,可以将拷贝构造函数和赋值构造函数合并为一个函数来避免代码的重复。

5.重载取地址运算符

定义

默认情况下,取地址运算符返回对象的地址,但是通过重载取地址运算符,我们可以改变它的行为,使其返回一个指向对象内部数据成员的指针,而不是整个对象的地址。

class MyClass {
public:
    // 成员函数形式的重载取地址运算符
    T* operator&();
private:
    T _data;
    // ...
};

// 成员函数形式的重载取地址运算符的定义
T* MyClass::operator&() {
    return &_data; // 返回指向对象内部数据成员的指针
}

特性

  1. 重载取地址运算符改变了一个对象的地址返回方式。默认情况下,取地址运算符返回对象的地址,但是通过重载取地址运算符,我们可以改变它的行为,使其返回一个指向对象内部数据成员的指针,而不是整个对象的地址。
  2. 重载取地址运算符是一个成员函数,它必须被定义为类的公有成员函数。
  3. 重载取地址运算符必须返回一个指针类型,通常是对象内部数据成员的指针类型。
  4. 重载取地址运算符通常应该只用于获取对象内部数据成员的指针,而不应该用于修改对象的状态。
  5. 重载取地址运算符不是一个常见的操作,应该仅在特定情况下使用。重载取地址运算符可能会破坏语言的一些保证,因此应该谨慎使用。

6.重载const取地址运算符

定义

重载 const 取地址运算符(&)是一种特殊的运算符重载,用于改变一个常量对象的地址返回方式。默认情况下,const 取地址运算符返回常量对象的地址,但是通过重载 const 取地址运算符,我们可以改变它的行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。

class MyClass {
public:
  const MyClass* operator&() const {
    return this; 
  }
};

int main() {

  const MyClass obj;
  const MyClass* ptr = &obj; // 调用重载的operator&

  return 0;
}

特性

  1. 重载 const 取地址运算符改变了一个常量对象的地址返回方式。默认情况下,const 取地址运算符返回常量对象的地址,但是通过重载 const 取地址运算符,我们可以改变它的行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。
  2. 重载 const 取地址运算符是一个成员函数,它必须被定义为类的公有成员函数,并且必须被标记为 const,以表示它不会修改对象的状态。
  3. 重载 const 取地址运算符必须返回一个指向常量对象内部数据成员的指针类型,通常是常量对象内部数据成员的指针类型。
  4. 重载 const 取地址运算符通常应该只用于获取常量对象内部数据成员的指针,而不应该用于修改对象的状态。
    行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。
  5. 重载 const 取地址运算符是一个成员函数,它必须被定义为类的公有成员函数,并且必须被标记为 const,以表示它不会修改对象的状态。
  6. 重载 const 取地址运算符必须返回一个指向常量对象内部数据成员的指针类型,通常是常量对象内部数据成员的指针类型。
  7. 重载 const 取地址运算符通常应该只用于获取常量对象内部数据成员的指针,而不应该用于修改对象的状态。
  8. 重载 const 取地址运算符不是一个常见的操作,应该仅在特定情况下使用。重载 const 取地址运算符可能会破坏语言的一些保证,因此应该谨慎使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RHCSA——Linux网络、磁盘及软件包管理

ZY目录 Linux操作系统讲解&#xff1a;一、网络管理1、NetworkManager1.1、nmtui界面&#xff1a;1.2、nmcli使用方法&#xff1a; 2、配置网络2.1、网络接口以及网络连接2.2、配置方法&#xff1a;2.3、ping命令&#xff1a;2.4、wget命令 二、磁盘管理2.1、分区得两种格式2.1…

HCIP第五次作业

配置IP地址 r1 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.0.0.1 24 [r1-GigabitEthernet0/0/0]int lo0 [r1-LoopBack0]ip add 192.168.1.1 24 [r1-LoopBack0]int lo1 [r1-LoopBack1]ip add 10.0.0.1 24 r2 [r2]int g0/0/0 [r2-GigabitEthernet0/0/0]ip add 12.0.0.2 …

在vs里配置c运行环境

勾选环境包 勾选完安装就好 创建c项目 选择相关配置 设置名称和位置 创建c后缀文件 一新建项 二设置名字 输出hello world 代码段 运行结果

C++ 文档加密与解密运用【Crypto++】库

一、下载Cryptopp 鼠标放到下面网址&#xff0c;点击下载即可 github地址&#xff08;8.7.0版本&#xff09;&#xff1a;https://github.com/weidai11/cryptopp/releases/tag/CRYPTOPP_8_7_0 二 、下载PEM包 pem包官方地址&#xff1a;PEM Pack - Crypto Wiki 三、调用Cry…

深度学习环境安装|PyCharm,Anaconda,PyTorch,CUDA,cuDNN等

本文参考了许多优秀博主的博客&#xff0c;大部分安装步骤可在其他博客中找到&#xff0c;鉴于我本人第一次安装后&#xff0c;时隔半年&#xff0c;我忘记了当时安装的许多细节和版本信息&#xff0c;所以再一次报错时&#xff0c;重装花费了大量时间。因此&#xff0c;我觉得…

单个电源模块带电感,给多个负载用,但是用电电流不一致的直流压降仿真

单个电源模块带电感,给多个负载用,但是用电电流不一致的直流压降仿真 下面介绍单个电源模块带电感,给多个负载用,但是用电电流不一致的直流压降仿真,以下图为例 具体操作步骤如下 同样的设置好VRAM

【Mybits-Plus】拦截器的学习和使用,以及如何实现数据权限

【Mybits-Plus】拦截器的学习和使用目录标题 常规处理数据权限的话Mybits需要对Mybits\Mybits-plus拦截器了解1.基础知识学习2.各种场景--实战案例 常规处理数据权限的话Mybits需要对Mybits\Mybits-plus拦截器了解 1.基础知识学习 (请自行学习如下内容&#xff0c;后续才能根…

C++中随机数的使用总结

随机数 rand() 随机数发生器 #include <stdio.h> #include <unistd.h> #include <iostream> #include <string>using namespace std;int main(int argc, char *argv[]) {cout << "this is main()" << endl;cout << rand…

2023-07-14 monetdb-嵌入mysql-sql层交互-设计-分析

摘要: SQL层的兼容工作,时间紧,任务重,协议多,命令多,功能多,牵扯到数据一致性又万分紧张,需要非常谨慎,当前列了一些下一步的工作的设计分析. 主要是涉及sql层接口的兼容, innodb与monetdb数据的一致性, 查询和写入两个不同侧面的处理. monetdb嵌入mysql分析: 导图版…

C语言中定义和声明的区别

声明(declaration)与定义(definition) 为了使不同的文件都可以访问同一个变量&#xff0c;C会区 分变量的声明和定义。 变量的定义会为这个变量分配存储空间&#xff0c;并且 可能 会为其指定一个初始化的值&#xff0c; 一个变量的定义有且 仅有一处。 定义实际上是一种特殊…

七种最新群智能优化算法(NOA、LSO、SWO、ZOA、EVO、KOA、GRO)求解23个基准测试函数(含参考文献及MATLAB代码)

一、七种算法简介 &#xff08;1&#xff09;星雀优化算法NOA 星雀优化算法(Nutcracker optimizer algorithm,NOA)由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模拟星雀的两种行为&#xff0c;即&#xff1a;在夏秋季节收集并储存食物&#xff0c;在春冬季节搜…

路径规划算法:基于浣熊优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于浣熊优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于浣熊优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法浣熊…

调频连续波(FMCW)波形设计、真实道路场景仿真及汽车自适应巡航控制信号处理(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 以下是关于调频连续波&#xff08;FMCW&#xff09;波形设计、真实道路场景仿真以及汽车自适应巡航控制信号处理的概述&#x…

【问题解决】VSCode 远程安装插件特别慢

【问题描述】 我要配置 VSCode WSL 的开发环境&#xff0c;需要在 WSL 里也装上 C、CMake 系列的插件&#xff0c;如下图的直接下载方式特别慢&#xff1a; 【解决方法】 先去网站下载插件&#xff1a;https://marketplace.visualstudio.com/&#xff0c;后缀名&#xff1a;…

【DFS】LeetCode 17. 电话号码的字母组合

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法…感兴趣就关注我bua&#xff01; 目录 题目:示例: 题解:代码实现: 题目: 示例: 题解: 这是一道全排列的问题,先来看看示例. 看第一个示例:输入"23",其对应的是"abc&qu…

【GIT】如何在GitHub上向一个开源项目贡献代码?

如何在GitHub上向一个开源项目贡献代码 参考链接&#xff1a;https://www.bilibili.com/video/BV1WC4y1a76G/?p1&t175 一、fork目标仓库的代码 必须先fork别人的代码到自己仓库之后才能修改代码&#xff0c;不能直接修改别人的代码。 这样就fork到自己的仓库了。 二、…

学习react,复制一个civitai-更新2

更新内容 耗时一个礼拜左右&#xff0c;增加了个新界面&#xff1a;模型图片详情界面。 看看效果图吧&#xff1a; 功能介绍 操作&#xff1a;在模型详情界面点击一个图片&#xff0c;就能到图片详情界面 1.点击哪个图片&#xff0c;就会展示哪个&#xff0c;同时还会更新图…

【C++】面试基础搬运

c/c c三大特性 封装 最开始接触代码是C语言&#xff0c;那么开始写一些逻辑代码的时候会很麻烦&#xff0c;因为你要在函数中定义变量&#xff0c;然后按顺序写对应的逻辑&#xff0c;接着可以将逻辑封装成函数。当时会感觉很麻烦&#xff0c;因为很散装&#xff0c;知道后面…

docker-compose 常用命令(附 docker-compose 的安装教程)

本文目录 1. docker-compose 介绍1. docker-compose 简介2. docker-compose 安装3. docker-compose 卸载 2. docker-compose 常用命令1. docker-compose 命令格式2. docker-compose up3. docker-compose ps4. docker-compose stop5. docker-compose down6. docker-compose logs…

虚幻引擎程序化资源生成框架PCG 之Gather(收集)、Merge(合并)、Union(并集)

有朋友询问&#xff1a;Gather&#xff08;收集&#xff09;、Merge&#xff08;合并&#xff09;、Union&#xff08;并集&#xff09;这三个运算节点&#xff0c;看名字有些相似&#xff0c;究竟区别是什么&#xff1f;目前还没有详细的官方文档&#xff0c;所以今天老王结合…