当前位置:网站首页>When there are pointer variable members in the custom type, the return value and parameters of the assignment operator overload must be reference types
When there are pointer variable members in the custom type, the return value and parameters of the assignment operator overload must be reference types
2022-07-07 10:21:00 【qq_ forty-two million one hundred and twenty thousand eight hun】
Problem description : For custom types that contain Pointer type member variable When , Assignment operator overload Time function Return value and Parameters Why does the type have to be Reference type ?
#include<iostream>
using namespace std;
// Assignment operator overload
class Person
{
public:
Person(int age)
{
m_Age = new int(age);
}
Person & operator=(Person & p) //14 That's ok
{
// If there is unreleased heap space , Release first
if (m_Age != NULL)
{
delete m_Age;//pos1
m_Age = NULL;
}
m_Age = new int(*p.m_Age);// notes : Here, the newly allocated memory space address may be the same as the above pos1 The address of the memory space released at is the same ( The reason for the compiler )
return *this;
}
~Person()//28 That's ok
{
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
}
int* m_Age;
};
void test01()
{
Person p1(18);
Person p2(20);
Person p3(30);
p3 = p2 = p1; //46 That's ok
cout << "p1 The age is :" << *p1.m_Age << endl;
cout << "p2 The age is :" << *p2.m_Age << endl;
cout << "p3 The age is :" << *p3.m_Age << endl;
}
int main(void)
{
test01();
system("pause");
return 0;
}
case 1:
The return value must be of reference type The reason of : The assignment operator is overloaded in , If the return value is a value type, that is
14 That's ok
Turn into
Person operator=(Person & p)
That is, the return value is of value type , Then the return value type after the function call , For the call stack of external functions, it is a Temporary objects .
and The temporary object is a right value ( It doesn't exist in the stack memory , The life cycle ends after a complete expression , namely p3 = p2 = p1; End after statement execution ), Objects that do not exist in stack memory cannot be referenced with ordinary lvalues ( such as Person & ) To quote , therefore 46 That's ok
Of p2 = p1 The result is a Temporary objects , That is, a Right value ,p3=(p2 = p1)
Call to p3.operator(p2=p1 Returned object )
,Person & Is an lvalue reference , and p2 = p1 The return result is the right value ( The life cycle is short ), After statement end ,p3 Facing the danger of ineffectiveness , So the compiler is not allowed to pass .
contrary , if The return value is the reference type That is to say, what is returned is Person Object itself Not temporary objects , be p2 = p1
Back to a The left value ,p3 = (p2 = p1)
, Call to p3.operator(p2=p1 Returned object )
Is to give a Space that can exist for a long time in memory Alias to manipulate , So it can be compiled .
- case2: Parameter type must be reference type The reason of : The parameter type is the value type, that is
14 That's ok
Turn into
Person & operator=(Person p)
p3 = p2 = p1
Execute first p2 = p1
, That is equivalent to p2.operator=(p1)
, The object passed in is p1 A copy of , be aware One of the objects is Pointer variable member m_Age, When copying Directly copy its value , meanwhile , The parameter passed in is Local objects , It will be released after the function is executed , Then it will call 28 Line destructor
, Now p1 Of m_Age
Memory space will be released , Followed by execution p3 = (p2 = p1)
, That is to call p3.operator=(p2=p1 Returned object )
, Will be p2 Of m_Age
Memory space is released , But when 46 Yes p3 = p2 = p1
After execution , Then the corresponding destructor will be executed again , take p1 Of m_Age
To release , The memory space has been released at the end of the function call , As a result Secondary deconstruction ( Release memory space repeatedly ).
But the specific implementation process , It is suggested that you should clearly understand the cause of this exception through your own debugging .
边栏推荐
- 2022.7.4DAY596
- STM32 ADC和DMA
- 【剑指Offer】42. 栈的压入、弹出序列
- The new activity of "the arrival of twelve constellations and goddesses" was launched
- Smart city construction based on GIS 3D visualization technology
- Official media attention! The list of top 100 domestic digital collection platforms was released, and the industry accelerated the healthy development of compliance
- Parameter sniffing (1/2)
- A wave of open source notebooks is coming
- 嵌入式背景知识-芯片
- Video based full link Intelligent Cloud? This article explains in detail what Alibaba cloud video cloud "intelligent media production" is
猜你喜欢
Google colab loads Google drive (Google drive is used in Google colab)
High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
ORM--查询类型,关联查询
Arcgis操作: 批量修改属性表
The request object parses the request body and request header parameters
Encrypt and decrypt stored procedures (SQL 2008/sql 2012)
The Hal library is configured with a general timer Tim to trigger ADC sampling, and then DMA is moved to the memory space.
ORM模型--数据记录的创建操作,查询操作
[second on] [jeecgboot] modify paging parameters
China's first electronic audio category "Yamano electronic audio" digital collection is on sale!
随机推荐
High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
Methods of adding centerlines and centerlines in SolidWorks drawings
request对象对请求体,请求头参数的解析
Several schemes of building hardware communication technology of Internet of things
LLVM之父Chris Lattner:為什麼我們要重建AI基礎設施軟件
【acwing】786. Number k
Guid primary key
AHB bus in stm32_ Apb2 bus_ Apb1 bus what are these
ORM model -- associated fields, abstract model classes
Bit operation ==c language 2
Google Colab装载Google Drive(Google Colab中使用Google Drive)
XML配置文件解析与建模
[second on] [jeecgboot] modify paging parameters
Deconvolution popular detailed analysis and nn Convtranspose2d important parameter interpretation
STM32 product introduction
Programming features of ISP, IAP, ICP, JTAG and SWD
学习记录——高精度加法和乘法
mysql插入数据创建触发器填充uuid字段值
Arcgis操作: 批量修改属性表
Programming features of ISP, IAP, ICP, JTAG and SWD