【C++类和对象】const成员函数及流插入提取

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:C++入门至进阶
这里将会不定期更新有关C++的内容,希望大家多多点赞关注收藏💖💖

前面我们学习过六大默认成员函数中的四个——构造函数与析构函数以及拷贝构造与赋值运算符重载,今天我们继续学习剩下的成员函数——取地址与const取地址操作符重载。

目录

  • 💞💞 前言
  • 1.const成员函数
  • 2.取地址以及const取地址操作符重载
  • 3.流插入流提取运算符重载
  • 4.结语

1.const成员函数

  • const成员函数是指在函数声明和定义时使用const关键字修饰的成员函数。使用const修饰的成员函数不能修改类的成员变量,也不能调用非const成员函数。

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

  • const成员函数的声明语法为:void functionName() const;

在const成员函数中,对成员变量的修改会导致编译错误。例如:

class MyClass {
public:void modifyVar() const {myVar = 5; // 编译错误}
private:int myVar;
};

在使用const对象调用const成员函数时,会调用const版本的函数。而使用非const对象调用const成员函数时,会调用非const版本的函数。例如:

class MyClass {
public:void nonConstFunc() {// do something}void constFunc() const {// do something}
};
//上面这两个函数构成函数重载意义在于不同对象调用不同的函数
int main() {MyClass obj1;const MyClass obj2;obj1.nonConstFunc(); // 调用非const版本的函数obj2.constFunc(); // 调用const版本的函数obj2.nonConstFunc(); // 编译错误,const对象不能调用非const版本的函数return 0;
}

const成员函数的作用是保证在函数内部不会修改类的成员变量,从而更好地实现了类的封装性和安全性。

注意:

  • const成员函数内不可以调用其它的非const成员函数

在const成员函数内是不允许调用非const成员函数的。因为const成员函数被声明为const,它承诺了不会修改类的成员变量。如果在const成员函数内部调用非const成员函数,那么就可能会导致成员变量的被修改,违反了const成员函数的约定。

  • 非const成员函数内可以调用其它的const成员函数

非const成员函数内可以调用其他的const成员函数。const成员函数表示该函数不会修改类的成员变量,因此在非const成员函数内调用const成员函数是安全的。

  • const对象不可以调用非const成员函数

const对象的成员函数被隐式地视为const成员函数,因此只能调用const成员函数,而不能调用非const成员函数。

  • 非const对象可以调用const成员函数

总结:
只读函数可以加const,其内部不涉及修改生成,便于const和非const对象的调用;而涉及对象修改生成的函数就不可以加const。

2.取地址以及const取地址操作符重载

  • 这两个默认成员函数一般不用重新定义,编译器默认会生成;
  • 在C++中,使用&操作符可以取得一个对象的地址。对于const对象,也可以使用&操作符来取得其地址;
  • 在C++中,可以重载&操作符,假设有一个类Date,可以在类中重载&操作符,如下所示:
class Date
{ 
public :Date* operator&(){return this ;}const Date* operator&()const{return this ;}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};

这两个运算符一般不需要自己去写,使用编译器生成的默认取地址的函数即可,只有特殊情况,才需要手动生成,比如想让别人获取到指定的内容就可以自己定义返回的指针。

3.流插入流提取运算符重载

  • 在C++中,可以通过重载流插入流提取运算符(<< 和 >>)来自定义输入输出操作。
  • 流插入运算符(<<)用于将数据插入到输出流中。它的重载函数应该以ostream&类型作为返回值,并以一个 ostream&类型的参数(通常是输出流对象)和要输出的数据作为参数。
  • 流提取运算符(>>)用于从输入流中提取数据。它的重载函数应该以 istream&类型作为返回值,并以一个 istream&类型的参数(通常是输入流对象)和要提取到的数据的引用作为参数。
  • 在C++中流插入提取操作符重载是不可以重载成成员函数,因为它们参数的顺序不可以改变,例如:
    在这里插入图片描述

这是因为流插入第一个运算符是cout,而如果将其重载为成员函数第一个参数就是类和对象中隐含的this指针,所以参数顺序不匹配,我们只能将其重载成全局函数;与此同时流插入运算符和流提取运算符通常都是以友元函数的形式定义在类的声明内部,这允许它们访问类的私有成员。

如下面代码所示:

#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 = 1900;int _month= 1;int _day = 1;
};
//流插入提取
ostream& operator<<(ostream& out, const Date& d)
{out << d._year<< "/" << d._month << "/" << d._day << endl;return out;
}
istream& operator>>(istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}int main()
{Date d1;cin >> d1;cout << d1;return 0;
}

结果如下:
在这里插入图片描述

4.结语

在类和对象的成员函数中只读函数可以加const,因为其内部不涉及修改生成;取地址与const取地址这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载;此外流插入运算符和流提取运算符通常都是以友元函数的形式定义在类的声明内部,这允许它们访问类的私有成员。以上就是今天的所有内容啦~ 完结撒花 ~🥳🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636636.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【论文精读】Attention is all you need

摘要 主要的序列转换模型是基于复杂的循环或卷积神经网络&#xff0c;其中包括一个编码器和一个解码器。性能最好的模型还通过一种注意力机制将编码器和解码器连接起来。我们提出了一种新的简单的网络架构&#xff0c;Transformer&#xff0c;完全基于注意机制&#xff0c;完全…

在ubuntu20.04下迁移anaconda的目录,试验不行后,换成软连接

一、原因 随着不断的搭建不同的算法环境&#xff0c;原本在固态硬盘上安装的anaconda上占用空间越来越多。导致可用的固态硬盘空间越来越少&#xff0c;又因安装的环境太多&#xff0c;重新搭建比较费时费力。有没有直接将当前已经搭建好环境的anaconda 迁移到另外的目录呢&…

【C# 数据结构-队列】

在C#中&#xff0c;队列&#xff08;Queue&#xff09;是一种先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的数据结构&#xff0c;允许添加&#xff08;Enqueue&#xff09;和移除&#xff08;Dequeue&#xff09;元素。队列类在.NET Framework的Syste…

C++参考手册使用说明

C参考手册使用说明 文章目录 C参考手册使用说明1 为什么要使用C参考手册2 网站3 C参考手册离线格式4 C参考手册使用说明1.1 离线C参考手册下载1.2 html离线C参考手册1.3 chm离线C参考手册1.4 linux安装包C参考手册&#xff08;只有英文版本&#xff09;1.5 qch离线C参考手册 更…

接雨水 , 给定二维图,能容多少水

42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 看着就是非常常规的题目&#xff0c;所以非常有必要掌握。 最少也把O&#xff08;n^2&#xff09;的方法写出来吧。力扣官方题解的三种方法O&#xff08;n&#xff09;都挺好&#xff0c;不过可能有点难读&#xff0c;在此…

【数据结构2-线性表】

数据结构2-线性表 1 线性表-数组2 线性表-单链式结构2.1 前插顺序单链表2.2 后插顺序单链表2.3 循环单链表2.4 双向链表 总结 线性表、栈、队列、串和数组都属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱&#xff0c;最后一个元素无直接后继之外&#xff0c;其他…

12.事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template><button click"addCount">Add</button><p>Count is: {{ count }}</p> </template> <script> export default {data() {return {count:0…

Windows 10 安装配置WSL2(Ubuntu 20.04)教程

Windows 10 安装配置WSL2&#xff08;Ubuntu 20.04&#xff09;教程 一、WSL简介 WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个兼容层&#xff0c;允许在Windows 10上原生运行Linux二进制可执行文件。 二、安装WSL2 3.1 传统手动安装 更新系统&#xff…

lua整合redis

文章目录 lua基础只适合lua连接操作redis1.下载lua依赖2.导包,连接3.常用的命令1.set,get,push命令 2.自增管道命令命令集合4.使用redis操作lua1.实现秒杀功能synchronized关键字 分布式锁 lua 基础只适合 1.编译 -- 编译 luac a.lua -- 运行 lua a.lua2.命名规范 -- 多行注…

Mac电池管理软件 Batteries for Mac v2.2.9直装版

Batteries for Mac&#xff0c;作为一款专为Mac用户设计的电池管理软件&#xff0c;以其强大的功能和智能的监测机制&#xff0c;为用户提供了便捷、高效的电池使用体验。 Batteries for Mac(Mac电池)v2.2.9直装版下载 首先&#xff0c;Batteries for Mac具备实时电池监测功能&…

国产信创办公软件(流版式软件)厂家汇总以及国产信创外设汇总

国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总以及国产信创外设汇总。 国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总 在信创背景下&#xff0c;国内流版式软件的发展呈现出蓬勃的态势。信创&#xff0c;即信息技术应用创新产业&#xff0c;旨在…

setmapAVL树红黑树

目录 关联式容器树形结构的关联式容器setset的模板参数列表set的构造函数set的迭代器set的容量操作set其他操作 multisetmap键值对map的模板参数列表map的迭代器map中元素的修改map的容量与元素访问 multimap底层结构avl树avl树概念AVL树结点的定义AVL树的插入AVL树的旋转AVL树…