当前位置:网站首页>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 okTurn 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 okTurn 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 .
边栏推荐
- 串口通讯继电器-modbus通信上位机调试软件工具项目开发案例
- 【HigherHRNet】 HigherHRNet 详解之 HigherHRNet的热图回归代码
- The new activity of "the arrival of twelve constellations and goddesses" was launched
- Bit operation ==c language 2
- Why does the starting service report an error when installing MySQL? (operating system Windows)
- STM32基础知识—内存映射
- High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
- Leetcode exercise - 113 Path sum II
- 2022.7.5DAY597
- Web3.0 series distributed storage IPFs
猜你喜欢

Postman interface test IV

Arcgis操作: 批量修改属性表

ORM model -- associated fields, abstract model classes

Vs code specifies the extension installation location
![[second on] [jeecgboot] modify paging parameters](/img/59/55313e3e0cf6a1f7f6b03665e77789.png)
[second on] [jeecgboot] modify paging parameters

一文讲解单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系

基于gis三维可视化技术的智慧城市建设

JMeter about setting thread group and time

Methods of adding centerlines and centerlines in SolidWorks drawings

How to cancel automatic saving of changes in sqlyog database
随机推荐
ES类和对象、原型
Learning records - high precision addition and multiplication
Appx code signing Guide
Easyexcel read write simple to use
关于hzero-resource报错(groovy.lang.MissingPropertyException: No such property: weight for class)
High number_ Chapter 1 space analytic geometry and vector algebra_ Quantity product of vectors
Smart city construction based on GIS 3D visualization technology
[higherhrnet] higherhrnet detailed heat map regression code of higherhrnet
The new activity of "the arrival of twelve constellations and goddesses" was launched
Mongodb creates an implicit database as an exercise
China's first electronic audio category "Yamano electronic audio" digital collection is on sale!
Apprentissage avancé des fonctions en es6
2022.7.3DAY595
Using keras in tensorflow to build convolutional neural network
STM32 ADC和DMA
Why does the starting service report an error when installing MySQL? (operating system Windows)
Programming features of ISP, IAP, ICP, JTAG and SWD
Factorial implementation of large integer classes
Leetcode exercise - 113 Path sum II
Memory ==c language 1