`

类构造和析构研究

    博客分类:
  • 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

 

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

 

 

 

 

 

分享到:
评论

相关推荐

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

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

    传智播客_C++基础课程讲义_v1.0.7

    3.3.4继承与组合混搭情况下,构造和析构调用原则 6 3.3.5继承中的同名成员变量处理方法 6 3.3.6派生类中的static关键字 6 3.4多继承 6 3.4.1多继承的应用 6 3.4.2虚继承 6 3.5继承总结 6 4、多态 6 4.1多态 6 4.1.1...

    C++实验五.docx

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

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

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

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

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

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

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

    程序员必须知晓的11个C++要点-供大家学习研究参考

    由函数成员所返回的数据类型构成,类名后跟上::符号、指针名和函数的参数列表。举个例子:一个指向类A的函数成员(该函数返回int类型)的指针: ...另一个需要注意的地方,你不能取一个类的构造函数和析构函数的地址。

    Python与Java在面向对象机制方面的比较.pdf

    从顶层类及其内置函数、类的对象实例化、类的权限修饰符、抽象类和接口、构造函数和析构函数等面向对象机制的几个方面分析和比较了Python语言与java语言的不同。归纳总结这些不同,有助于软件设计方法和软件编程教育...

    C++程序设计彻底研究(是code不是书)

    19.6 派生类所定义的对象的构造和析构次序 19.7 混合组合和继承以建立新的类 19.8 常犯的错误 19.9 本章重点 19.10 本章练习 第20章 多态与虚拟函数 20.1 多态的基本概念 20.2 后期连接与虚拟函数 20.3 VPTR...

    C++大学教程,一本适合初学者的入门教材(part1)

    9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合与继承的比较 9.13 对象的“使用”关系和“知道”关系 9.14 实例研究:类Point、CircIe和...

    C++程序设计代码

    3.(选做)声明一个哺乳动物类Mammal,再由此派生出狗类Dog,定义一个Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。 4.完善实验四第2题的程序,具体要求如下: 任务1:从people(人员)类派生出...

    C++大学教程,一本适合初学者的入门教材(part2)

    9.9 在派生类中使用构造函数和析构函数 9.10 将派生类对象隐式转换为基类对象 9.11 关于继承的软件工程 9.12 复合与继承的比较 9.13 对象的“使用”关系和“知道”关系 9.14 实例研究:类Point、CircIe和...

    lab-01-string

    通过一个简单的示例,您应该研究如何安排一个类,如何创建类方法,什么是封装,正确实现副本构造函数,赋值运算符和析构函数。 理论背景 该类表示复合类型。 C ++中的类非常类似于C中的结构。此外,C ++中的类和...

    智能指针与弱引用详解

    而且指针也不具备构造函数和析构函数,所以为了实现内存( 动态存储区) 的安全回收,必须对指针进行一层封装,而这个封装就是智能指针,其实说白了,智能指针就是具备指针功能同时提供安全内存回收的一个类。...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    5.3 设计健壮的构造函数(和析构函数) 70 5.4 在类中设计错误处理 70 5.4.1 对类建立文档以及使用注释 71 5.4.2 构建类要以合作为出发点 71 5.5 设计时充分考虑重用 72 5.6 设计时充分考虑到可扩展性 72 5.6.1...

Global site tag (gtag.js) - Google Analytics