<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");
}
c++学习笔记(二):c++拷贝构造函数应用的四种场景
最新推荐文章于 2024-07-30 15:26:06 发布