`

类构造和析构研究

    博客分类:
  • C++
 
阅读更多

一、代码1(全局类变量)

#include <iostream>
using namespace std;
class A{
public:
	A();
	~A();
};
A::A(){
	std::cout<<"A construct"<<std::endl;
}
A::~A(){
	std::cout<<"A destruct"<<std::endl;
}
A a;
int main(){
	int b = 100000;
	std::cout<<"main start"<<std::endl;
	while(b--){
	}
	std::cout<<"main end"<<std::endl;
	return 0;
}

 运行结果如下:

A construct
main start
main end
A destruct

 结论:全局类变量的构造在main之前,析构在main返回之前

二、代码2(局部类变量)

#include <iostream>
using namespace std;
class A{
public:
	A();
	~A();
};
A::A(){
	std::cout<<"A construct"<<std::endl;
}
A::~A(){
	std::cout<<"A destruct"<<std::endl;
}

int main(){
	int b = 100000;
	std::cout<<"main start"<<std::endl;
	A a;
	while(b--){
	}
	std::cout<<"main end"<<std::endl;
	return 0;
}

运行结果如下:

main start
A construct
main end
A destruct

 结论:局部类变量同普通变量一样在定义处构造,在函数返回后析构

三、代码3(局部类指针变量)

#include <iostream>
using namespace std;
class A{
public:
	A();
	~A();
};
A::A(){
	std::cout<<"A construct"<<std::endl;
}
A::~A(){
	std::cout<<"A destruct"<<std::endl;
}

int main(){
	int b = 100000;
	std::cout<<"main start"<<std::endl;
	A *a = new A();
	while(b--){
	}
	delete a;
	std::cout<<"main end"<<std::endl;
	return 0;
}

 运行结果:

main start
A construct
A destruct
main end

 结论:类在new处构造,在delete处析构

四、代码4(类作为其他类的成员变量)--实例方式

#include <iostream>
using namespace std;
class B{
public:
	B();
	~B();

};
B::B(){
	std::cout<<"B construct"<<std::endl;
}
B::~B(){
	std::cout<<"B destruct"<<std::endl;
}
class A{
public:
	A();
	~A();
public:
	B b;
};
A::A(){
	std::cout<<"A construct"<<std::endl;
}
A::~A(){
	std::cout<<"A destruct"<<std::endl;
}

int main(){
	int b = 100000;
	std::cout<<"main start"<<std::endl;
	A *a = new A();
	while(b--){
	}
	delete a;
	std::cout<<"main end"<<std::endl;
	return 0;
}

 运行结果如下:

main start
B construct
A construct
A destruct
B destruct
main end

 结论:以实例作为其他类的成员,比拥有它的类先调用构造函数,且比拥有它的类后调用析构函数

五、代码5(类作为其他类的成员变量)--指针方式

#include <iostream>
using namespace std;
class B{
public:
	B();
	~B();

};
B::B(){
	std::cout<<"B construct"<<std::endl;
}
B::~B(){
	std::cout<<"B destruct"<<std::endl;
}
class A{
public:
	A();
	~A();
public:
	B *b;
};
A::A(){
	b = new B();
	std::cout<<"A construct"<<std::endl;
}
A::~A(){
	delete b;
	std::cout<<"A destruct"<<std::endl;
}

int main(){
	int b = 100000;
	std::cout<<"main start"<<std::endl;
	A *a = new A();
	while(b--){
	}
	delete a;
	std::cout<<"main end"<<std::endl;
	return 0;
}

 运行结果如下:

main start
B construct
A construct
B destruct
A destruct
main end

 

结论:可以通过指针的方式控制类成员的生存期

 

 

 

 

 

分享到:
评论

相关推荐

    cpp代码-构造和析构调用顺序

    本文将深入探讨C++中构造和析构调用的顺序,以及相关的编程概念。 首先,构造函数是在创建对象时自动调用的特殊成员函数,用于设置新对象的初始状态。每个类可以有一个默认构造函数(没有参数的构造函数)或带有...

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

    在C++编程语言中,构造函数、复制构造函数和析构函数是面向对象特性的重要组成部分,它们在对象的生命周期管理中扮演着至关重要的角色。同时,继承、虚函数和多态性是C++实现面向对象设计的核心概念。下面将详细讨论...

    第四节–构造函数和析构函数

     | = PHP5研究中心: http://blog.csdn.net/haohappy2004 +——————————————————————————-+ */ 第四节–构造函数和析构函数 如果你在一个类中声明一个函数,命名为__construct,这

    lab4 实验报告1

    实验可能涉及创建基类对象,然后派生类对象,并观察它们的构造和析构顺序。基类先构造,派生类后构造;派生类先析构,基类后析构。 **Exp2:对象初始化在继承中的处理** 这一部分关注的是对象初始化的问题,强调了...

    PHP类的声明与实例化及构造方法与析构方法详解

    在本篇文章中,我们将深入探讨PHP类的声明、实例化,以及构造方法和析构方法。 首先,让我们理解类的声明。在PHP中,我们可以使用`class`关键字来声明一个类。例如: ```php class Human { // 类的属性 public $...

    实验报告模板——实验1:类和简单对象.pdf

    实验过程中,学生需要关注类的构造和析构过程,例如在Coordinate类中观察不同构造函数的调用情况,理解拷贝构造函数的作用。通过修改构造函数,增加输出语句,观察程序执行流程。同时,实验还要求识别并解决可能的...

    (完整版)C++选择题练习.doc

    构造函数和析构函数是C++语言中两个重要的概念,文档中对构造函数和析构函数的定义、调用、参数传递、返回值等进行了详细的介绍。同时,也对构造函数和析构函数的优点、缺点等进行了讨论。 指针是C++语言中的一种...

    实验四、类的继承与派生 类的继承与派生

    `CPeople` 类还包含了构造函数和析构函数,用于初始化和清理对象。 接下来,我们从 `CPeople` 类派生出两个子类:`CStudent` 和 `CTeacher`。`CStudent` 类增加了学号、入学时间和入学成绩属性,而 `CTeacher` 类则...

    类的继承与派生实验

    - 引入虚基类后,构造函数和析构函数的调用顺序会有变化,因为虚基类的构造函数会被首先调用,以确保所有派生类共享同一份数据。 5. 赋值兼容: - 赋值兼容性是指派生类对象可以被赋值给基类对象。为了保证正确...

    C++Primer第四版中文版+习题解答

    3. **构造与析构链**:理解对象的构造和析构过程,包括构造函数的链式调用和析构顺序。 五、标准库 1. **容器**:如vector、list、deque、set、map等,以及它们的操作方法。 2. **迭代器**:学习如何使用迭代器遍历...

    深度探索C++对象模型

    通过深入研究类与对象的内存布局、虚函数机制、构造与析构过程、继承与派生关系以及现代C++中的内存管理技术,开发者能够写出更高效、更安全的代码。无论是对于初学者还是有经验的开发人员,掌握C++对象模型都是提升...

    cpp_4.ppt

    4.5 派生类的构造函数和析构函数 在派生类中,需要定义构造函数和析构函数,以便在对象创建和销毁时执行相应的操作。在派生类的构造函数中,可以调用基类的构造函数,以便初始化基类的成员。 4.6 多继承 在C++中...

    C++ 面向对象程序设计 继承与派生

    C++,多继承,虚继承,聚合类,举例,中学生类派生出大学生类和研究生类,大学生类的属性还包括班级、专业、系;研究生类的属性还包括研究方向...定义构造函数(初始化所有属性)和析构函数以及数据成员的设置和输出。

    论文研究-NDQFP程序中类型关联函数的语法分析 .pdf

    例如,通过定义一个构造函数和析构函数,可以构建在特定类型上操作的加法函数,这个函数会先进行类型检查和标记,然后执行加法操作,并最终将操作结果转换回正确的类型标记。 总之,NDQFP语言中的类型关联函数为...

    C++课程实验五代码大全.zip

    (2) 声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。 (3) 声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop等成员函数,...

    STL源码剖析终稿621

    标准接口定义了分配和释放内存的基本操作,以及对象的构造和析构。例如,SGI STL中提供了std::allocator作为默认的空间分配器,它实现了基本的内存分配策略。std::alloc则是SGI特有的分配器,它在某些情况下可能提供...

    C++实验.pdf

    这旨在让学生理解类的构造和成员函数,以及构造函数和析构函数的作用。实验1.2和1.3进一步扩展了这一概念,通过学生管理和长方体体积计算的例子,引入了类的实例化、封装和成员访问控制。 实验二着重于类的高级特性...

    传智播客扫地僧视频讲义源码

    05_MyString类案例_构造和析构函数 06_MyString类案例_重载等号和数组操作符_传智扫地僧 07_MyString类案例_重载左移操作符 08_MyString类案例_重载双等号和不等号 操作符 09_MyString类案例_重载大于和小于操作符 ...

Global site tag (gtag.js) - Google Analytics