`

C++ 中的new,delete与构造函数,析构函数的调用时机

    博客分类:
  • C++
 
阅读更多
结论:new 一个数组时必须要有默认构造函数;
     delete数组时其中的所有元素的析构函数均会被调用。


#include <iostream>

using namespace std;
class TmpClass{
public:
	int member;
	TmpClass(int a):member(a){
		cout<<"构造函数:int"<<endl;
	}

	TmpClass():member(0){//没有默认构造函数时没法new一个该类的数组
		cout<<"构造函数:默认"<<endl;
	}

	TmpClass(TmpClass& tmp){
		cout<<"copy 构造函数"<<endl;
	}

	TmpClass& operator=(const TmpClass& tmp){
		if(this==&tmp){
			cout<<"= 自己"<<endl;
			return *this;
		}

		this->member=tmp.member+100;
		cout<<"= 非自己"<<endl;
		//没写return 也编译通过了
	}

	//返回值改为void, 则下面的 m=m; 没问题, 但m=m=m;就不行了
// 	void operator=(const TmpClass& tmp){
// 		if(this==&tmp){
// 			cout<<"= 自己了"<<endl;
// 			return ;
// 		}
// 
// 		this->member=tmp.member+100;
// 		cout<<"= 非自己"<<endl;
// 
// 	}

	~TmpClass()
	{
		cout<<"析构函数,member="<<member<<endl;
	}
};



void main(){
	cout<<"***\tbefore new"<<endl;
	TmpClass* tmp=new TmpClass[2];
	cout<<"***\tafter new"<<endl<<endl;
	tmp[0].member=10;
	tmp[1].member=11;

	TmpClass m(1);
	m=(m=m);
	cout<<"***\tbefore push"<<endl;
	tmp[0]=m;
	cout<<"***\tafter push"<<endl<<endl;

	cout<<"***\tbefore delete"<<endl;
	delete []tmp;
	cout<<"***\tafter delete"<<endl;
	cout<<"main函数返回前"<<endl;
}


运行结果:

  • 大小: 38.4 KB
分享到:
评论

相关推荐

    包含构造函数和析构函数的C++程序

    构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象的生命周期,确保资源得到妥善管理。 #### 构造函数...

    构造函数不能声明为虚函数,析构函数可以声明为虚函数

    在这个例子中,如果`A`类的析构函数没有声明为虚函数,则只调用基类`A`的析构函数。反之,由于`A`的析构函数是虚函数,因此在删除`B`对象时,不仅调用了基类`A`的析构函数,还调用了派生类`B`的析构函数,从而正确...

    C++中的new/delete、构造/析构函数、dynamic_cast分析

    C++中的new/delete、构造/析构函数、dynamic_cast分析 C++中的new/delete操作符是C++语言中动态内存管理的核心机制。new操作符用于申请堆空间,delete操作符用于释放堆空间。构造函数和析构函数是C++中的两种特殊...

    c++中析构函数和构造函数

    C++中的析构函数和构造函数 C++中,析构函数和构造函数是两个非常重要的概念,它们在对象的生命周期中扮演着关键角色。下面将详细介绍这两个概念的定义、特点和使用方法。 一、析构函数 析构函数是C++中的一种...

    c语言析构函数

    标题和描述中提到的知识点是关于C语言的析构函数,但实际上,析构函数是C++的概念,并非C语言的一部分。然而,基于给定的部分内容,我们可以深入探讨C++中的析构函数及其相关知识点。 ### 析构函数:C++中的资源...

    构造、析构函数

    构造函数与析构函数是C++中非常重要的概念,它们在对象的生命周期管理中扮演着核心角色。构造函数主要用于初始化对象,而析构函数则负责清理对象占用的资源。 #### 构造函数 构造函数是一种特殊的成员函数,其名称...

    类构造函数与析构函数

    类构造函数与析构函数 类构造函数是C++面向对象编程中的一种特殊函数,它们用于初始化类对象的成员变量。在C++中,每个类都必须有一个默认的构造函数,如果没有提供构造函数,那么C++将自动提供一个默认的构造函数...

    string 类实现,构造函数、析构函数、操作符重载等

    在本篇文章中,我们将深入探讨一个自定义`String`类的实现细节,该类包含了构造函数、析构函数以及各种常用的操作符重载方法。通过具体的代码示例,我们可以更好地理解这些功能如何在C++中被实现。 #### 一、String...

    构造函数与析构函数_构造函数ppt_

    在编程领域,特别是面向对象编程(Object-Oriented Programming,OOP)中,构造函数与析构函数是两个至关重要的概念。它们在类的生命周期管理中扮演着核心角色,确保对象的正确初始化和清理。本PPT文件"3.1构造函数...

    c++(7) 构造和析构函数

    构造函数与析构函数是C++中非常重要的概念,它们对于确保类实例的正确初始化与清理至关重要。本文将详细介绍构造函数与析构函数的相关知识点。 #### 一、构造函数 构造函数是一种特殊成员函数,其主要任务是在对象...

    c构造函数与析构函数PPT学习教案.pptx

    在C++编程语言中,构造函数和析构函数是类中的两个特殊成员函数,它们分别在对象的生命周期开始和结束时被调用。构造函数的主要任务是对新创建的对象进行初始化,而析构函数则用于在对象即将被销毁之前执行清理工作...

    为何要虚析构函数.docx

    在 C++ 编程语言中,面向对象编程的重要特性之一就是类...因此,析构函数可以是虚的,而构造函数不能,这是由它们在程序执行中所扮演的角色和时机所决定的。理解这一点,对于正确利用 C++ 中的继承和多态特性至关重要。

    C++构造函数,复制构造函数和析构函数专题[1].pdf

    总之,理解并熟练运用构造函数、复制构造函数、析构函数、继承、虚函数和多态性是掌握C++面向对象编程的关键。它们共同构成了C++强大而灵活的类层次结构和对象模型,为复杂软件设计提供了坚实的基础。通过深入研究和...

    虚析构函数示例

    析构函数是C++中的一个特殊成员函数,其作用是在对象生命周期结束时自动调用,用于清理对象占用的资源,如释放内存或关闭文件等。析构函数的名称以波浪线(~)开头,后面跟类的名字。 虚析构函数(virtual ...

    C++面试试题-拷贝构造函数

    1. 在`f`函数中,`input`的析构函数被调用,释放了`m_p`指向的内存。 2. 当`b`离开作用域时,其析构函数也被调用,尝试释放同一块内存,导致双重释放错误。 #### 解决方案 为了避免此类问题,可以考虑以下几点: 1....

    构造与析构函数(csdn)————程序.pdf

    析构函数与构造函数相反,它在对象生命周期结束时被调用,通常用于清理资源,如释放动态分配的内存。析构函数的名称是以波浪线`~`开头,后跟类名。在栈上的对象,其析构函数会在所属的作用域结束时自动调用;而在堆...

    C++中new/delete与new[]/delete[]的使用区别

    使用`delete`释放数组会导致未定义行为,因为`delete`不会正确地调用数组中每个元素的析构函数。同样,使用`delete`而不是`delete[]`来释放非数组对象也会导致问题,因为它会尝试释放不属于单个对象的额外内存。 ...

Global site tag (gtag.js) - Google Analytics