c++学习笔记(二):c++拷贝构造函数应用的四种场景

<pre name="code" class="cpp">#include <iostream>
using namespace std;
//拷贝构造函数的第一、二应用场景
class AA
{
public:
	AA() //无参构造函数 默认构造函数
	{	
		cout<<"我是构造函数,自动被调用了"<<endl;
	}
	AA(int _a) //无参构造函数 默认构造函数
	{	
		a = _a;
	}
// 	AA(const AA &obj2)
// 	{
// 		cout<<"我也是构造函数,我是通过另外一个对象obj2,来初始化我自己"<<endl;
// 		a = obj2.a + 10;
// 	}
	~AA()
	{
		cout<<"我是析构函数,自动被调用了"<<endl;
	}
	void getA()
	{
		printf("a:%d \n", a);
	}
protected:
private:
	int a;
};

//第一种应用场景
void ObjPlay01()
{
	AA a1; //变量定义
	
	//赋值构造函数的第一个应用场景
	//我用对象1 初始化 对象2 
	AA a2 = a1; //定义变量并初始化 调用自己写的拷贝构造函数

	a2 = a1; //用a1来=号给a2 调用编译器给我们提供的浅copy
}

//第二种应用场景
void ObjPlay02()
{
	AA a1(10); //变量定义

	//赋值构造函数的第一个应用场景
	//我用对象1 初始化 对象2 
	AA a2(a1); //定义变量并初始化 调用自己写的拷贝构造函数

	/
	a2.getA();
}

void main()
{
	ObjPlay01();
	ObjPlay02();
	system("pause");
}

//拷贝构造函数的第三、四应用场景


lass Location 
{ 
public:
	Location( int xx = 0 , int yy = 0 ) 
	{ 
		X = xx ;  
		Y = yy ;  
		cout << "Constructor Object.\n" ; 
	}
	Location( const Location & p ) 	    //复制构造函数
	{ 
		X = p.X ; 
		Y = p.Y ;   
		cout << "Copy_constructor called." << endl ;  
	}
	~Location() 
	{ 
		cout << X << "," << Y << " Object destroyed." << endl ; 
	}
	
	int  GetX ()
	 { 
	 	return X ;
	 	
	 	 }		
	int GetY () 
	{ 
		return Y ; 
		}
private :   int  X , Y ;
} ;


void f ( Location  p )   
{ 
	cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ; 
}
/*
 * 拷贝构造函数的第三中应用场景  :
 *类对象作为形参时:当实参向形参传递数据是 进行了实参向形参的数据的拷贝 调用了自己写的赋值构造函数
*/
void objplay1()
{
	Location A(1, 2);
	f(A);
	}
Location g()
{
	Location A(1, 2);
	return A;
}
/*
 * 拷贝构造函数的第四中应用场景  :
 *类对象作为返回值时:当定义并初始化A对象之后要进行返回时,由于A对象是局部对象 再其析构之前C++编译器创建了一个匿名对象用于接收A对象的数据
 *此时调用了自己写的拷贝构造函数,执行此语句时 B = g() 由于B对象已经存在且是等号运算符,因此匿名对象将数据赋值给B对象,但此时调用的是编译器
 *给我们提供的浅copy,执行完之后匿名对象析构。
*/
void objplay2()
{  
	Location B;
	B = g();//等号操作,这两句调用了三次构造函数,调用了3此析构函数。
    //注释中的方法调高了效率 ,只调用了2此构造函数,2次析构函数。
	//Location B = g(); //对象初始化操作,既没有重新构造B 也没有调用拷贝构造函数 而是直接把匿名对象直接转化成B
											//如果返回的匿名对象,来初始化另外一个同类型的对象,那么匿名对象会直接转换成新的对象。 
} 

void main()
{  
	objplay1();
	objplay2();
	system("pause");
} 



                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值