暑期C++之 copy构造函数调用时机

来源:互联网 发布:淘宝排除王 编辑:程序博客网 时间:2024/05/17 08:06

拷贝构造函数在构造函数中是一个很重要的部分,很多初学者对于拷贝构造函数的调用时机不太清楚。

今天就把代码贴上来,让大家了解拷贝构造函数调用场景

场景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;}



场景2

#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;}