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

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示