构造与析构

对C++构造函数与析构函数以及成员的构造和析构顺序理解 1.对象构造过程中执行的顺序 (1)先构造基类的成员 (2)执行基类的构造函数(在执行构造函数里我们写的代码之前基类的成员已经创建好了) (3)构造派生类的成员 (4)执行派生类的构造函数 由输出结果可知,先构建基类b的成员也就是c,再执行基类b的构造函数。然后再构造派生类a的成员d,然后再执行a的构造函数。 2.对象析构过程中的执行顺序 (1)先执行派生类的析构... 阅读详情

C++的安全性高也体现在提供了构造与析构函数区初始化变量、清除变量。

 

1)          C语言的初始化

l       全局变量和静态变量

对于基本类型如int、float、char、int*,默认初始值分别为0、0、'/0'、0。结构体或联合体也会被初始化。

l       除了全局变量和静态变量以外, 其它变量如果没有赋初值, 则默认初始值为内存中的垃圾内容,对于垃圾内容不能有任何假设。

l       用malloc()和realloc() 动态分配的内存也存在垃圾内容,因此在使用内存前最好都赋初值。

 

注意:如果初始值是随机值,有可能会导致程序崩溃,比如指针是随机值。

 

2)          数组/结构体初始化

int age[10] = {10};

第一个元素被初始化为10,其他为0。如果没有初始化,将是随机值。

 

struct data

{

int a;

float b;
};

           data c[10] = { {1,1.4}};

           其他为0

 

3)          默认构造函数

如果没有定义任何的构造函数,则编译器使用默认构造函数。默认构造函数不能为你将所有数据都清零。

 

一般来说,尽量不用默认构造函数,自己手动定义一个。

 

4)          拷贝构造函数

l       默认拷贝构造函数

系统默认的拷贝构造函数是浅拷贝,即按位拷贝。

l       什么时候需要定义自己的拷贝构造函数

当需要按值传递,并且需要深拷贝时(拷贝指针指向的内容);否则应该禁止拷贝构造。

提示:深层拷贝时,为提高效率,可不用每次都拷贝内存,用写时拷贝(引用计数)的原理,可在改变对象时才创建一个新对象,拷贝内存。

l       如何禁止默认的拷贝构造

1)      只声明拷贝构造,不实现

2)      定义为私有的拷贝构造

l       子类的拷贝构造需要调用基类的拷贝构造

class A

{
};

class B:public A

{

public:

B(const B& b):A(b)

{


}

               };

 

5)          为什么构造和析构没有返回值

l       构造函数

从基本语义上看,构造函数应该返回的是构建的对象本身。编译器知道它该返回什么,对于用户来说它是没有返回值的。

 

如果构造函数允许用户指定类型,假如是int,那么会出现如下的尴尬:

class A

{

public:

int A(){}

};

1)   A a = A(); //类型不匹配

2)   void Func( A& a)

  void Func( int a )

  Func( A() ); //调用的是哪一个呢,这样就会出现歧义。

                      

l       析构函数

析构函数和构造函数不一样,其不需要用户明确的调用它,超出生命周期后其自然被调用,如果在堆上构造的,可能需要delete来间接的调用。

 

从基本语义上来看,一个对象析构后,是不需要知道它的返回值了。

 

6)          什么时候需要手动调用析构函数

l       当用new placement将对象构建在特定内存时,由于它没有分配内存,所以一般不delete,这时需要手动调用对象的析构函数。

关于new placement请参考

http://blog.youkuaiyun.com/yeming81/archive/2010/06/15/5673019.aspx

 

7)          什么时候析构不会被调用

l       对于局部变量,当程序调用exit(n) 或abort()时,析构函数不会被调用

l       对于全局或局部static对象、全局对象,当程序调用exit(n),析构函数会被调用;当调用abort()时,析构函数不会调用。

关于abort/exit,请参考

http://blog.youkuaiyun.com/yeming81/archive/2010/06/16/5673052.aspx

8)          析构的时机

当超出对象的生命周期时,析构函数被调用;

即使是goto或者nonlocal goto(setjmp/longjmp) 其也会调用(Microsoft C++编译器会,其他可能不会,所以不具备移植性)。

 

例子如下

class A

{

public:

A(){}

~A(){}
};

 

          local goto(在一个函数内跳转)

          int main()

{

{

               A a;

               goto Label1;

}

Label1:

cout<<”end”<<endl;

return 0;
}

 

          nonlocal goto(在不同函数内跳转)

           jmp_buffer jmpbuf;

          void Func()

{

cout << “ get in “ <<endl;

A a;

longjmp(jmpbuf, 1);

cout << “ never get here “<<endl;
}

          int main()

{

cout << “ get in main “ <<endl

if( setjmp (jmpbuf ) == 0 )

{

cout<<”set lable”<<endl;

Func();
}

                      else

{

       cout<<” jmp to here”<<endl;

}

}

 

关于C跳转,请参考

http://blog.youkuaiyun.com/yeming81/archive/2010/05/31/5637734.aspx

 

9)          异常

l       全局或局部静态对象的构造和析构函数抛出异常时,是无法被捕获的(因为不知道在哪里捕获),默认将调用terminate函数。

l       当抛出一个异常时,是先要析构对象,才能处理异常的。这时候,如果析构函数再抛出一个异常,异常处理过程被中断,默认将调用terminate函数。

l       当构造函数抛出异常时,即构造函数没有成功完成,对象的析构函数肯定也不会执行。

l       所以,一般构造函数和析构函数不要抛出异常。

 

关于异常的详细介绍,请参考

http://blog.youkuaiyun.com/yeming81/archive/2010/06/16/5673070.aspx

 

Hi3559AV100制作ext4文件系统和烧录emmc 1、首先生成所需文件系统,见本博客&lt;Hi3559AV100文件系统制作cramfs&gt;。 2、使用工具生成EXT4文件系统 ./make_ext4fs -s -l 96M rootfs_hi3559av100.ext4 ./rootfs 3、烧录文件系统 mw.b 0x82000000 ff 0x12C00000;tftp 0x82000000 STM_... 阅读详情

相关推荐

DeepSeek+知网研学:三步搞定文献矩阵与对比分析(实战指南)

本文提供了一套高效实用的文献管理分析实战指南,详细介绍了如何结合DeepSeek大模型与知网研学平台,通过三个核心步骤快速完成文献梳理。该方法能自动提炼文献核心要素、生成结构化对比矩阵,并辅助发现研究空白,显著提升学术研究者的文献分析效率与深度。

weixin_29061509的博客 491

C++篇----构造函数和析构函数

构造函数和析构函数

m0_67768006的博客 2929

从412到200:一步步拆解瑞数6代jsvmp的cookie生成与验证流程

本文深入解析瑞数6代JSVMP的动态安全防护机制,详细拆解从412到200状态的cookie生成与验证流程。通过剖析JSVMP虚拟机核心机制、动态元数据解析及环境检测绕过策略,为逆向工程师提供实用的技术解决方案,帮助突破瑞数6代的高级防御体系。

weixin_30342209的博客 508

构造函数和析构函数

构造函数、初始化列表、析构函数

C_Trip的博客 5552

【Android】条形码/二维码扫描——ZXing源码分析

正在更新中 针对3.2.1版本源码 与其他版本代码可能会有出入,但核心思想基本不变。 首先从com.google.zxing.client.android包中的目录结构分析:Book:这个文件夹中有5个类: BrowseBookListener 实现了adapter的点击事项响应,通过获取ISBN,然后跳转到Google books中查询响应的详细信息。 SearchBookContents

年轻的学徒 2453

Qt5.15.7编译报错问题汇总:python2安装环境导致的问题

导致编译生成的:RegExpJitTables.h文件大小为0。RegExpJitTables.h 能生成且大小不为0KB。可以看到,正确的python路径,执行编译路径后。再执行 configure XXX…尝试直接改,将其改为正确的路径。

MusicScore的博客 1439

简单了解构造函数和析构函数

构造函数和析构函数

weixin_63246738的博客 784

【大数据技术干货】(还不懂数仓,数据中心?看这一篇就够了!)在实际的开发生产中,让你了解企业级数据中心整体架构(DB+ETL+ODS+DW+DM)的各个层次的过程详解,数据联系及功能区分

一 企业级数据中心架构 数据仓库的整体架构,各个系统的元数据通过ETL同步到操作性数据仓库ODS中,对ODS数据进行面向主题域建模形成DW(数据仓库),DM是针对某一个业务领域建立模型,具体用户(决策层)查看DM生成的报表。 二 DB 三 ETL(Extract-Transform-Load) ETL是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程,目的是将企业中的分散、零乱、标准不统一的数据整合到一起,为企业的决策提供分析依据。 ETL是BI项目重要的一个环节。 通常情况下,在BI项目中ET

liuchunhang的博客 1289

(四)构造函数、析构函数、拷贝构造函数

默认构造函数的重要性、析构函数的参数只能为类类型对象的引用,浅拷贝对于资源管理方面的处理。

曾几何时的博客 2355

1分钟了解LangChain是什么?

是一个基于大型语言模型(LLM)开发应用程序的框架, 它旨在简化语言模型应用的开发流程,特别是在构建对话系统和其他基于语言的AI解决方案时.目标是将复杂的语言模型技术转化为可通过简单API调用实现的功能,从而使开发者能够更加专注于创造性的解决方案设计。高效地解决了开发大语言模型应用的痛点问题。Langchain 最主要的特色是可以将 LLM 应用研发过程中的交互 Prompt、LLM 模型调用、语言模型与环境互动的自适应等方式融为一体。

gorgor在码农 2630

打通ZYNQ的任督二脉:AXI_FIFO数据交互全解析

FIFO(First In First Out,先进先出)是一种经典的数据缓冲结构,就像排队买票一样,先来的人先得到服务。时钟域交叉(CDC):连接不同时钟频率的模块数据缓冲:平衡生产者和消费者的速度差异流量控制:防止数据丢失或溢出input clk,// 输入AXI4-Stream接口(从PS到PL)// 输出AXI4-Stream接口(从PL到PS)// 状态指示信号// 定义状态机状态// 数据缓存// 8个深度的缓存// 流水线处理寄存器。

QQ_778132974的博客 306

C++多重继承的构造与析构的顺序

C++多重继承的构造与析构的次序 在C++的多重继承中含有虚基类,成员对象时很容易把构造与析构的顺序弄不清楚 下面看一段代码 #include <iostream> using namespace std; class OBJ1 { public: OBJ1() { cout<<"OBJ1"<<endl; } ~O...

Gowi的博客 2243

Playwright实战:打造绕过全维度前端反爬的无头浏览器爬虫(2026实战版)

Playwright绕过前端反爬的核心是模拟真实:真实的设备指纹、真实的行为轨迹、真实的网络请求;2025年前端反爬的核心检测维度是设备指纹+行为轨迹+网络请求,三者缺一不可;实战中需重点关注WebGL/Canvas指纹模拟、行为随机性、请求头完整性,这是绕过反爬的关键;性能优化需以“不触发反爬”为前提,优先选择浏览器复用、资源拦截,而非无限制并发。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2094

子类构造与析构时,父类构造与析构机制

子类构造与析构时,父类构造与析构机制1 构造子类对象时,先调用父类构造函数,再调用子类构造函数(构造函数没有虚函数这一说法) 析构子类对象时,先调用子类的析构函数,再调用父类析构函数(无论父类的析构函数是否为虚函数) 构造子类构造的父类对象时,先调用父类构造函数,再调用子类构造对象(构造函数没有虚函数这一说) 析构子类构造的父类对象时: 若父类时虚函数,则先调用子类析构函数,再调用父类析构函数 若父类不是虚函数,则只调用父类的析构函数 https://blog.youkuaiyun.com/weixin_

charles666_zq的博客 1484

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C++继承中的构造与析构

文章目录1 C++继承中的构造1.1 子类对象初始化父类成员的方式1.2 子类对象的构造2 C++继承中的析构2.1 子类对象的析构 1 C++继承中的构造 1.1 子类对象初始化父类成员的方式 思考一下:如何初始化父类成员?父类构造函数和子类构造函数有什么关系? 子类对象的构造: 子类对象中可以定义构造函数。 子类构造函数:必须被继承而来的成员进行初始化。 直接通过初始化列表或者赋值的方式进...

木子皿--啥都不会的菜鸟 1154

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JAVA构造 析构_Java构造方法与析构方法

Java构造方法类有一个特殊的成员方法叫作构造方法,它的作用是创建对象并初始化成员变量。在创建对象时,会自动调用类的构造方法。构造方法定义规则:Java 中的构造方法必须与该类具有相同的名字,并且没有方法的返回类型(包括没有void)。另外,构造方法一般都应用 public 类型来说明,这样才能在程序任意的位置创建类的实例也就是对象。示例:下面是一个 Rectangle 类的构造方法,一个是带有两...

weixin_35867815的博客 388

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

构造方法与析构方法

构造方法与析构方法是对象中的两个特殊方法,它们都与对象的生命周期有关。构造方法是对象创建完成后第一个被对象自动调用的方法,这也是我们在对象中使用构造方法的原因。而析构方法是对象在销毁之前最后一个被对象自动调用的方法,这也是我们在对象中使用析构方法的原因。所以通常使用构造方法完成一些对象的初始化工作,使用析构方法完成一些对象在销毁前的清理工作。1、构造方法 在类中声...

weixin_34303897的博客 444

C++继承中的构造与析构机制详解

只有当类中没有定义任何构造函数时,才会生成默认无参构造函数,但凡类中有定义的任何一个构造函数,都不会生成默认无参构造函数。只要类中没有定义拷贝构造函数,就会默认生成一个拷贝构造函数,执行浅拷贝,只要定义了一个拷贝构造函数,就不会在生成默认拷贝构造函数。

左手の明天的博客 966

JAVA构造 析构_[java]Java构造方法与析构方法

Java构造方法类有一个特殊的成员方法叫作构造方法,它的作用是创建对象并初始化成员变量。在创建对象时,会自动调用类的构造方法。构造方法定义规则:Java 中的构造方法必须与该类具有相同的名字,并且没有方法的返回类型(包括没有void)。另外,构造方法一般都应用 public 类型来说明,这样才能在程序任意的位置创建类的实例也就是对象。示例:下面是一个 Rectangle 类的构造方法,一个是带有两...

weixin_32873435的博客 215

C++对象构造与析构全流程

对象构造流程 1. 首先,如果有virtual base class constructors,虚基类的构造函数必须被调用,从左往右,从深往浅: -&gt;如果有virtual base class constructor位于成员初值列,有任何显示指定的参数都应该传递过去;若没有位于初值列,而virtual base class含有一个默认构造函数,也应该调用。 -&gt;class中的...

Innocent_code的专栏 812

第46课 继承中的构造与析构

本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结 子类对象的构造 子类中可以定义构造函数 子类构造函数 必须对继承而来的成员进行初始化 直接通过初始化列表 或者 赋值的方式 进行初始 调用父类构造函数 进行初始化 父类构造函数在子类中的调用方式 默认调用: *适用于 无参构造函数 和 使用默认参数的构造函数 显示调用: 通过 初始化列表 进行调用 适用于 所有 父类构...

lzg2011的博客 210

C++父类与子类间构造,析构,拷贝的调用关系

C++父类与子类间构造,析构,拷贝的调用关系 构造 子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数 默认执行无参构造 #include <iostream> #include <stdio.h> #include <cstring> using namespace std; class Base { char *str; pu...

BroWuG的博客 1774

继承中父类与子类的构造与析构顺序

积少成多

SZYLQJ的博客 794

C++对象构造与析构

本文较为详细的研究了C++中包含虚函数继承体系中对象的构造和析构过程。正如你的代码所展示的,在构造函数中调用虚函数无法实现多态行为。因为这可能导致未定义行为或错误的结果,所以这被视为一个需要特别注意的不良实践。​​析构过程中也存在类似情况。当析构一个派生类对象时,首先调用派生类的析构函数,然后调用基类的析构函数。在基类的析构函数执行期间,对象会被视为基类类型,任何虚函数调用都会静态绑定到基类的实现。

surfaceyan的博客 570

Day063: 构造方法与析构方法

在上两篇文章中,我们深入探讨了 Python 面向对象编程的基础 —— 类与对象的定义、实例化以及类的属性与方法。我们了解到,类是对象的模板,而对象是类的实例,通过类,我们可以创建出具有相同结构但不同数据的对象。然而,类的真正强大之处不仅在于能够创建对象,更在于其能够通过属性和方法来描述对象的特征和行为。本文将深入探讨类的构造方法与析构方法,帮助读者全面理解这些核心概念。

u014481728的博客 1270
上一篇: 函数指针
下一篇: C语言的结构跳转 (goto / longjmp)
yeming81
博客等级 码龄19年 178粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值