C++类构造析构调用顺序训练(复习专用)

//对象做函数参数
//1 研究拷贝构造
//2 研究构造函数,析构函数的调用顺序

//总结 构造和析构的调用顺序

#include "iostream"
using namespace std;

class ABCD
{ //this()
public:
	ABCD(int a, int b, int c)
	{
		this->a = a;
		this->b = b;
		this->c = c;
		printf("ABCD() construct, a:%d,b:%d,c:%d  \n", this->a, this->b, this->c);
	}
	~ABCD()
	{
		printf("~ABCD() construct,a:%d,b:%d,c:%d  \n", this->a, this->b, this->c);
	}
	int getA()
	{
		return this->a;
	}
protected:
private:
	int a;
	int b;
	int c;
};

class MyE
{
public:
	MyE() :abcd1(1, 2, 3), abcd2(4, 5, 6), m(100)
	{
		cout << "MyD()" << endl;
	}
	~MyE()
	{
		cout << "~MyD()" << endl;
	}
	MyE(const MyE & obj) :abcd1(7, 8, 9), abcd2(10, 11, 12), m(100)
	{
		printf("MyD(const MyD & obj)\n");
	}

protected:
	//private:
public:
	ABCD abcd1; //c++编译器不知道如何构造abc1
	ABCD abcd2;
	const int m;

};

int doThing(MyE mye1)
{
	printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA());
	return 0;
}

int run2()
{
	MyE myE;
	doThing(myE);
	return 0;
}

//
int run3()
{
	printf("run3 start..\n");

	ABCD abcd = ABCD(100, 200, 300); //用临时对象来初始化一个对象,就会把临时对象变化成要初始化的对象,而不会调用copy构造函数,临时对象也不用将自己赋值给对方,然后自己销毁这么麻烦.

	//ABCD(400, 500, 600); //临时对象的生命周期
	printf("run3 end\n");
	return 0;
}

int main()
{
	run2();
	//run3();
	system("pause");
	return 0;
}

  

输出\

时间: 2024-10-15 06:21:08

C++类构造析构调用顺序训练(复习专用)的相关文章

c++继承构造析构调用原则以及特殊变量处理

一.继承中的构造析构调用原则 1.子类对象在创建时会首先调用父类的构造函数 2.父类构造函数执行结束后,执行子类构造函数 3.当父类构造函数有参数时,需要在子类的初始化列表中显示调用: 4.析构函数调用的先后顺序与构造函数相反 二.继承与组合混搭时,构造与析构的调用原则 1.先析构父类,再构造成员变量,最后构造自己 2.先析构自己,在析构成员变量,最后析构父类(先析构的对象,后释放) 三.继承中同名成员变量处理方法 1.当子类成员变量与父类的成员变量同名时,子类依然从父类继承同名成员,且同名成员

继承中的构造析构函数调用顺序

子类构造函数必须堆继承的成员进行初始化: 1. 通过初始化列表或则赋值的方式进行初始化(子类无法访问父类私有成员) 2. 调用父类构造函数进行初始化 2.1  隐式调用:子类在被创建时自动调用父类构造函数(只能调用父类的无参构造函数和使用默认参数的构造函数) 2.2  显示调用:在初始化列表调用父类构造函数(适用所有的父类构造函数) #include <iostream> #include <string> using namespace std; class PParent //

构造 析构调用时机

#include "stdafx.h" class MyClass{public: MyClass() {  printf("MyClass"); } ~MyClass() {  printf("~MyClass"); } }; int _tmain(int argc, _TCHAR* argv[]){ MyClass my;//系统会为你调用析构 MyClass *my=new MyClass://需要手动delete才会调用析构,否则内存泄露

【C/C++】构造函数与析构函数的调用顺序

常见问题 Q1. 以下代码的输出结果是什么? 1 #include <iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 A() { cout << "A" << endl; } 8 ~A() { cout << "~A" << endl; } 9 }; 10 class B : public A 11 { 12 public: 13 B

继承中參数传递及调用顺序

一.简单派生类的构造函数传參 C++语言的继承特性,指子类能够继承父类的属性和行为,并能够又一次定义或加入新的属性和行为. 父类中为private型的属性和行为尽管被继承,可是子类中仍不能訪问.在继承机制下.构造函数是不能被继承的,所以基类构造函数的參数要由子类构造函数传. 单一继承的子类构造函数的声明(.h中)形式为: 派生类构造函数名(參数总表) (); 单一继承的子类构造函数的定义(.cpp中)形式为: 派生类名::派生类构造函数名(參数总表) : 基类构造函数名 (參数名表) { 派生类

C++语言笔记系列之十三——派生类构造函数的调用

1.派生类构造函数的调用 (1)一个基类的所有数据成员均被派生类继承.创建一个派生类对象时,系统在为派生类对象分配单元时一定要为其基类数据成员分配子空间. (2)一个派生类对象在创建时不仅要调用派生类构造函数,而且要调用基类构造函数. 派生类中的数据成员在派生类中构造. 基类中的数据成员在基类中构造. 原因: A.构造函数不继承. B.派生类的构造函数必须通过调用基类的构造函数完成基类数据成员的初始化. C.若派生类中含有子对象,必须调用子对象的构造函数. 2.派生类的构造函数 派生类名(总参数

继承中参数传递及调用顺序

一.简单派生类的构造函数传参 C++语言的继承特性,指子类可以继承父类的属性和行为,并可以重新定义或添加新的属性和行为.父类中为private型的属性和行为虽然被继承,但是子类中仍不能访问.在继承机制下,构造函数是不能被继承的,所以基类构造函数的参数要由子类构造函数传! 单一继承的子类构造函数的声明(.h中)形式为: 派生类构造函数名(参数总表) (); 单一继承的子类构造函数的定义(.cpp中)形式为: 派生类名::派生类构造函数名(参数总表) : 基类构造函数名 (参数名表) { 派生类新增

关于Java中基类构造器的调用问题

在<Java编程思想>第7章复用类中有这样一段话,值得深思.当子类继承了父类时,就涉及到了基类和导出类(子类)这两个类.从外部来看,导出类就像是一个与基类具有相同接口的新类,或许还会有一些额外的方法和域.但继承并不只是复制基类的接口.当创建一个导出类对象时,该对象包含了一个基类的子对象,这个子对象与你用基类直接创建的对象是一样的,二者区别在于,后者来自于外部,而基类的子对象是被包裹在导出类对象内部. 这就引发出了一个很重要的问题,对基类子对象的正确初始化也是至关重要的(我们可能在子类的使用基类

子类构造、析构时调用父类的构造、析构函数顺序

析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了. 而定义一个对象时先调用基类的构造函数.然后调用派生类的构造函数:析构的时候恰好相反:先调用派生类的析构函数.然后调用基类的析构函数. 原因: 派生类构造函数中的某些初始化可能是基于基类的,所以规定构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员对象构造函数(因为C++的成员变量是不会自动初始化的,只能使用初始化列表初始化(调用成员的构造函数)或在本层构造函数内初