c++ 设计类的时的构造函数和析构函数的注意事项

2024-06-16 19:20

本文主要是介绍c++ 设计类的时的构造函数和析构函数的注意事项,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

纯概念

          类和对象是c++里非常重要的概念。类属于一种数据类型,是根据业务逻辑,封装一些成员变量(数据部分)和成员函数(逻辑部分)。业务逻辑使用时,类可以实例化成对象。其中,在实例化对象的过程中,构造函数起到非常重要的作用。构造函数又分为以下几种:

  • 默认构造函数,简单的说,就是没有参数的构造函数。
  • 拷贝构造函数, 形式是这样的  类名类名&)。
  • 赋值构造函数,重载类的=操作符就能实现类的赋值构造函数。

    一般情况下,初级c++程序员对构造函数,不太关注,直接设计成员变量和成员方法,就完事了。在成员变量都是基本类型的场景下完全使用编译器自动生成的构造函数是OK的,因为,c++的编译器会默认帮您合成以上所述的三种类型的构造函数。其作用如下:

  • 默认构造函数,将基本类型,比如int, char, uint8_t .....等成员变量都初始化为0了。
  •  拷贝构造函数和赋值构造函数,在您使用也都默认的 一个bit一个bit的从源对象,拷贝给目标对象,制造出一个一模一样的新对象。基本对象,成员变量的内存地址都属于类对象本身,所以没有问题,成员函数对成员变量的逻辑操作都是有保障的。

     另外一种场景,成员变量中有指针时,以上三种构造函数,都使用编译器自动生成时,会有风险。比如,你使用正在使用一个对象,处理某种业务,其中有一个成员变量是指针,您也为成员指针开辟了一个link对象。此时,您无意识下,对此对象使用了拷贝构造,或者赋值构造。这样做的结果就是,新对象的成员指针和源对象的指针同时指向之前link的同一对象。在无意识的情况下,新旧两个成员指针变量,对同一块内存对象都进行逻辑操作,会很容易引发bug。当您析构这两个成员指针时,可能会出现先后析构同一对象,造成程序崩溃的可能。

      怎么处理呢?有2个思路,

  • 第一就是,设计类的时候就,明确告知编译器,使用delete关键字,不允许实现拷贝构造函数和赋值构造函数。这样,你无意识使用拷贝和赋值构造函数时,编译器就会报错,及时提示程序员,不能使用拷贝和构造函数。
  • 第二,你设计时,就知道,必须要使用拷贝构造和赋值构造函数,此时,你自己实现它们,此时,你是清楚的知道成员指针变量,必须为它创造一个新的空间,新空间内放入源对象成员指针变量指向的对象。

这篇关于c++ 设计类的时的构造函数和析构函数的注意事项的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝