拷贝构造函数在构造函数中是一个很重要的部分,很多初学者对于拷贝构造函数的调用时机不太清楚。
今天就把代码贴上来,让大家了解拷贝构造函数调用场景
场景1
#pragma once
#include<iostream>
using namespace std;
class Location1
{
private:
int x, y;
public:
Location1(int x = 0, int y = 0)
{
this->x = x;
this->y = y;
cout << "构造函数被调用" << endl;
}
Location1(const Location1 &obj)
{
cout << "copy" << endl;
x = obj.x;
y = obj.y;
}
~Location1()
{
cout << x << "x" << y << "y" << endl;
}
int getx() { return x; } int gety() { return y; }
};
void f1(Location1 p)
{
cout << p.getx() << "x" << p.gety() << "y" << endl;
}
void playobj1()
{
Location1 a(1, 2);
Location1 b = a;
f1(b); //b实参会初始化形参p 会调用copy构造函数
}
int main04()
{
playobj1();
return 0;
}
#pragma once
#include<iostream>
using namespace std;
class Location
{
private:
int x, y;
public:
Location(int x, int y )
{
this->x = x;
this->y = y;
cout << "构造函数被调用" << endl;
}
Location(int y )
{
this->x = 100;
this->y = y;
cout << "一个参数函数被调用" << endl;
}
Location(const Location &obj)
{
cout << "copy" << endl;
x = obj.x;
y = obj.y;
}
~Location()
{
cout << x << "x" << y << "y" << endl;
}
int getx() { return x; } int gety() { return y; }
};
//结论:函数返回值是一个元素 返回的是一个新的元素,所以会调用匿名对象类的拷贝构造函数
//匿名对象的 去和留
//如果用匿名对象 初始化另外一个同类型对象 匿名对象转变有名对象
//如果用匿名对象 赋值给另一个同类型对象 匿名对象立马析构
Location g()
{
Location a(1, 2);
return a; //返回一个元素 所以这里会调用拷贝构造函数
//用a对象创建一个匿名对象,然后把原来的对象给析构
}
//
void playobj()
{
g();
}
void playobj2()
{
//用匿名对象初始化M 此时匿名对象就变成m 从无名变成有名
//提前牺牲内存 来提高运行速度
Location m = g();
cout << m.getx() << endl;
}
void playobj3()
{
Location m2(8);
m2 = g(); //用匿名对象给其他对象 赋值 所以匿名对象被析构
cout << m2.getx();
}
int main()
{
//playobj();
//playobj2();
playobj3();
return 0;
}