copy构造函数调用时机4,函数返回值是匿名对象

传智扫地僧课程学习笔记。

 

#include <iostream>
using namespace std;


class Location 
{ 
public:
	Location( int xx = 0 , int yy = 0 ) 
	{ 
		X = xx ;  Y = yy ;  cout << "Constructor Object.\n" ; 
	}

	//copy构造函数  完成对象的初始化
	Location(const Location & obj) //copy构造函数 
	{
		X = obj.X; Y = obj.Y;
	}
	~Location() 
	{ 
		cout << X << "," << Y << " Object destroyed." << endl ; 
	}
	int  GetX () { return X ; }		int GetY () { return Y ; }
private :   int  X , Y ;
} ;

//g函数 返回一个元素 
//结论1 : 函数的返回值是一个元素 (复杂类型的), 返回的是一个新的匿名对象(所以会调用匿名对象类的copy构造函数)

//
//结论2: 有关 匿名对象的去和留
//如果用匿名对象  初始化 另外一个同类型的对象, 匿名对象 转成有名对象
//如果用匿名对象  赋值给 另外一个同类型的对象, 匿名对象 被析构

//
//你这么写代码,设计编译器的大牛们:
//我就给你返回一个新对象(没有名字 匿名对象)
Location g()
{
	Location A(1, 2);
	return A;
}

//
void objplay2()
{
	g(); 
}

//
void objplay3()
{
	//用匿名对象初始化m 此时c++编译器 直接把匿名对转成m;(扶正) 从匿名转成有名字了m
	Location m = g(); 
	printf("匿名对象,被扶正,不会析构掉\n");
	cout<<m.GetX()<<endl;;
}

void objplay4()
{
	//用匿名对象 赋值给 m2后, 匿名对象被析构
	Location m2(1, 2);
	m2 = g();
	printf("因为用匿名对象=给m2, 匿名对象,被析构\n");
	cout<<m2.GetX()<<endl;;
}
void main()
{
	//objplay2();
	//objplay3();
	objplay4();
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}


Location b = g();
此时直接转正,


Location b;
b = g();
此时返回值赋值一份给b,g()本身返回的析构,

这种方式最好不用,要么就直接初始化,像上面那样,否则浪费一次拷贝构造和析构,

 

objplay2()中,
调用拷贝构造函数,产生匿名对象,
然后又没人接,
所以又析构掉,
所以会有2次析构,

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
复制构造函数Copy Constructor)是一种特殊的构造函数,用于在创建新对象时,以已有对象的值来初始化新对象。简单来说,它用于实现对象的复制。在C++中,复制构造函数函数名必须与类名相同,而且没有返回值。 复制构造函数在以下情况下被自动调用: 1. 使用一个类对象去初始化同类的另一个对象时,调用复制构造函数。如: ```c++ MyClass obj1; MyClass obj2 = obj1; //使用obj1初始化obj2,调用复制构造函数 MyClass obj3(obj1); //使用obj1初始化obj3,调用复制构造函数 ``` 2. 将类对象作为函数参数传递的时候,调用复制构造函数。如: ```c++ void func(MyClass obj); //函数参数为MyClass类型,调用复制构造函数 MyClass obj1; func(obj1); //调用func函数调用复制构造函数 ``` 3. 当函数返回一个类对象时,调用复制构造函数。如: ```c++ MyClass func() { MyClass obj; return obj; //返回一个MyClass对象,调用复制构造函数 } MyClass obj1 = func(); //调用func函数调用复制构造函数 ``` 需要注意的是,在以上情况中,如果没有定义复制构造函数,编译器自动生成一个默认的复制构造函数,但是它只简单地将原对象的成员变量值复制到新对象中,无法正确地处理动态分配内存等情况,容易导致内存泄漏等问题。因此,在类中存在动态分配内存等情况时,必须手动实现复制构造函数,以确保对象复制的正确性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值