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

C++之类和对象(下)

目录

初始化列表

static成员

C++11对于非静态成员变量初始化

友元

友元函数

友元类

总结 


初始化列表

我们知道,在学习构造函数时,我们知道对象的成员变量的初始化我们是在构造函数函数体内进行初始化的,还有没有其它初始化成员变量的方法呢

初始化列表就是我们要学习的第二个初始化的方法

在学习初始化列表之前,我们先对以往的在构造函数内部对成员变量进行初始化的操作进行分析,我们直接给出结论,我们称在类内部的成员变量只是对成员变量进行了声明,而没有进行定义,如图所示:

      我们在日期类内部声明了三个成员变量,_year,_month,_day,切记,这里只是对三个成员变量进行了声明,成员变量的定义分为两种情况:

1.如果我们在构造函数体内进行成员变量的初始化操作,那么在进行初始化时,成员变量已经完成了定义,函数体内只是在进行进行变量的赋值而已。因此就这一现象我们不难产生疑问?如果在函数体内对成员变量进行赋值时,此时变量已经完成了定义,此时的赋值操作就相当于是在成员变量定义之后才对成员变量进行了初始化操作,那么对于const成员变量引用成员变量没有默认构造函数的自定义成员变量这些在定义时必须初始化的成员变量还能用这种初始化方式进行初始化吗?当然不行,此时我们就得用第二种方式进行成员变量的初始化操作。

2.如果我们使用初始化列表进行成员变量的初始化操作,就相当于是在变量定义时,对成员变量进行了初始化操作,这对于上述三种必须在定义时就必须进行初始化的成员变量而言是可行的。

相关示例代码如下:

class A {public:A(int a){_a = a;}
private:int _a;
};
class Date {public:Date(int year,int month,int day,int A):_year(year),_month(month),_day(day),_a(10),a(A),_aa(10){}
private:int _year;int _month;int _day;const int _a;int& a;A _aa;
};

重点:对于自定义类型而言,还有一个要注意的问题:当自定义类型成员变量没有默认的构造函数时,我们必须在定义时进行初始化,所以我们必须用初始化列表对其进行初始化。但是当自定义类型成员变量有默认的构造函数时,我们在定义时可以不用初始化,在定义之后初始化也可以,也就意味着有了默认构造函数的成员变量可以在构造函数的函数体内进行初始化。但是,当我们在构造函数体内对有默认构造函数的成员变量初始化时,编译器同时也默认生成了初始化列表调用了自定义成员变量的默认构造函数对其进行了初始化。所以就会存在不管自定义类型的成员变量是否存在默认的构造函数,我们都会生成初始化列表对自定义类型成员变量进行初始化,所以我们干脆让其都在初始化列表中初始化,没有默认构造函数我们自己生成初始化列表为其初始化,有默认构造函数,编译器帮助我们自动生成初始化列表完成初始化。

总结:对于内置类型的成员变量和自定义类型成员变量(有默认构造函数),在构造函数体内部和初始化列表中都可以进行初始化操作,对于const成员变量,引用成员变量,自定义类型成员变量(没有默认构造函数),我们在初始化列表中完成初始化,为了统一我们规定所有的成员变量都在初始化列表中进行初始化。

static成员

之前我们也学习过static关键字,我们知道static可以改变变量的声明周期,比如可以在局部变量之前加上static,从而使局部变量拥有了和全局变量一样的生命周期,在C++也有static关键字,那么它的作用是什么呢?

其实,C++中的static关键字的作用和我们之前学习的是一样的,同样也可以改变变量的生命周期,可以是成员变量的周期,使之属于类及所有的对象,生命周期在整个程序运行期间。

先看如下代码,当静态成员变量为public时:

class A {
public:static int _c;A(int a=1) {_a = a;}
private:int _a;
};
//静态成员变量必须在类外进行定义初始化
int A::_c = 1;int main()
{//再类外实现对静态成员变量的访问,当静态成员变量为pulbic时A a;cout << a._c << endl;cout << A::_c << endl;return 0;
}

解析:静态成员变量必须在类外进行定义初始化。当静态成员变量为public修饰时,我们在类外进行访问,可以通过对象.类::方式去访问。

 当静态成员变量用private修饰时,在类外肯定是不能访问的,所以我们必须在类内提供公共的接口去访问,先看下列代码:

class A {
public:A(int a=1) {_a = a;}//提供公共的接口,普通的成员函数void print(){cout << _c << endl;}//提供公共的接口,static静态成员函数,但是static静态成员函数没有this指针,所以不能访问非静态成员变量,只能访问静态成员变量和成员函数static void print1(){cout << _c << endl;}
private:int _a;static int _c;
};int A::_c = 3;int main()
{//在类外实现对静态成员变量的访问,当静态成员变量为private时A a;//1.通过对象.的方式去访问a.print();//2.通过类::方式去访问A::print1();return 0;
}

解析:如果是private修饰的静态成员变量,我们在类外可以通过公共的接口,即普通的成员函数和静态的成员函数进行访问,但是静态的成员函数因为没有隐藏的this指针,所以只能访问静态成员变量和成员函数,不能访问非静态成员变量。

总而言之,静态的成员函数成员变量都属于整个类和所有对象,都可以可以使用对象.类::的方式去访问。

C++11对于非静态成员变量初始化

我们在学习构造函数时,我们学写了编译器生成的默认构造函数,我们知道默认构造函数对于内置类型是不做初始化处理的,只对自定义类型进行初始化处理,为了改善这种情况,C++11发明了一种新的语法。就是给非静态成员变量声明时顺便给予缺省值。

相关代码如下:

class A
{
public:void print(){cout << a << endl;}
private:int a = 10;int* p =(int*) malloc(40);
};int main()
{A a;a.print();}

整个过程,就相当于是给自定义类型给予了缺省值,当构造函数的初始化列表没有给内置类型赋初始值时,就会使用这个初始值。

运行截图如下,我们发现内置类型确实使用了此缺省值。

友元

友元的概念:友元是一种允许非类成员函数访问类的非公友成员的一种机制,友元可以是函数或者类,通过在类中用关键字friend说明该函数或者类,使得函数或者类获得其私有和保护成员的访问权限,在函数体中访问对象的成员,必须用对象.的方式访问。

友元函数

直接看代码:

class B {friend void print(B& b);
private:int _b=666;
};void print (B& b) {cout << b._b << endl;}
int main()
{B b;print(b);
}

 运行截图如下:

注意: 1.友元函数可以访问类的私有和保护成员,但是它不是成员函数。

            2.注意const不能修饰友元函数,因为友元函数不是成员函数,const只能修饰成员                   函数。

            3.友元函数就是一种普通的函数,用一般函数调用的方式调用即可。

友元类

直接看代码:

class B {friend class A;
private:int _b=888;
};class A
{
public:void print(){cout << b._b << endl;}private:int _a = 10;B b;
};int main()
{A a;a.print();}

再类B中,直接声明,类A是类B的友元类,那么类A就可以访问类B的非公有成员,运行截图如下:

注意: 1.友元类不具有交换性,声明类A是类B的友元,但此时类B不一定是类A的友元,只有声明了类B时类A的友元类之后,两者才可以互相访问彼此的非公有成员。

            2.友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类的非公有成员。

总结 

到了这里类和对象的学习我们就可以告一段落了,类和对象细小的知识点太多,但是这些细小的知识点便是C++学习的精髓所在,望小伙伴们可以反复观看!

本期内容到此结束!^_^

相关文章:

C++之类和对象(下)

目录 初始化列表 static成员 C11对于非静态成员变量初始化 友元 友元函数 友元类 总结 初始化列表 我们知道&#xff0c;在学习构造函数时&#xff0c;我们知道对象的成员变量的初始化我们是在构造函数函数体内进行初始化的&#xff0c;还有没有其它初始化成员变量的方…...

微服务开发:断路器详解

微服务是目前业界使用的最重要的实现方面。通过使用微服务架构&#xff0c;开发人员可以消除他们以前在单体应用程序中遇到的许多问题。展望未来&#xff0c;人们开始在微服务中搜索和采用各种模式。大多数时候&#xff0c;新模式的产生是为了解决另一个模式中出现的常见问题。…...

Leetcode—383.赎金信【简单】

2023每日刷题&#xff08;五十&#xff09; Leetcode—383.赎金信 实现代码 class Solution { public:int arr[26] {0};int arr2[26] {0};bool canConstruct(string ransomNote, string magazine) {int len ransomNote.size();int len2 magazine.size();for(int i 0; i …...

爬虫-xpath篇

1.xpath的基础语法 表达式描述nodename选中该元素/从根节点选取、或者是元素和元素间的过渡//从匹配选择的当前节点选择文档中的节点&#xff0c;而不考虑它们的位置.选取当前节点…选取当前节点的父节点选取属性text()选取文本 举例&#xff1a; 路径表达式结果html选择html元…...

Oracle初始化参数文件pfile和spfile

pfile &#xff1a;Oracle 9i之前&#xff0c;ORACLE一直采用PFILE方式存储初始化参数&#xff0c;该文件为文本文件&#xff0c;可以在操作系统级别修改。当spfile文件修改出现错误导致oracle无法启动时&#xff0c;可以使用 pfile文件启动数据库 spfile&#xff1a;从Oracle…...

zookeeper 客户端常用命令简单记录(实操课程系列--watcher功能测试)(发布订阅功能测试)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09; 1、命令行工具切换到zookeeper的bin目录下面&am…...

Scrapy爬虫数据存储为JSON文件的解决方案

什么是JSON文件 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人们阅读和编写&#xff0c;同时也易于机器解析和生成。它基于JavaScript Spark语言的一个子集&#xff0c;但独立于Smashing语言&#xff0c;因此在许多中…...

计算机设计大赛 选题推荐

0 前言 比赛介绍 中国大学生计算机设计大赛是中国高等教育学会“全国普通高校大学生竞赛排行榜”竞赛之一。自2008年开赛至2019年&#xff0c;一直由教育部高校与计算机相关教指委等或独立或联合主办。2023年&#xff08;第16届&#xff09;中国大学生计算机设计大赛是由、中…...

基于springboot,vue高校图书馆管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;gradle-5.6.4 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatisred…...

如何打造更高效、安全、灵活的企业网络组网方案

随着互联网的快速发展&#xff0c;企业对于网络的需求也变得越来越高。然而&#xff0c;企业规模不断扩大&#xff0c;分布式办公越来越普遍&#xff0c;如何保证数据安全传输和网络稳定运行是每一家企业都需要面对的问题。因此&#xff0c;合理构建企业组网架构已经成为了现代…...

MATLAB Simulink +STM32硬件在环 (HIL)实现例程测试

MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试 &#x1f4cd;相关篇《STM32CubeMxMATLAB Simulink点灯程序》✨本例程没有使用到STM32CubeMX来创建工程&#xff08;在Simulink 中不是选择的STM32xxxbased类型的&#xff09;。 &#x1f516;STM32xxx…...

Kubernetes Service控制器详解以及切换为ipvs代理模式

文章目录 一、Service 存在的意义二、Pod与Service的关系三、Service定义与创建四、Service三种常用类型五、Service代理模式六、切换Service代理模式七、service总体工作流程八、kube-proxy ipvs和iptables的异同九、Service DNS名称 一、Service 存在的意义 service的引入主…...

搭建samba服务

公司内部需要文件共享&#xff0c;自建samba服务&#xff0c;满足功能 在搭建过程中&#xff0c;踩了一些坑&#xff0c;如windows无法访问、macos无法访问、账号添加、权限控制 分享一下实现过程&#xff0c;内容不详细的地方&#xff0c;可评论或私聊 前置准备 服务器 阿里…...

总结vue3 的一些知识点:MySQL 排序

MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。 如果我们需要对读取的数据进行排序&#xff0c;我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序&#xff0c;再返回搜索结果。 语法 以下是 SQL SELECT 语句使用 ORDER B…...

从零开始:PHP实现阿里云直播的简单方法!

1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前&#xff0c;首先需要在阿里云控制台中创建直播应用&#xff0c;然后获取推流地址和播放地址。 推流地址一般格式为&#xff1a; rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…...

【数据结构】——二叉树特点

前言&#xff1a;我们前面已经了解了二叉树的一些概念&#xff0c;那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种&#xff1a;前序&#xff0c;中序&#xff0c;后序。 前序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;最后右子树。 中…...

C++的类和对象(一)

目录 1、面向过程和面向对象初认识 2、为什么要有类 3、类的定义 类的两种定义方式 4、类的访问限定符 5、类的作用域 5.1 为什么要有作用域&#xff1f; 5.2类作用域 6、类的实例化 6.1类的实例化的定义 6.2类的实例化的实现 6.3经典面试题 7、类对象 7.1类对…...

基于单片机自动饮料混合机控制系统设计

**单片机设计介绍&#xff0c;基于单片机自动饮料混合机控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机自动饮料混合机控制系统设计是一个涉及多个领域的复杂项目&#xff0c;包括单片机技术、传感器技术…...

react-route-dom 实现简单的嵌套路由

最终效果 点击 to test1 点击to test2 > to test21 点击to test2 > to test22 代码如下 path: "page",element: <父组件 />,children: [{ path: "test1", element: <Test1 /> },{path: "test2",element: <Test2 />…...

万界星空科技灯具行业MES介绍

中国是LED照明产品最大的生产制造国&#xff0c;如今&#xff0c;我国初步形成了包括LED外延片的生产、LED芯片的制备、LED芯片的封装以及LED产品应用在内的较为完超为产业链&#xff0c;随着LED照明市场渗诱率的快速警升&#xff0c;LED下游应用市场将会越来越广阔。这也将推动…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...