【C++】类与对象(2补充运算符重载,const成员)

这篇具有很好参考价值的文章主要介绍了【C++】类与对象(2补充运算符重载,const成员)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++】类与对象(2补充运算符重载,const成员)

作者:爱写代码的刚子
时间:2023.5.11
本篇作为【C++】类与对象(2)的补充(运算符重载、const成员)

赋值运算符重载

运算符重载

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类
型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)

注意:

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型或者枚举类型的操作数。
  • 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参
  • .* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载(很重要)
  • C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。

下面以日期类举例:

class Date
{
public:
Date::Date(int year, int month, int day)
{
	_year = year;
	_month = month;
	_day = day;
}
Date::operator=(const Date& d)
{
	_year = d._year;
	_month = d._year;
	_day = d._day;
}
private:

	int _year;
	int _month;
	int _day;
};

注意:bool operator==(Date* this, const Date& d2);
左操作数是this指向的调用函数的对象

  • 附:
对日期类(Date)前置++和后置++的运算符重载
//前置++
Date& Date::operator++()
{
	*this += 1;
	return *this;
}

// 后置++
// 增加这个int参数不是为了接收具体的值,仅仅是占位(绕过语法限制),跟前置++构成重载
Date Date::operator++(int)
{
	Date tmp = *this;
	*this += 1;
	
	return tmp;
}

后置++要用int参数占位,为了与前置++区分( --与++相同)

实现日期类(Date)对<<的运算符重载:

注意流插入不能写成成员函数,因为Date对象默认占用第一个参数,做了左操作数,不符合使用习惯
既然不能写成成员函数,那如何访问类里面的私有变量?
解决方法:

  1. 将对<<的运算符重载的函数变为Date的友元函数。(C++常用)
  2. 调用Date里面的GetYear等函数(公有)来访问。(Java常用)
//要注意const的使用
ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "年" << d._month << "月" << d._day << "日" << endl;

	return out;
}

istream& operator>>(istream& in, Date& d)
{
	int year, month, day;
	in >> year >> month >> day;

	if (month > 0 && month < 13
		&& day > 0 && day <= d.GetMonthDay(year, month))
	{
		d._year = year;
		d._month = month;
		d._day = day;
	}
	else
	{
		cout << "非法日期" << endl;
		assert(false);
	}

	return in;
}
  • <<可以直接支持内置类型是库里面实现了
  • <<可以直接支持自定识别类型是因为函数重载
  • <<的执行顺序为从左往右
  • 运算符重载也可以当作函数显示调用,当然这肯定不好。
赋值运算符重载

赋值运算符主要有四点:

  1. 参数类型
  2. 返回值
  3. 检测是否自己给自己赋值
  4. 返回*this
  5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。(与拷贝函数要注意的地方一样)

赋值运算符重载和拷贝构造函数的区别:
拷贝构造函数是创建一个拷贝后的对象
而赋值运算符重载是拷贝给已有的对象

const成员

const修饰类的成员函数

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。
举例:
假如Date类里面有print()成员函数

void print()
{
	//...
}

发现:

Date d1;
d1.print();//正常(this指针类型:Date*)
const Date d2;
d2.print()//报错(因为print()可能对const类型进行修改,发生了权限的放大)(this指针类型:const Date*)

解决方法:
将print成员函数改为

void print() const//const修饰this指针
{
	//...
}
  • 成员函数的后面加const后,普通和const对象都可以调用该成员函数(但是要修改成员变量的成员函数不能加const),所以只要函数不修改成员变量,都应该加const。
  • 如果对<进行运算符重载正确的格式为bool operator(const Date& x) const;两边要统一加const)而不是bool operator(const Date& x);
  • const修饰的不是this指针,而是*this(易混),this指针本身就是不可修改的

取地址及const取地址操作符重载

一般自定义类型不能用运算符
但这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

Date* operator&()
{
	return this;
}
 
const Date* operator&() const
{
	return this;
}

两个函数构成函数重载(参数(this指针)类型不同)
const 对象(必须初始化)调用const Date* operator&() const,普通对象调用Date* operator&()
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如不想让别人获取到指定的内容(返回指针时返回nullptr)。文章来源地址https://www.toymoban.com/news/detail-441899.html

到了这里,关于【C++】类与对象(2补充运算符重载,const成员)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入篇【C++】类与对象:运算符重载详解 -上

    内置类型(int /double…… )是可以之间进行运算符之间的比较的,因为编译器知道它们之间的比较规则,可以之间转化为指令。 那如果自定义类型能否之间进行运算符之间的比较呢?当然不能了,因为编译器是不知道这个自定义类型的规则是什么,不知道如何进行比较。 1.内置

    2024年02月03日
    浏览(39)
  • c++类与对象(二)——赋值运算符重载与取地址操作符重载

    前言: 本章将通过 日期类 的实现,深入学习 运算符重载 的实现方法。本章将完成6个默认成员函数中剩余3个—— 赋值运算符重载 与 取地址操作符重载 的学习。 C++ 为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有 特殊函数名 的函数,也具有其返回值类型,

    2024年02月03日
    浏览(35)
  • C++ 类和对象篇(八) const成员函数和取地址运算符重载

    目录 一、const成员函数 1. const成员函数是什么? 2. 为什么有const成员函数? 3. 什么时候需要使用const修饰成员函数?  二、取地址运算符重载 1. 为什么需要重载取地址运算符? 2. 默认取地址运算符重载函数 3. 默认const取地址运算符重载函数 4. 什么时候要显示重载取地址运算

    2024年02月07日
    浏览(42)
  • 【C++初阶】类与对象:6大默认成员函数------拷贝构造和赋值运算符重载

      拷贝构造函数: 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰) ,在用已存在的类类型对象创建新对象时由编译器自动调用。 1. 拷贝构造函数是 构造函数的一个重载形式 ; 2. 拷贝构造函数的 参数只有一个且必须是类类型对象的引用 ,使用传值方式编

    2024年02月03日
    浏览(37)
  • [C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)

    我们知道进行运算符重载这个函数的参数的左右类型是非常重要的,我们尝试在类中去定义这个流插入重载! 1. 考虑到隐含的参数指针: 2.进行优化! 我们观察上面的代码发现可以实现在类中进行流插入运算符的一个重载但是我们需要考虑隐含参数的位置所以我们进行传参

    2024年02月06日
    浏览(38)
  • 【C++】构造函数,析构函数,拷贝构造,运算符重载,const 成员

    默认成员函数:如果不显示,编译器默认生成 构造函数:是一个特殊的 成员函数 ,函数名与类名相同,专门用于 初始化类对象 函数名与类名相同 无返回值 ,没有被声明为void类型 对象实例化时 编译器自动调用 , Date d1 ,或 Date d2(2023, 4, 21) 构造函数可以重载,一个类中可以

    2023年04月24日
    浏览(57)
  • C++ 面向对象(3)——重载运算符和重载函数

    C++ 允许在同一作用域中的某个 函数 和 运算符 指定多个定义,分别称为 函数重载 和 运算符重载 。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个 重载函数 或 重载运算符 时

    2024年02月10日
    浏览(39)
  • 【C++】中类的6个默认成员函数 取地址及const成员函数 && 学习运算符重载 && 【实现一个日期类】

    1.1 运算符重载【引入】 C++为了增强代码的可读性引入了 运算符重载 ,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。 函数名字为: operator后面接需要重载的运算符符号。 函数原型:

    2024年02月21日
    浏览(38)
  • C++——类和对象之运算符重载

    本章思维导图: 注:本章思维导图对应的 xmind 文件和 .png 文件都已同步导入至”资源“ 我们都知道, 对于内置类型我们是可以直接用运算符直接对其进行操作的,但是对于自定义类型,这种做法是不被允许的 。 例如对于 Date 类: 因此, 为了解决自定义类型不能使用操作

    2024年02月05日
    浏览(38)
  • C++面向对象程序设计 - 运算符重载

            函数重载就是对一个已有的函数赋予新的含义,使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数,也就是一名多用。运算符也可以重载,即运算符重载(operator overloading)。         运算符重载的方法是定义一个重载运算符的函数,在需要执行被

    2024年04月25日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包