当前位置: 首页 > article >正文

C++ 类和对象 (流插入、流提取、const)

一、流插入、流提取

1.C++中,可以通过重载流插入流提取运算符来定义输入输出操作

2.流插入运算符 << 用于将数据插入到输出流中,它的重载函数应该以ostream&类型作为返回值,并以一个ostream&类型的参数和要输出的数据作为参数

3.流提取运算符 >> 用于从输入流中提取数据。它的重载函数应该以istream&类型作为返回值,并以一个istream&类型的参数(通常是输入流对象)和要提取到的数据的引用作为参数

4.流插入操作符不可以重载成员函数,因为它们参数的顺序不可以改变

因为:流插入第一个运算符为cout,而如果将其重载为成员函数,第一个参数就是类和对象中隐含的this指针,所以参数顺序不匹配,我们只能将其重载成全局函数

5.通常流插入流提取运算符都是以友元函数的形式在类的内部进行声明,这样才允许它们访问类的私有成员

代码:

#include <iostream>
using namespace std;
class Date
{
public:
	//友元声明 允许非成员函数访问私有对象
	friend ostream& operator<<(ostream& out, const Date& d);
	friend istream& operator>>(istream& in,  Date& d);
	

private:
	int _year=2025;
	int _month=2;
	int _day=10;
};

ostream& operator<<(ostream& out, const Date& d)
{

	out << d._year << "/" << d._month << "/" << d._day<<endl;
	return out;
 }


istream& operator>>(istream& in,  Date& d)
{
	cout << "请输入年月日:";
	in >> d._year >>  d._month >> d._day;

	return in;

 }

int main()
{

	Date d1;
	cin >> d1;
	cout << d1;
	return 0;
}

二、const成员函数

1.将const修饰的成员函数称为const成员函数,const修饰成员函数放到成员函数参数列表的后面。

声明语法为:void FuncName() const;

2.const实际修饰该成员隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

例如:const修饰Date类的Print成员函数,Print隐含的this指针由Date * const this变为 const Date * const this

问题:

class Date
{
public:

	Date(int year = 2025, int month = 2, int day = 10)
	{
		_year = year;
		_month = month;
		_day = day;
	}

	void Print()
	{

		cout << _year << "/" << _month << "/" << _day << endl;
	}


private:
	int _year;
	int _month;
	int _day;
};


int main()
{
	Date d1(2025, 2, 11);
	d1.Print();

	const Date d2(2025, 2, 12);
	d2.Print();//会报错


	return 0;
}

 这段代码会报错,这是为什么呢?

这里涉及到权限放大的问题。d2的类型是const Date *,而Print函数的类型属于Date *,这里传过去会导致权限放大,所以调用会报错

只需用const修饰Print的函数即可,Print隐含的this指针由Date * const this变为  const Date * const this,这样调用Print,就是 const Date *传给const Date *,权限一样。

void Print()const
	{

		cout << _year << "/" << _month << "/" << _day << endl;
	}

注:

1.Date *传给const Date*没有问题 ,这里非const对象也可以调用const成员函数,是一种权限的缩小。

2.而 const Date*指向的内容不能被修改,所以当它传给Date*时就出错了,因为Date*是可以修改的,这属于权限放大。

权限只能缩小或相等。

三、取地址运算符重载

取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,一般这两个函数编译器自动生成的就够我们使用了,不需要去显示实现。除非特殊场景,比如我们不想让别人取到当前类对象的地址。

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

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

private:
	int _year;
	int _month;
	int _day;
};


http://www.kler.cn/a/543030.html

相关文章:

  • JavaScript相关知识点
  • 【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)_java spingboot 面试题
  • 接口测试Day12-持续集成、git简介和安装、Gitee远程仓库、jenkins集成
  • 《DeepSeek大模型的微调和部署案例实操课程》
  • 具身智能训练新思路!将生成视频用于训练机器人
  • 如何在Kickstart自动化安装完成后ISO内拷贝文件到新系统或者执行命令
  • MySQL的操作
  • 波导阵列天线学习笔记8 高增益、低轴比的3D打印Ka波段圆极化单脉冲天线阵列
  • VSCode的安裝以及使用
  • Qt:常用控件
  • Leetcode - 149双周赛
  • 一文读懂双通道CAN转以太网
  • Qt plugin 插件 如何内嵌json作为metaData
  • 【设计模式】【行为型模式】命令模式(Command)
  • wx057基于ssm+vue+uniapp的智慧乡村旅游服务小程序
  • PHP函数介绍—get_headers(): 获取URL的响应头信息
  • 嵌入式硬件篇---原码、补码、反码
  • Python常见面试题的详解2
  • 【数据库设计】深入理解常见范式
  • 从0搭建卷积神经网络(CNN)--详细教学
  • Vue 的虚拟 DOM 是什么?
  • 详解电子邮箱工作原理|SMTP、POP3、IMAP、SPF、MIME
  • React 初级教程
  • 图数据库 | 21、如何规划、评测和优化图系统(中)
  • ubuntu下apache服务器安装
  • Postman接口测试:postman设置接口关联,实现参数化