C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现

本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 STL 库设计实现高阶数据结构,如 B树、B+树、红黑树等。

学习集:


本期内容:C++ 类的基本成员函数:赋值运算符重载【初步介绍运算符重载:后续有阶段小项目对应实现示例】


目录:
1. 运算符重载的认识
2. 运算符重载函数写法
3. 运算符重载函数的注意点
4. 运算符重载的探讨:类内与类外写法区别
- - 4.1 类内写法
- - 4.2 类外写法
5. 赋值运算符的重载(特殊点)【类的第五种基本成员函数】
6. 相关文章推荐


C++学习合集链接


1. 运算符重载的认识

C++为了 增强代码的可读性 引入了 运算符重载


运算符重载是具有特殊函数名的函数。其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。


2. 运算符重载函数写法

  • 函数名字为:关键字 operator 后面接需要重载的运算符符号。

  • 函数原型:返回值类型 operator 操作符 (参数列表)

【 代码示例说明如下 】

/* 相等运算符重载 */
bool operator == (对象1,对象2){}
		等号重载
		
/* 大于运算符重载 */
bool operator > (对象1,对象2){}
		大于重载
		
/* 流插入运算符重载 */
istream operator >> (对象1,对象2){}
	流插入运算符重载

3. 运算符重载函数的注意点
  1. 不能通过连接其他符号来创建新的操作符:比如operator@

  2. 重载操作符必须有一个类类型参数。

  3. 用于内置类型的运算符,其含义不能改变,例如:内置的整型+,本义:加和,不能改成其他:如做差。

  4. 作为类成员函数重载时,其形参看起来比操作数数目少 1,因为成员函数的第一个参数为隐藏的 this。(强调)【相关文章说明:类的this指针:C++ 学习 ::【基础篇:11】:C++ 类的基本使用与非静态 this 指针(两个面试考点):类的空指针问题(this指针可以为空吗?) | this指针存在哪里?

  5. .、.*、 ::、 sizeof、 ?: . 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。


4. 运算符重载的探讨:类内与类外写法区别

运算符的重载应该写全局还是局部?还是都可以?如果都可以,有什么区别?


答:两者都可以,但是有区别!区别应取决于重载对象,而且有的运算符推荐使用类内重载!


以 等号 重载为例:

  • 参数:全局写法:两个对象;局部写法:一个对象(因含有隐含参数 this 指针标识了一个对象);
  • 成员变量访问限制:全局写法:可能受限(取决于访问限制符);局部写法:不受限制;
代码示例
#include<iostream>
using std::endl;
using std::cout;

class Date {
public:
	Date(int year = 1970, int month = 1, int day = 1) {
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main() {


	return 0;
}
4.1 类内写法
  1. 只需一个参数(第二个参数);【隐含 this 指针:是第一个参数】
  2. 类内访问类成员属性/变量无约束!
/*
	局部写法:即写在类的内部,无成员变量的访问限制等问题;且参数列表写一个参数即可!
*/
bool operator == (const Date& d){
    return this->_year == d._year 
        && this->_month == d._month 
        && this->_day == d._day;
}
4.2 类外写法
  1. 需要两个参数,分别作为运算符的左右操作数;
  2. 由于可能受访问类成员属性/变量的限制,需要提供类外访问接口;【如下代码中的说明!】
bool operator == (const Date& d1, const Date& d2){
	return d1._year == d2._year 
        && d1._month == d2._month 
        && d1._day == d2._day;
}

/*
	注意:以上全局写法访问成员变量是会被限制的,而解决访问一般是在类中设计返回数据接口的方式实现问题的解决!(其他方式:私有成员公有化)
*/

/* 类中添加公有成员函数 */
int GetYear(){ return _year; }
int GetMonth(){ return _month; }
int GetDay(){ return _day; }

/* 全局写法修改 */
bool operator == (const Date& d1, const Date& d2){
	return d1.GetYear() == d2.GetYear() 
        && d1.GetMonth() == d2.GetMonth() 
        && d1.GetDay() == d2.GetDay();
}

5. 赋值运算符的重载(特殊点)【类的第五种基本成员函数】

点此跳转


5. 相关文章推荐

1. C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
2. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
3. C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
4. C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数
5. C++ 学习 ::【基础篇:16】:C++ 类的基本成员函数:拷贝构造函数(认识、特征、注意点及典型使用场景)及其基本写法与调用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

NPC的白话文谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值