【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载

文章目录

  • 前言
  • 一、运算符重载
  • 二、赋值运算符重载
    • 1. 赋值运算符重载格式:
    • 2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。
    • 3. 赋值运算符只能重载成类的成员函数不能重载成全局函数
  • 三、前置++与后置++


前言

`

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

一、运算符重载

函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)

注意:
1…不能通过连接其他符号来创建新的操作符:比如operator@
2.重载操作符必须有一个类类型参数
3.用于内置类型的运算符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少1,因为成员函数的第一个参数为隐藏的this
4 . . :: sizeof ?: .* 注意以上5个运算符不能重载。这个经常在笔试选择题中出现。

全局的operator<:
【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第1张图片
所以我们一般都不把运算符重载函数写成全局函数,而上把他写在类中作为成员函数
这里我把全部比较情况都写出来了:

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第2张图片
【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第3张图片

二、赋值运算符重载

Date&operator=(const Date& x) {
		//赋值重载函数
		if ( this != &x) {
			_year = x. _year;
			_month = x._month;
			_day = x._day;
		}
		return *this;
	}

1. 赋值运算符重载格式:

1.参数类型:const T&,传递引用可以提高传参效率
2.返回值类型:T&,返回引用可以提高返回的效率,有返回值目的是为了支持连续赋值

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第4张图片
【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第5张图片
当我们进行连续赋值的时候如果为void类型就会报错,因为d2经过赋值后确实变为d3的值,但d2=d3整体等级与d2.operator(d3)返回值为void赋给d1就会报错

3.检测是否自己给自己赋值 >
【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第6张图片

4.返回*this :要复合连续赋值的含义

2. 用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。

注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

默认生成赋值重载和拷贝构造行为一样:
1.内置类型成员-值拷贝/浅拷贝
2.自定义类型成员:会去调用他们的赋值重载
3.当赋值涉及到内存释放之类的时候我们要自己去实现完成深拷贝,不然容易出现错误,其他情况都可以让编译器帮我们写好。
【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第7张图片

3. 赋值运算符只能重载成类的成员函数不能重载成全局函数

如果一个类中什么成员都没有,简称为空类。
空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第8张图片
赋值重载函数也在这六个函数之中,当我们定义赋值重载函数为全局函数的时候,编译器会认为我们类里面没有自己写赋值重载函数,他会帮我们自己生成一个,这就和我们在全局里面自己定义的赋值重载函数矛盾了。

三、前置++与后置++

【C++】运算符重载与赋值运算符重载(显式与默认)的特性与格式以及前置++,后置++重载_第9张图片

1.已经存在两个对象之间的拷贝:运算符重载函数
2.用一个已经存在的对象去初始化另一个对象:构造函数

你可能感兴趣的:(c++,开发语言)