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

【C++】六个默认成员函数——取地址重载,const成员函数

🍅

初始化和清理

拷贝复制

目录

☃️1.取地址重载

☃️2.const取地址操作符重载


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

☃️1.取地址重载

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

就是取地址的操作符   进行了运算符重载..... 也很简单直接返回对应的this指针即可, 所以直接使用编译器默认生成的就行

☃️2.const取地址操作符重载

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

这里涉及到const修饰的成员函数 —— const成员函数(const加在函数名的后面)

实际上他修饰的是该成员函数隐含的this指针,表示该成员函数中不能对类的任何成员修改

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}void Print(){cout << "Print()" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}const void Print() const{cout << "Print()const" << endl;cout << "year:" << _year << endl;cout << "month:" << _month << endl;cout << "day:" << _day << endl << endl;}
private:int _year; // 年int _month; // 月int _day; // 日
};
void Test()
{Date d1(2022, 1, 13);d1.Print();const Date d2(2022, 1, 13);d2.Print();
}

 

可以发现,实例化的时候加上const才会去调用const成员函数

因为说到加上const(函数后),该对象的this指针被const修饰

即 对于这句代码

const void Print() const

实际上第一个const的意思是,返回值是常量不可以被修改

第二个const属于const成员函数,修饰该对象的this指针

const void Print(const Date* this) 

由于C++中权限缩小现象,d2对象只能调用const成员函数,因为d2被const修饰,d2中的任何成员都不能修改

const Date d2(2022, 1, 13);

可以看到,如果写了一个成员函数用来改变成员变量——year

d1可以 d2不行

总结:

d2的this指针在实例化的时候已经被const修饰,d2成员只有可读属性,所以只会去调用const成员函数—— const对象不可以调用非const成员函数(权限不能放大),只能调用const成员函数 

非const对象可以调用const成员函数(权限可以缩小),只需要调用的时候编译器自动在成员前加上const即可

 const成员函数内不可以调用其它的非const成员函数吗(权限不能放大)
非const成员函数内可以调用其它的const成员函数(权限可以缩小)

 

http://www.lryc.cn/news/4234.html

相关文章:

  • Win11浏览器无法上网,秒杀网上99.9%教程—亲测完胜
  • Vulkan Graphics pipeline Dynamic State(图形管线之动态状态)
  • CSP-《I‘m stuck!》-感悟
  • [实践篇]13.19 Qnx进程管理slm学习笔记(二)
  • (免费分享)基于 SpringBoot 的高校宿舍管理系统带论文
  • 运筹系列78:cbc使用介绍
  • RocketMQ底层源码解析——事务消息的实现
  • 学习802.11之MAC帧格式(一篇就够!)
  • 使用阿里云IoT Studio建立物模型可视化界面
  • HBase 复习 ---- chapter07
  • 跟我一起写Makefile--个人总结
  • 设计模式之为什么要学好设计模式
  • 大数据时代的小数据神器 - asqlcell
  • 【呕心沥血】整理全栈自动化测试技术(三):如何编写技术方案
  • 67. 二进制求和
  • 1555数列极差(队列 优先队列 )
  • 代码随想录算法训练营第二十七天 | 93.复原IP地址,78.子集,90.子集II
  • jvm类加载器
  • Rust学习入门--【7】Rust 数据类型
  • 阅读MySQL必知必会,查缺补漏
  • MySQL数据库10——多表连接查询
  • 华为OD机试 - 括号检查(Python)| 真题含思路
  • 安全渗透测试中的一款免费开源的超级关键词URL采集工具
  • 数据资产管理实践白皮书(6.0版)解读
  • c/c++开发,无可避免的函数指针使用案例
  • QT(12)-QThreadPool
  • 【Java|golang】1138. 字母板上的路径
  • Flink 1.14从简单到源码第三讲
  • 淘宝API接口系列,获取购买到的商品订单列表,卖出的商品订单列表,订单详情,订单物流,买家信息,收货地址列表,买家token
  • ucos-ii 的任务调度原理和实现