C++类学习笔记(5)

什么是运算符重载


运算符重载(Operator overload)是对已有的运算符赋予多重含义,使同一个运算符作 用于不同类型的数据时做出不同的行为。

例如:学生类包括姓名,年龄,班级,成绩等,定义了两个学生变量,想比较它们的大 小,如何比较大小呢?

为“学生”类重载“>”符号,然后在这个方法里实现比较的意义:按年龄、按成绩或 按姓名首字母比较等。

运算符重载的意义

运算符重载的本质是函数重载,是实现多态的重要手段,为用户提供了一个直观的接口。 调用运算符操作自定义数据类型其实就是调用运算符函数。运算符重载使用同样的运算 符,可以操作不同的数据,增强了C++的可扩充性,使代码更加直观、易读,便于对对 象进行各种运算操作。

运算符重载的语法格式

重载的运算符是具有特殊名字的函数:它们的名字由关键字operator,后跟要重载的运 算符。

返回类型 operator 运算符(参数列表)

{

    函数体;

}

说明:运算符是要重载的运算符名(如+、-、*、/等),但必须是C++允许重载的运算 符 

简单例子

“+”运算符的重载

#include <iostream>
using namespace std;
 
class A
{
private:
	int x, y;
public:
	A(int x1 = 0, int y1 = 0)
	{
		x = x1;
		y = y1;
	}
	A operator+(const A& a)const//重载-运算符的实现
	{
		return A(x + a.x, y + a.y);//调用A类构造函数创建一个临时匿名对象作为函数返								回
	}
	void show()
	{
		cout << "x=" << x << "," << "y=" << y << endl;
	}
};
int main()
{
	A a1(1, 2);
	A a2(3, 4);
	A a;
	a = a1 + a2;
	a.show();
}

“+”运算符的重载

x=4,y=6 

const一般用在代码前面表示常量,只可读不可改,这里用在函数中表示常成员函数: 只读函数,只可读不可改数据成员的值。也就是时候const定义的函数里面的数据成员 的值不可改变

代码分析
在A类中重载了运算符+,该重载只对A类对象有效。

执行a=a1+a2;语句时,编译器检测到+号左边是一个A类对象(+号具有左结合性,所以 先检测左边),就会调用成员函数operator+(),也就是转换为下面的形式:

a=a1.operator+(a2);    //a1是要调用函数的对象,a2是函数的实参

可见:

重载运算符并没有改变其原来的功能,只是增加了对自定义数据类型的运算功能。

C++ 类中的 this 指针用法 

 

在 C++ 类中 , this 指针 是一个特殊的指针 , 由系统自动生成 , 不需要手动声明定义 , 在类中的每个 非静态成员函数 中 , 都可以调用 this 指针 ;

this 指针 是指向 调用对象 自身 的指针 , 也就是调用 该成员函数 的 实例对象 的 内存地址 ;

由于 this 指针只能在 非静态成员函数内部使用 , 因此 this 指针是类内部使用的指针 , 使用 this 可以访问 实例对象 中 的所有 公有 public / 保护 protected / 私有 private 成员 ;

                        

在 C++ 类中 , 定义了 成员变量 age 和 height , 在 构造函数 中进行初始化 , 可以使用 this-> age 访问 age 成员变量 , 使用 this->height 访问 height 成员变量 ;

在下面的代码中 , 参数名称也是 age 和 height , 与 成员变量名称重名了 , 使用 this 指针可以有效区分 函数参数 与 成员变量 重名的问题 ;

使用 代码 this->age = age; 为 age 变量赋值 , this->age 是成员变量 , age 是函数的参数 ;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		this->age = age;
		this->height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	void print() {
		// this 指针隐式传递
		std::cout << "age: " << age << std::endl;
		// 通过指针 访问成员变量
		std::cout << "this->age: " << this->age << std::endl;
		// 先获取指针指向的数据 然后访问数据中的成员变量
		std::cout << "(*this).age: " << (*this).age << std::endl;
	}

public:
	int age;		// 年龄
	int height;		// 身高
};

#include "iostream"
using namespace std;

class Student
{
public:
	// 带参构造函数
	Student(int age, int height)
	{
		this->age = age;
		this->height = height;
		cout << "执行 Student 的构造函数" << endl;
	}

	~Student()
	{
		cout << "执行 Student 的析构函数" << endl;
	}

	void print() {
		// this 指针隐式传递
		std::cout << "age: " << age << std::endl;
		// 通过指针 访问成员变量
		std::cout << "this->age: " << this->age << std::endl;
		// 先获取指针指向的数据 然后访问数据中的成员变量
		std::cout << "(*this).age: " << (*this).age << std::endl;
	}

public:
	int age;		// 年龄
	int height;		// 身高
};

int main() {
	
	// 调用有参构造函数 创建 Student 实例对象
	Student s(18, 180);

	cout<< "s.age" << s.age << " , s.height" << s.height << endl;

	s.print();
	

    // 控制台暂停 , 按任意键继续向后执行
    system("pause");

    return 0;
}

 

详解this 

1.引入

#include<iostream>
using namespace std;
class Data
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print()
	{
		cout << _year << ":" << _month << ":" << _day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
//创建Data的对象1
	Data d1;
	d1.Init(1999, 1, 1);
//创建Data的对象2
	Data d2;
	d2.Init(2023, 1, 1);
//调用print函数
	d1.print();
	d2.print();
	return 0;
}

 

2.分析

上面代码运行结果中,为什么两个对象调用同一个函数能打印出不同的日期呢?或者说同一个函数如何做到结果不同呢?
简单说是通过C++的一个关键字this来实现的。
上面代码着编译后,就成了如下:

#include<iostream>
using namespace std;
class Data
{
public:
	void Init(int year,int month,int day)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void print(Data* this)
	{
		cout << this->_year << ":" << this->_month << ":" << this->_day << endl;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
//创建Data的对象1
	Data d1;
	d1.Init(1999, 1, 1);
//创建Data的对象2
	Data d2;
	d2.Init(2023, 1, 1);
//调用print函数
	d1.print(&d1);
	d2.print(&d2);
	return 0;
}

 当不同对象调用print函数时,其实在底层是传了一个Data*类型的指针this。、

void print(Data* this)
	{
		cout << this->_year << ":" << this->_month << ":" << this->_day << endl;
	}

 > 如下图所示:
其实底层还是和C语言函数调用一样,也需要传参,只不过C++的编译器为我们默默做了这些事情,让我们用起来更方便。但是,不能显示的去写出this的相关实参和形参,需要注意的是在类中可以使用this->。

this本质是一个形参,哪个对象调用他,就指向哪个对象。 

 

 

参考链接:https://blog.csdn.net/shulianghan/article/details/133252002                    
参考链接:https://blog.csdn.net/qq_52905520/article/details/127178512

  • 33
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值