操作符重载错误总结

本文探讨了C++中类类型转换和指针操作时遇到的两个常见错误。错误一涉及在构造函数中使用普通类型而非引用类型导致的内存释放问题,错误二是在寻找最佳匹配时,直接解引用指针修改其内容而引发的问题。解决方案分别是在构造函数参数中使用引用,以及在更新最佳匹配时直接通过指针重新赋值。
摘要由CSDN通过智能技术生成

在学习类类型转换为类类型的时候,发现一个错误,在老师的讲解下理解了原因

错误1:将boy赋值给man时,man中的构造函数中的参数用的普通类型(Boy boy) 没有使用引用类型,在释放boy中name的内存地址时报错

代码:

#pragma once
#include <iostream>

using namespace std;

class Boy;

class Man
{
public:
	Man(Boy boy);	//没有使用引用类型
	~Man();

	friend ostream &operator<<(ostream &os, const Man &man);

private:
	char *name;
	int age;
	int salary;
};

main中的代码:Man man(boy)

此时相当于是赋值操作,将实参boy赋给构造函数中的形参boy,但boy中的name是指针类型。我们也没有自定义拷贝构造函数,因此在赋值的过程中,调用了默认的拷贝构造函数,属于浅拷贝,会将boy中name的地址也拷贝到形参boy中,但形参的生命周期在执行完man的构造函数后就结束了,我们在析构函数中进行内存释放,然而形参指向的内容和实参相同,所以实参的内容也被释放,导致了报错

更改方法,使用引用:Man(Boy &boy);

错误2:寻找最佳伴侣的一个方法中,伴侣为一个指针,初值为空指针,当为空的时候会将遍历到的第一个值赋值给伴侣指针。不为空的时候进行一个比较,将更好的那个赋给伴侣指针
刚开始的做法是将指针解引,把比较后更好的赋值给解引的指针,由于指针已经有一个初值,直接解引后赋值会把指针指向的初始内容更改了,导致错误

void DataBase::bestAutoMatch()
{
	cout << "匹配最佳伴侣" << endl;
	string line = string(100, '-');
	Boy *bestBoy = NULL;
	Girl *bestGirl = NULL;

	cout << line << endl;
	for (int i = 0; i < boys.size(); i++) {
		for (int j = 0; j < girls.size(); j++) {
			if (boys[i].satisfied(girls[j]) && girls[j].satisfied(boys[i])) {
				if (!bestGirl) {		//如果bestgirl为空,赋值第一个满足的女生为最佳伴侣
					bestGirl = &girls[j];
				}else if(girls[j] > * bestGirl){
					*bestGirl = girls[j];	//直接更改了bestGirl指向的内容
				}

			}
		}
		if (bestGirl) {		//判断是否有最佳的伴侣
			cout << boys[i] << endl;
			cout << *bestGirl << endl;
			cout << line << endl;
		}
	}

	

	for (int i = 0; i < girls.size(); i++) {
		for (int j = 0; j < boys.size(); j++) {
			if (girls[i].satisfied(boys[j]) && boys[j].satisfied(girls[i])) {
				if (!bestBoy) {		//如果bestBoy为空,赋值第一个满足的男生为最佳伴侣
					bestBoy = &boys[j];
				}
				else if (boys[j] > * bestBoy) {
					*bestBoy = boys[j];
				}
			}
		}
		if (bestBoy) {
			cout << girls[i] << endl;
			cout << *bestBoy << endl;
			cout << line << endl;
		}
	}
}

解决方法,比较后更好的直接指针指向新的(这个更好的)地址:bestGirl = &girls[j];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值