C++类和对象(HM)

2024-04-05 21:20
文章标签 c++ 对象 hm

本文主要是介绍C++类和对象(HM),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.拷贝构造函数的调用时机

2.拷贝构造函数的调用规则

3.浅拷贝和深拷贝

(1)浅拷贝

(2)深拷贝

4.初始化列表

5.类作为成员变量


1.拷贝构造函数的调用时机

我们首先要自己定义一个类:

(1)使用已知的对象初始化一个新的对象

这个相当于让已知的对象p1初始化对象p2;

(2)值传递的方式给函数的参数传值

通过打印的结果就可以发现执行了拷贝构造函数,这个是因为我们使用了值传递的方式传递对象p,实际上这两个函数里面的p并不是同一个p,编译器在调用func函数的时候会重新的拷贝一份作为副本;就是说test函数不会直接把自己的p传到func函数里面去,而是重新拷贝一份传给func函数

(3)值的方式返回局部的对象:

这个地方先调用test函数,test函数里面接着调用func函数,func函数会返回一个对象,这个对象就不会直接地返回到我们的test函数里面去 ,而是拷贝一份返回到test函数里面去,我们打印这两个对象的地址就可以发现是不一样的,这个也可以验证拷贝函数是执行了的。

2.拷贝构造函数的调用规则

(1)首先我们必须要知道的是:当我们定义了一个类以后,编译器会自动地实现至少3个函数,一个是默认的构造函数,一个是默认的析构函数,一个是拷贝构造函数(值传递);

(2)当我们自己写了一个自定义的构造函数并且使用的话,如果我们自己不写默认的构造函数,编译其实不会提供的;

(3)当我们写了拷贝构造函数但是不写默认构造函数和自定义构造函数的时候,编译器也不会提供自定义构造和默认构造函数的;

3.浅拷贝和深拷贝

(1)浅拷贝

使用编译器提供的拷贝构造函数,就是浅拷贝:

我们是使用了new在堆区上面开辟空间,把地址传递给了height指针;最后判断是否为空,不是空的话我们就释放掉,然后进行置为空指针;

因为释放是发生在程序销毁的时候,所以我们在析构的那个函数里面释放空间,但是因为定义的对象,先进去的后出来,也就是说先定义的对象后释放,所以p2先执行析构函数,释放空间,这个时候执行了堆区的空间的销毁,p1在执行析构函数,再次释放,就造成了一块空间多次释放,这个就是内存泄漏,导致程序崩溃;

浅拷贝带来的问题就是堆区空间重复释放;

(2)深拷贝

我们在原来的代码的基础上面,添加上我们自己的拷贝构造函数:

person(const person& p)
{cout << "拷贝构造函数执行中" << endl;age = p.age;//height = p.height;//这行代码是编译器默认实现的拷贝函数height = new int(*p.height);
}

原来的height = p.height;相当于是把p1的height的地址传递给了p2,这样两个就指向了同样的内存空间,所以会出现交叉多次释放的问题;

我们的解决方案就是重新开辟空间,这样p2的height就会指向新的空间(而不是原来的0x00ff48了);

这样在析构函数执行的时候,p1释放p1的空间,p2释放p2的空间,就不会出现多次释放同一块空间的问题了;----------------------这就是深拷贝。

4.初始化列表

就是提供了一种新的初始化的方法:我们原来是使用这种自定义的构造函数进行初始化:

我们现在使用的是初始化列表:就是在原来的基础上,去掉自定义构造函数的函数体,后面加冒号,写上属性(形参)这种:下面的示例,abc就是我们的属性,a1,b1,c1就是我们的形参:

5.类作为成员变量

打印结果:

这个就是想要说明:A类里面有B成员变量,B也是一个类,这个题就是person类里面有person成员变量,phone也是一个类,执行构造的时候,先执行B的构造,再执行A的构造,执行析沟的时候,先执行A的析构,后执行B的析构,就这个顺序的问题。

这篇关于C++类和对象(HM)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878180

相关文章

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提