【CPP】自定义类型不支持流插入、流提取怎么办?const成员是什么?初始化列表又是什么?

1.日期类再续前缘 --- 流插入、流提取

a. 自定义类型不支持对象直接用运算符,想支持怎么办?

运算符重载:operate<<(ostream& out)

b.  为什么能自动识别类型?

本质就是函数重载(参数匹配)

c.  cout  << di 不能运行,d1<< cout能运行 ?

怎么解决?

(1)双操作数的运算符,第一个参数是左操作数,第二个参数是右操作数

(2)this是个隐藏的默认参数,把第一个参数占用了(Dte对象默认占据第一个位置,<<实现成成员函数那就是不好的

注意:

1.第一个参数不能加const,第二个可以加

2.暂且换成公有,cout传递给out,d1传递给d

3.如果设为私有怎么解决?

        (1)get和set

        (2)友元函数(我是你的朋友,我也可以访问你的私有)

有没有其他的问题?

        返回值应该是cout再继续去做后一次流插入的左操作

        所以返回值类型改成ostream&。

流插入和流提取相似

分析:

流本质是为了解决,自定义类型的输入和输出问题。

printf scanf无法解决自定义类型的输入输出问题,

C++用面向对象和运算符重载解决的,可以混着用

总结:

其他的运算符一般是实现成成员函数,>> <<流运算符必须是实现到大局,这样才能让流对象做第一个参数,才符合可读性。 

2.运算符重载(补充)

不能去创建一些C语言里没有的

3.const成员

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

函数后加const。

先给个结论

1.权限能平移

2.const对象和非const对象都能调用const成员函数

3.比较大小不修改成员,分开的话(声明和定义都要加上const)

成员函数定义原则:

1.能定义成const成员函数都应该定义成const,这样const对象和非const对象都可以调用

2.要修改成员变量的成员函数,不能定义成const, const对象不能调用(很合理)非const才能调用

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

这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

class Date
{
public:
	Date* operator&()
	{
		return this;
	}

	const Date* operator&()const
	{
		return this;
	}
private:
	int _year; // 年
	int _month; // 月
	int _day; // 日
};

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!

总结:

1.编译器原则找最匹配的。

2.如果没有牛肉面就去吃泡面

3.默认成员函数不写也能跑,写了不会生成

4.一般的类不考虑这个重载

5.为了逻辑自洽

5.初始化列表的初步理解  

1. 剩下的3个成员没有在初始化列表显示写出来定义

2.但是他也会定义,只是内置类型默认给的随机值

3.如果是自定义类型成员会去调用它的默认构造函数

解决方案:

        给默认构造

        初始化列表,有缺省值用缺省值,没有就用随机值。缺省值给初始化列表没写的时候用的,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

No more cages

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

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

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

打赏作者

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

抵扣说明:

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

余额充值