构造函数和析构函数的探究---1道c++考试题
来源:互联网 发布:java实战开发经典 pdf 编辑:程序博客网 时间:2024/06/03 20:41
题目:
1、请写出下列程序运行结果
#include<iostream>using namespace std;class CConAndDecon {public: CConAndDecon(int value) {m_data = value;cout << "Object " << m_data <<" constructor" <<endl;} //拷贝构造函数 CConAndDecon(const CConAndDecon &other) {m_data = other.m_data - 1 ;cout << "Object " << m_data <<" copy constructor" <<endl;} //复制函数 注意和拷贝构造函数的区别 以及他们分别在什么情况下被调用 CConAndDecon operator=(const CConAndDecon &right) {if( this != &right ) {m_data = right.m_data + 1 ;cout << "Object 's new value is " << m_data <<" " <<endl; }return *this;}~CConAndDecon(){ cout <<"Object " << m_data << " destructor" << endl; }private: int m_data;};void Func(CConAndDecon x);int main(){CConAndDecon *p = new CConAndDecon(10);static CConAndDecon c1( 20);Func(*p); delete p;return 0;}void Func(CConAndDecon x){static CConAndDecon c1 = x;// 定义时的等号是相当于调用的是该对象的拷贝构造函数//这里在调用拷贝构造函数的时候会根据等号后面的类型//来确定调用那一个拷贝构造函数//// 在定义之后的等号是调用的是该对象复制构造函数 CConAndDecon c2 = c1;//注意想构造的后释放 静态的等程序运行结束以后在释放}
我相信大部分初学者在看到这道题的时候就晕了,我也是在看到这道题后对着一头雾水,后来我拿到电脑上实验
在想了想,终于有一点思路了.
下面是我对这道题目的理解:
这是测试结果,我用的是g++编译器
这一道看似简单的题目涉及好多的知识点,下面是我画的一张该程序的对象创建析构顺序图
1. CConAndDecon *p=new CConAndDecon(10);
在堆上创建一个新的CConAndDecon对象 调用的是一个参数的构造函数
输出 Object 10 constructor
2. static CConAndDecon c1(20);
调用CConAndDecon 类的一个参数的构造函数 构造出一个新的对象c1 .
输出 Object 20 copy constructor
注意这里的static关键字, static作用是保持变量内容的持久。存储在静态数据区的变量会在函数刚开始运行时就完成初始化,也是唯一的一次初始化。static 变量的生命周期是进程的从创建到进程结束.
3,4.Func(*p) 进入函数Func中 这里在传参的时候会调用拷贝构造创建一个新的CConAndDecon对象(形参)
输出 Object 9 copy constructor
5. CConAndDecon c1=x;构造一个新的静态的CConAndDecon对象 调用的是拷贝构造函数.
输出 Object 8 copy constructor
6.构造局部的 CConAndDecon 变量 c2 .
7.Func 函数结束 对象c2的生命周期结束调用c2的析构函数.
形参对象的生命周期结束调用该形参对象的析构函数.
这里相同代码块(即{}之间)的非静态对象的析构顺序和构造顺序相反:先构造的后析构.
8. delete p; 用delete关键字 销毁p指针所指向的对象.
9. return 0; 进程结束静态变量的生命周期结束, 释放静态的变量(释放顺序和构造顺序相反).
- 构造函数和析构函数的探究---1道c++考试题
- C/C++——构造函数、复制构造函数和析构函数的执行时刻
- 构造函数和析构函数【c++】
- [c++]构造函数和析构函数
- 【C#】构造函数和析构函数
- 【C++】构造函数和析构函数
- 【C++】构造函数和析构函数
- C++:构造函数和析构函数
- cppTest-8.2:虚析构函数探究&父类和子类的构造函数与析构函数的调用顺序
- [c++]派生类的构造函数和析构函数
- C++:类的构造函数和析构函数
- c++---派生类的构造函数和析构函数
- 【C++】探究类派生时构造函数的顺序
- <C++>析构函数、虚析构函数和构造函数
- 【C/C++】实现一个string类的构造函数、析构函数和赋值函数
- 【C/C++】构造函数和析构函数
- C/C++——构造函数和析构函数
- string类的构造函数,析构函数,拷贝构造函数和赋值构造函数
- 设计模式概念
- 你真的会使用logcat吗
- 简单的字符串匹配算法
- 两个boost::function判等问题
- 使用openURL打开另外一个应用程序
- 构造函数和析构函数的探究---1道c++考试题
- invlpg 指令简介
- 【LeetCode】LRU Cache
- IntelliJ IDEA 13试用手记(附详细截图)
- Lua中实现类的原理 值得一看
- Cocos2D-HTML5开源2D游戏引擎www.maiziedu.com
- UML的九种图
- 单例模式分析
- Configure First SpringMVC project in IntelliJ IDEA(fail)