C++学习笔记(十三)-- 析构函数

学习要点:

1 析构函数写法

2 拷贝构造函数写法 ,参数必须是引用 不然报错

3  函数形参,返回值临时变量 都会进行构造和析构



// 构造 析构 重载2

#include <iostream>
#include  <cstdlib>
using namespace std;
class F
{
	int n,d;
public:
	F(int n=0,int d=1); //默认构造函数
	~F();
	F(F &); //拷贝构造函数  参数必须是引用
	// F(F); 04constructor.cpp:7: error: candidates are: F::F(const F&)
	
	void input();
};

// 构造函数 参数列表  注意是单冒号
F::F(int n,int d):n(n),d(d) //变量成员名(初始值)
{
	cout << this <<",F()" << n <<'/' << d <<endl;
}

F::F(F& x):n(x.n),d(x.d)
{
	cout << "F(F&)"  << this  <<endl;
}

F::~F()
{
	cout << this << ",~F()" << n << '/' <<d <<endl;
}

F fun(F x)
{
	return x;
}
int main()
{
	F a(10,5);
	cout << "=========" << endl;
	fun(a);
	cout <<"==========" << endl;
	
/* 为何这中间会执行2次析构?
	 =========
	0xbfecbdd8,~F()10/5
	0xbfecbde0,~F()10/5
	==========
	
	因为fun(F x)中到形参x拷贝构造一次 
	然后fun(F x)的返回值再次拷贝构造一次
	接着出了fun x开始析构
	接着返回值这个临时变量也开始析构

	F(F&)0xbfe775d0
	F(F&)0xbfe775c8
	0xbfe775c8,~F()10/5
	0xbfe775d0,~F()10/5

*/

	
}	


你可能感兴趣的:(C++学习笔记(十三)-- 析构函数)