一、代码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
结论:可以通过指针的方式控制类成员的生存期
相关推荐
本文将深入探讨C++中构造和析构调用的顺序,以及相关的编程概念。 首先,构造函数是在创建对象时自动调用的特殊成员函数,用于设置新对象的初始状态。每个类可以有一个默认构造函数(没有参数的构造函数)或带有...
在C++编程语言中,构造函数、复制构造函数和析构函数是面向对象特性的重要组成部分,它们在对象的生命周期管理中扮演着至关重要的角色。同时,继承、虚函数和多态性是C++实现面向对象设计的核心概念。下面将详细讨论...
| = PHP5研究中心: http://blog.csdn.net/haohappy2004 +——————————————————————————-+ */ 第四节–构造函数和析构函数 如果你在一个类中声明一个函数,命名为__construct,这
实验可能涉及创建基类对象,然后派生类对象,并观察它们的构造和析构顺序。基类先构造,派生类后构造;派生类先析构,基类后析构。 **Exp2:对象初始化在继承中的处理** 这一部分关注的是对象初始化的问题,强调了...
在本篇文章中,我们将深入探讨PHP类的声明、实例化,以及构造方法和析构方法。 首先,让我们理解类的声明。在PHP中,我们可以使用`class`关键字来声明一个类。例如: ```php class Human { // 类的属性 public $...
实验过程中,学生需要关注类的构造和析构过程,例如在Coordinate类中观察不同构造函数的调用情况,理解拷贝构造函数的作用。通过修改构造函数,增加输出语句,观察程序执行流程。同时,实验还要求识别并解决可能的...
构造函数和析构函数是C++语言中两个重要的概念,文档中对构造函数和析构函数的定义、调用、参数传递、返回值等进行了详细的介绍。同时,也对构造函数和析构函数的优点、缺点等进行了讨论。 指针是C++语言中的一种...
`CPeople` 类还包含了构造函数和析构函数,用于初始化和清理对象。 接下来,我们从 `CPeople` 类派生出两个子类:`CStudent` 和 `CTeacher`。`CStudent` 类增加了学号、入学时间和入学成绩属性,而 `CTeacher` 类则...
- 引入虚基类后,构造函数和析构函数的调用顺序会有变化,因为虚基类的构造函数会被首先调用,以确保所有派生类共享同一份数据。 5. 赋值兼容: - 赋值兼容性是指派生类对象可以被赋值给基类对象。为了保证正确...
3. **构造与析构链**:理解对象的构造和析构过程,包括构造函数的链式调用和析构顺序。 五、标准库 1. **容器**:如vector、list、deque、set、map等,以及它们的操作方法。 2. **迭代器**:学习如何使用迭代器遍历...
通过深入研究类与对象的内存布局、虚函数机制、构造与析构过程、继承与派生关系以及现代C++中的内存管理技术,开发者能够写出更高效、更安全的代码。无论是对于初学者还是有经验的开发人员,掌握C++对象模型都是提升...
4.5 派生类的构造函数和析构函数 在派生类中,需要定义构造函数和析构函数,以便在对象创建和销毁时执行相应的操作。在派生类的构造函数中,可以调用基类的构造函数,以便初始化基类的成员。 4.6 多继承 在C++中...
C++,多继承,虚继承,聚合类,举例,中学生类派生出大学生类和研究生类,大学生类的属性还包括班级、专业、系;研究生类的属性还包括研究方向...定义构造函数(初始化所有属性)和析构函数以及数据成员的设置和输出。
例如,通过定义一个构造函数和析构函数,可以构建在特定类型上操作的加法函数,这个函数会先进行类型检查和标记,然后执行加法操作,并最终将操作结果转换回正确的类型标记。 总之,NDQFP语言中的类型关联函数为...
(2) 声明一个基类BaseClass,有整形成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况。 (3) 声明一个车(vehicle)基类,具有MaxSpeed,Weight等成员变量,Run,Stop等成员函数,...
标准接口定义了分配和释放内存的基本操作,以及对象的构造和析构。例如,SGI STL中提供了std::allocator作为默认的空间分配器,它实现了基本的内存分配策略。std::alloc则是SGI特有的分配器,它在某些情况下可能提供...
这旨在让学生理解类的构造和成员函数,以及构造函数和析构函数的作用。实验1.2和1.3进一步扩展了这一概念,通过学生管理和长方体体积计算的例子,引入了类的实例化、封装和成员访问控制。 实验二着重于类的高级特性...
05_MyString类案例_构造和析构函数 06_MyString类案例_重载等号和数组操作符_传智扫地僧 07_MyString类案例_重载左移操作符 08_MyString类案例_重载双等号和不等号 操作符 09_MyString类案例_重载大于和小于操作符 ...