【C++第二阶段】赋值运算符重载

你好你好!

以下内容仅为当前认识,可能有不足之处,欢迎讨论!


文章目录


赋值运算符重载

实验①,还没有对析构运算符重载时

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

class Person {
	friend void test_0210_0();
public:
	Person();
	Person(int age);
private:
	int *person_age;
};

Person::Person(int age) {
	person_age = new int(age);//构造函数,使得传入的参数能够作为类的成员属性传进去
}

void test_0210_0() {
	Person pe(18);
	Person rs(20);
	cout << "没有重载赋值运算符之前,实验部分.........." << endl;
	cout << "pe age = " << *pe.person_age << "." << endl;
	cout << "rs age = " << *rs.person_age << "." << endl;
	cout << "---------------------------------" << endl;
	pe = rs;
	cout << "pe age = " << *pe.person_age << "." << endl;
	cout << "rs age = " << *rs.person_age << "." << endl;
	cout << endl;
}

int main() {
	cout << "hello world !" << endl;
	test_0210_0();
    system("pause");
    return 0;
}

结果:

重载析构函数后,没有重载赋值运算符,会出现释放内存后,另一个对象的指针指向这个不存在的地址的问题。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

class Person {
	friend void test_0210_0();
	friend void test_0210_1();
	friend void test_0210_2();
	friend void test_0210_3();
public:
	Person();
	~Person();
	Person(int age);
private:
	int *person_age;
};

Person::Person(int age) {
	person_age = new int(age);//构造函数,使得传入的参数能够作为类的成员属性传进去
}

Person::~Person() {
	//重载析构函数,确定有这个问题:浅拷贝如果在这里人为释放地址,会使得后面的新对象发生错误
	if (person_age != NULL) {
		cout << "person_age指针有地址,删除中.........." << endl;
		delete person_age;
		person_age = NULL;
		cout << "删除成功!" << endl;
	}
}


void test_0210_0() {
	Person pe(18);
	Person rs(20);
	cout << "没有重载赋值运算符之前,实验部分.........." << endl;
	cout << "pe age = " << *pe.person_age << "." << endl;
	cout << "rs age = " << *rs.person_age << "." << endl;
	cout << "---------------------------------" << endl;
	pe = rs;
	cout << "pe age = " << *pe.person_age << "." << endl;
	cout << "rs age = " << *rs.person_age << "." << endl;
	cout << endl;
}

int main() {
	cout << "hello world !" << endl;
	test_0210_0();
    system("pause");
    return 0;
}

结果:

运行到这一步就停住...

对同一块地址重复释放了。

所以,需要重写赋值运算符内容。

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

class Person {
	friend void test_0210_0();
	friend void test_0210_1();
public:
	Person();
	~Person();
	Person(int age,string name);
	//返回值写什么?写类
	Person& operator=(Person &person); 
private:
	int *person_age;
	string person_name;
};

Person::Person(int age , string name) {
	person_age = new int(age);//构造函数,使得传入的参数能够作为类的成员属性传进去
	string person_name = name;
}

Person::~Person() {
	//重载析构函数,确定有这个问题:浅拷贝如果在这里人为释放地址,会使得后面的新对象发生错误
	if (person_age != NULL) {
		cout << "person_age指针有内容,释放中.........." << endl;
		delete person_age;
		person_age = NULL;
		cout << "删除成功!" << endl;
	}
	else {
		
	}
}

Person& Person::operator=(Person& temp) {//参数这里应该用引用,因为不需要重复赋值
	//这里的参数是后面的rs
	//if (person_age != NULL) {//应该先判断属性中的person_age 是否有地址,如果没有,先删除了再说

	if (this != NULL) {
		delete person_age;

		person_age = new int(*temp.person_age);//整型指针指向新的内存空间开辟的相同值
	}
	return *this;//这里返回的是具体的对象,如果函数定义是person,相当于新的值,而不是本身。
}

void test_0210_0() {
	string name_pe = "pe";
	string name_rs = "rs";
	Person pe(18 , name_pe);
	Person rs(20 , name_rs);
	cout << "没有重载赋值运算符之前,实验部分.........." << endl;
	cout << "pe age = " << *pe.person_age << "." << endl;
	cout << "rs age = " << *rs.person_age << "." << endl;
	cout << "---------------------------------" << endl;
	pe = rs;
	//rs = pe;
	cout << "重载赋值运算符之后,实验部分..........." << endl;
	cout << "pe age = " << *pe.person_age << "." << endl;
	cout << "rs age = " << *rs.person_age << "." << endl;
	cout << endl;
}

int main() {
	cout << "hello world !" << endl;
	test_0210_0();
	system("pause");
    return 0;
}

同时,写了返回值后,能够链式调用赋值运算符。

遗留有一个问题:为什么这里

cpp 复制代码
Person& Person::operator=(Person& temp) {//参数这里应该用引用,因为不需要重复赋值
	//这里的参数是后面的rs
	//if (person_age != NULL) {//应该先判断属性中的person_age 是否有地址,如果没有,先删除了再说

	if (this != NULL) {
		delete person_age;

		person_age = new int(*temp.person_age);//整型指针指向新的内存空间开辟的相同值
	}
	return *this;//这里返回的是具体的对象,如果函数定义是person,相当于新的值,而不是本身。
}

返回值为Person,没有报错(因为引用和Person类一样),但是使用完后调用这个赋值运算符的对象会调用析构函数呢?


以上是我的学习笔记,希望对你有所帮助!

如有不当之处欢迎指出!谢谢!

相关推荐
梓䈑2 小时前
【算法题攻略】BFS 解决FloodFill 算法、最短路问题、多源BFS 和 拓扑排序
c++·算法·宽度优先
程序喵大人7 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng7 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena157795857928 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
wdfk_prog8 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕8 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫8 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通9 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦10 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派10 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug