类和对象(4)

文章目录

  • 1. const成员
  • 2.取地址及const取地址操作符重载
  • 3. 再谈构造函数
    • 3.1构造函数体赋值
    • 3.2初始化列表

1. const成员

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

#include<stdio.h>
#include<iostream>
using namespace std;
class A
{
public:void Print(){cout << _a << endl;}
private:int _a = 10;
};
//
int main()
{A aa;aa.Print();return 0;
}

在这里插入图片描述

const A aa;//此时调用不动,编译报错

出现权限放大问题。传参时&aa的类型是什么?const A*,指向的内容不能改变。
传到A*,出现权限放大。只能改变this指针的类型,但无法改变this指针的类型。
隐含的参数不能自己去改,所以只能用间接的方式:

void Print() const//const修饰*this,this指针的类型变成了const A*
void Print(A* const this)//const修饰this指针,但this指针本身不能改变。const没有影响

只要内部不改变成员变量都应该用const修饰一下。

void Add(int x)const
{_a+=x;
}//不能用const修饰

内部不改变成员变量的成员函数,最好加上const,const对象和普通对象都可以调用。
流插入和流提取能不能用const?

  • 他们都不是成员函数,不能。
    声明和定义都要加const。

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

不写编译器会自己定义一个。
针对const版本的重载。const不写版本也会自动生成。
除了赋值也有一个运算符可以不重载直接用,取地址。因为是默认成员函数。

//不想让类取到地址。
const A* operator&() const
{//return this;return nullptr;
}
A* operator&() 
{//return this;return (A*)0x01;//要强转因为整形不能传给指针
}
class Array
{
public:int& operator[](int i){assert(i < 10);return _a[i];//返回第i个数据}const int& operator[](int i) const//第一个const:返回值类型{assert(i < 10);return _a[i];}//他们俩构成函数重载,因为参数不同
private:int _a[10];int _size;
};
int main()
{Array a;//自定义类型for (int i = 0; i < 10;++i){a[i] = i;//变成一个函数调用,防越界}for (int i=0; i < 10;++i){cout << a[i] << " ";}cout << endl;return 0;
}

在这里插入图片描述
不是说一个类只能提供const版本

3. 再谈构造函数

3.1构造函数体赋值

C++在构造函数中还加了初始化列表。
成员变量现在有两种初始化方式,
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。

class Date
{
public:Date(int year, int month, int day){_year = year;_month = month;_day = day;}//函数体内的赋值初始化
private:int _year;int _month;int _day;
};

虽然上述函数调用以后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化。构造函数体中的语句只能称之为赋初值,而不能称作初始化。因为初始化只能初始一次,而构造函数体内可以多次赋值

3.2初始化列表

初始化列表:以一个冒号开始,接着是以逗号分隔的数据成员列表,每个成员变量后跟着一个放在括号中的初始值或表达式

class Date
{
public:Date(int year, int month, int day):_year(year), _month(month), _day(day){}private:int _year;int _month;int _day;
};

在这里插入图片描述
注意:

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
  2. 类中包含以下成员,必须放在初始化位置进行初始化:
  • 引用成员变量
  • const成员变量,因为只有这一次初始化的机会。
  • 自定义类型成员(且该类没有默认构造函数时)

const变量必须在定义的位置初始化,这次初始化完以后就不能改了。

class A
{
public:int _a;//声明int _a2;const int _x;//加了以后生不成默认构造//const int _x=1;给的是缺省值,不是初始化。
};
int main()
{A aa;//定义,对象整体的定义。每个成员什么时候定义呢?//必须给成员变量找一个定义的位置,不然像const这样的成员不好处理。//必须在定义的位置初始化const int i=0;return 0;
}
class B
{
private:B(int _b):_b(0){cout << "B()" << " ";}
};
class A
{
public://1.那个对象调用构造函数,初始化列表是他所有成员变量定义的位置//2.不管你是否显示在初始化列表写,那么编译器每个变量都会初始化列表定义初始化A()//构造函数{:_x(1),_a2(1),_bb(0),_ref(_a1){_a1++;//缺省值在这里用_a2--;}}
private:int _a1=1;//声明int _a2=2;const int _x;//const int _x=1;给的是缺省值,不是初始化。int& _ref;//也必须初始化,引用也必须在定义的位置初始化B _bb;//默认生成的构造函数(不传参数就可以调的那一个),对内置类型不做处理,对自定义类型进行初始化。//默认构造无参,全缺省
};
int main()
{A aa;//定义,对象整体的定义。每个成员什么时候定义呢?//必须在定义的位置初始化const int i=0;//加了以后生不成默认构造。return 0;
}

成员变量在类中声明次序就是其在初始化列表中的初始化顺序与在初始化列表的先后顺序无关

  1. 所有的成员都会走初始化列表
  2. 平时写构造函数最好在初始化列表写

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

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

相关文章

【echarts】xAxis鼠标事件失效问题

项目中用到echarts柱状图&#xff0c;出现x轴标签文字过长重叠问题&#xff0c;在pass掉标签倾斜、换行方案之后最终决定限制文字长度&#xff0c;超出以…占位&#xff0c;鼠标悬浮时显示完整tooltip。 但编写过程中发现xAxis鼠标事件无法触发&#xff0c;只有bar区域是可触发…

【C++杂货铺】详解string

目录 &#x1f308;前言&#x1f308; &#x1f4c1; 为什么学习string &#x1f4c1; 认识string&#xff08;了解&#xff09; &#x1f4c1; string的常用接口 &#x1f4c2; 构造函数 &#x1f4c2; string类对象的容量操作 &#x1f4c2; string类对象的访问以及遍历操…

【uni-app】condition 启动模式配置,生产环境无效,仅开发期间生效

在小程序开发过程中&#xff0c;每次代码修改后&#xff0c;都会启动到首页&#xff0c;有时非常不方便&#xff0c;为了更高效的开发&#xff0c;有时需要模拟直接跳转到指定的页面&#xff0c; 操作方法如下&#xff1a; 在pages.joson里面配置下列代码&#xff1a; "…

解决 matplotlib 中文显示乱码的问题

matplotlib 库默认只显示中文 例如&#xff1a; import matplotlib.pyplot as pltimg plt.imread(test.jpg)# plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 # plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 #有中文出现的情况&#xf…

宏auto关键字(C++基础)

宏 宏可以实现对语句的同义替换&#xff0c;简单来说就是预处理阶段、编译前的替换&#xff08;包括符号&#xff0c;变量等&#xff09;。 #define LOG(x) std::cout << x << std::endl; LOG("hello") 可以正常使用。 下面通过上图中借用不同开发模…

YOLOv8改进 | 独家创新篇 | 利用DCNv3集合DLKA形成全新的注意力机制(全网独家创新)

一、本文介绍 本文给大家带来的机制是由我独家创新结合Deformable Large Kernel Attention (D-LKA) 注意力机制和DCNv3可变形卷积的全新注意力机制模块(算是二次创新),D-LKA的基本原理是结合了大卷积核和可变形卷积的注意力机制,通过采用大卷积核来模拟类似自我关注的感受…

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种&#xff0c;由低到高分别为Read uncommitted &#xff08;读未提交&#xff09;、Read committed&#xff08;读提交&#xff09; 、Repeatable read&#xff08;可重复读&#xff09; 、Serializable &#xff08;串行化&a…

OpenAI劲敌吹新风! Claude 3正式发布,Claude3使用指南

Claude 3是什么&#xff1f; 是Anthropic 实验室近期推出的 Claude 3 大规模语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;系列&#xff0c;代表了人工智能技术的一个显著飞跃。 该系列包括三个不同定位的子模型&#xff1a;Claude 3 Haiku、Claude 3…

06 - ip route和route -n的区别

1 ip route和route -n的区别 ip route 和 route -n 都是用于查看和管理Linux系统路由表的命令。但下面是它们的区别&#xff1a; ip route&#xff1a;是Linux系统中的现代工具&#xff0c;它属于iproute2套件&#xff1b;它提供了更多的选项&#xff0c;可以更精确地控制路由表…

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…

EIP-1559

EIP EIP是以太坊改进提案&#xff08;Ethereum Improvement Proposal&#xff09;的缩写。它是一种标准化的提案制度&#xff0c;用于描述和讨论对以太坊区块链网络的改进和升级。EIP的目的是提供一个开放的、透明的过程&#xff0c;让社区成员、开发者和其他利益相关者能够共同…

短视频矩阵系统----矩阵系统源码搭建(技术门槛?)

短视频矩阵是什么意思&#xff1f;短视频矩阵的含义可以理解为全方位的短视频账号&#xff0c;通过不同的账号实现全方位的品牌展示。实际上是指一个短视频账号&#xff0c;通过不同的链接实现品牌展示&#xff0c;在不同的粉丝流量账号中互相转发同一个品牌&#xff0c;在主账…

pytorch CV入门3-预训练模型与迁移学习.md

专栏链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑&#xff1a;2024/3/7&#xff1b;最后编辑&#xff1a;2024/3/8 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

外包干了8天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入杭州某软件公司&#xff0c;干了接近3年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

能源大数据采集,为您提供专业数据采集服务

随着经济的不断发展&#xff0c;能源产业也逐渐成为国民经济的支柱产业之一。而对于能源行业来说&#xff0c;数据采集是一项至关重要的工作。以往&#xff0c;能源企业采集数据主要依靠人工收集、整理&#xff0c;但是这种方式不仅效率低下&#xff0c;而且容易出现数据不准确…

Python测试框架Pytest的基础入门

Pytest简介 Pytest is a mature full-featured Python testing tool that helps you write better programs.The pytest framework makes it easy to write small tests, yet scales to support complex functional testing for applications and libraries. 通过官方网站介绍…

SpringBoot 手写 Starter

1.介绍 SpringBoot中的starter是一种非常重要的机制&#xff0c;能够抛弃以前繁杂的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种…

九型人格测试,8号领袖型人格的职业分析

8号人格&#xff0c;也叫领袖型人格&#xff0c;在九型人格中间&#xff0c;是一种天生领导的存在。他们生性开朗&#xff0c;能够和其他人建立良好的关系&#xff0c;为人不拘小节&#xff0c;遇强则强&#xff0c;坚守心中的理想和正义。不喜欢被人控制&#xff0c;喜欢自己当…

Wireshark——获取捕获流量的前N个数据包

1、问题 使用Wireshark捕获了大量的消息&#xff0c;但是只想要前面一部分。 2、方法 使用Wireshark捕获了近18w条消息&#xff0c;但只需要前5w条。 选择文件&#xff0c;导出特定分组。 输入需要保存的消息范围。如&#xff1a;1-50000。 保存即可。

LInux-多线程基础概念

文章目录 前言预备页表详解缺页中断页表的映射 一、多线程是什么&#xff1f;轻量级进程 二、Pthread库pthread_create 前言 从本章的多线程开始&#xff0c;我们开始进入Linux系统的尾声&#xff0c;所以&#xff0c;在学习多线程的过程中&#xff0c;我们也会逐步对之前的内…