C++ 算术运算符重载与指针的“腥风血雨”

温馨提示:想要看懂本篇博文,需要懂得算术运算符重载赋值运算符重载和类的静态变量用法。


本片博文可以说是一篇笔记,也可以说是一道题目。

题目:
如何利用加号运算符重载给带有指针的对象相加,且指针内容不变。
例如:

class A {
public:
// to do...
private:
	char *name;
	int age;	
};

int main(void) {
	A("张三", 10);
	B("李四", 20);
	C("王五", 0);
// 需要实现,姓名不变,年龄为A.age + B.age  
	C = A + B;

// 结果打印出来。。。
}

本题中需要得到的结果是:
王五的年龄为30

那么要怎样实现本题呢?


需求:

  1. 定义一个类,含有私有成员char *name; int age;
  2. 根据类,定义出三个对象;
  3. 将对象一和对象二的age相加赋值给对象三的age,name保持不变;
  4. 输出结果。

根据需求,我们可以知道:

  1. 对象与对象的相加,需要用到加号运算符重载;
  2. 将相加好的对象赋值给另一个对象,需要用到赋值运算符重载(name不变);
  3. 实现加号运算符需要用到static静态变量。

思路清晰之后,我们开始写代码:

#include <iostream>
#include <Windows.h>
#include <string.h>

using namespace std;

class Father {
public:
	Father(char *name=NULL, int age=0);
	~Father();

	Father& operator+(const Father &father);	// 加号运算符重载
	Father& operator=(const Father &father);	// 赋值运算符重载

	char *getName() const;
	int getAge() const;

private:
	char *name;
	int age;
};

Father::Father(char *name, int age) {
	if (!name) {
		name = "无名";
	}

	this->name = new char[strlen(name) + 1];
	strcpy_s(this->name, strlen(name) + 1, name);

	this->age = age;
}

Father::~Father() {
	if (name) {
		delete name;
	} 
	name = NULL;
	age = 0;
}

// 加号运算符重载
Father& Father::operator+(const Father &father) {
	static Father f;

	f.age = this->age + father.age;
	
	return f;
}

// 赋值运算符重载
Father &Father::operator=(const Father &father) {
	// 不需要把name也赋值过来,否则会覆盖掉原来的name内存
	/*if (name) {
		delete name;
	}

	this->name = new char[strlen(father.name) + 1];
	strcpy_s(this->name, strlen(father.name) + 1, father.name);*/


	this->age = father.age;

	return *this;
}

char *Father::getName() const {
	return name;
}

int Father::getAge() const {
	return age;
}

int main(void) {

	Father f1("张三", 30);
	Father f2("李四", 40);
	Father f3("王五", 50);


	cout << f3.getName() << "的年龄为:" << f3.getAge() << endl;

	/*
		运算过程:
		1.调用 +号 运算符重载,计算出age,赋值给static静态变量的age并返回
		2.再调用赋值运算符将static静态变量的age赋值给f的age,name不变,得出结果
	 */
	f3 = f1 + f2;

	cout << "运算后:" << endl;
	cout << f3.getName() << "的年龄为:" << f3.getAge() << endl;

	system("pause");
	return 0;

}
  1. 加号运算符中,应为定义的是static静态变量,函数结束时,静态变量并不会调用析构函数释放掉内存。
  2. 返回的静态变量再赋值给f3,自动调用赋值构造函数,赋值构造函数里面,并不需要把name也赋值过去,如果赋值过去,就会把f3的name覆盖掉,所以只是需要把age赋值就好。
  3. 运算过程:
    1. 调用 +号 运算符重载,计算出age,赋值给static静态变量f的age并返回;
    2. 再调用赋值运算符将static静态变量f的age赋值给f3的age,name不变,得出结果。

运行截图:

在这里插入图片描述


总结:

  1. 本人在学习时偶然遇到这样的问题,但是就是不知道要使用静态变量static来解决问题,所以遇上了很多BUG,好在最后请教了网上的老师,最终解决了。
  2. 现在把他分享出来,希望大家看到后,懂得有这个用法,以后就不会再遇到像我这样的BUG了。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cpp_learners

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值