C++(2023.4.26)

文章讨论了C++中的运算符重载原则,强调是否重载取决于运算符对类的意义。不能重载的运算符包括.*::sizeof?。赋值运算符重载与拷贝构造函数的区别在于前者是对象间的复制,而后者是对象初始化。默认的赋值运算符与拷贝行为相同,但应避免可能导致悬挂引用的问题。同时,文章提到了流插入(<<)和流提取(>>)的重载,以及友元函数在访问私有成员时的作用。
摘要由CSDN通过智能技术生成

目录

运算符重载

是否重载运算符,取决于这个运算符对这个类是否有意义

注意:

几个不能重载的运算符

赋值运算符重载

与拷贝构造函数的区别

默认生成赋值重载跟拷贝行为一样:

<<流插入重载

友元函数声明

>>流提取重载

const


运算符重载

是否重载运算符,取决于这个运算符对这个类是否有意义

一般写成成员函数,因为使用起来会更加方便,类里面可以直接运用私有

自定义类型运算符重载本质上就是调用函数

引用的底层是使用指针实现,所以在汇编代码里需要取地址

 

C++为了增强代码的可读性引入了运算符重载运算符重载是具有特殊函数名的函数,也具有其

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

注意:

不能通过连接其他符号来创建新的操作符:比如 operator@
重载操作符必须有一个类类型参数 (自定义类型)
operator(const int& d1,const int& d2) 错误
用于内置类型的运算符,其含义不能改变,例如:内置的整型 + ,不 能改变其含义
作为类成员函数重载时,其形参看起来比操作数数目少 1 ,因为成员函数的第一个参数为隐
藏的 this
操作符是几个操作数,重载函数就有几个参数

几个不能重载的运算符

.* :: sizeof ?: . 注意以上 5 个运算符不能重载。

?: 三目

:: 域作用限定运算符

sizeof

.  成员访问

.*  点心

对象的传值要调用拷贝构造

赋值运算符重载

与拷贝构造函数的区别

拷贝构造是用一个已经存在的对象初始化另一个对象。--构造函数

赋值运算符是已经存在的两个对象之间的复制拷贝。--运算符重载函数

赋值运算符不写会自己生成,其它运算符不会

//传值返回要去调用拷贝构造函数,因此在这里因为this指针里面的内容出了作用域还在,那么使用传引用返回
	//这里一个传的是地址,指针是内置类型,一个是别名,所以不要调用拷贝构造
/*date operator=(const date& d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;

		return *this;
	}*/

	date& operator=(const date& d)
	{
        //if(*this!=d),也可以这样写,但是!=要进行运算符重载,代价太大
        if(this!=&d)
        {
		_year = d._year;
		_month = d._month;
		_day = d._day;
        }
		return *this;
	}

传值返回

 传引用返回

默认生成赋值重载跟拷贝行为一样:

1.内置类型成员——值拷贝/浅拷贝

2.自定义类型成员会去调用他的赋值重载

因为赋值运算符重载是默认成员函数,可以声明和定义分离,但不能声明和定义全写在类外面,不然在类里面又会生成一个默认成员函数,导致无法区分

日期类

类里面的直接是内联(由编译器判断)

左操作数是第一个参数,右操作数是第二个参数

四年一闰,百年不闰,四百年闰

内置类型没有必要用引用返回

cmp比较指令

abs绝对值

自定义类型尽量多用前置,少用后置(后置需要拷贝);

内置类型区别不大

<<流插入重载

可以直接支持内置类型在库里面实现了

可以直接支持自动识别类型是因为函数重载

<<流插入不能写成成员函数

因为Date对象默认占用第一个参数,就是做左操作数

写出来就是下面这样子,不符合使用习惯

void operator<<(ostream& out)

d1<<out 正确

cout<<d1错误

d1.operator<<(cout) 正确

 

但是如果写成全局函数,成员变量是私有的,无法访问,怎么办?

可以写成员函数Getyear()获取私有变量函数;

写成全局加友元,在类里面写friend +函数声明

ostream前不能加上const,因为流插入,就是往cout里面写东西,需要改变

但是这里还有一个问题就是不能连续流插入?

那么就要有返回值,ostream&

连续赋值

从右往左执行

date d1;

d1=d2=d3;

连续流插入

从左往右执行

cout<<d1<<d2<<d3;

为什么cout不能做第一个参数,成为this指针?

cout.operator(d);不能这样写

友元函数声明

可以写在类里的任意位置

friend+函数声明

可以在类外面访问私有成员变量

>>流提取重载

istream& operator>>(istream& in,Date& d)

在istream前也不能加const,因为提取时,在内部可能会发生改变

流一切皆可输入,输出

const

因为this指针不能显示写,所以在类里面的函数声明后加const修饰*this

void printf() const;

成员函数后面加const以后

普通和const对象都可以调用

 

要修改的对象成员变量的函数不能加

只要成员函数内部不修改成员变量,都加这个const

普通和const对象都可以调用

 声明和定义分离的话,都要在后面加const

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值