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对于非静态成员变量初始化 友元 友元函数 友元类 总结 初始化列表 我们知道,在学习构造函数时,我们知道对象的成员变量的初始化我们是在构造函数函数体内进行初始化的,还有没有其它初始化成员变量的方…...

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

Leetcode—383.赎金信【简单】
2023每日刷题(五十) 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选中该元素/从根节点选取、或者是元素和元素间的过渡//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置.选取当前节点…选取当前节点的父节点选取属性text()选取文本 举例: 路径表达式结果html选择html元…...
Oracle初始化参数文件pfile和spfile
pfile :Oracle 9i之前,ORACLE一直采用PFILE方式存储初始化参数,该文件为文本文件,可以在操作系统级别修改。当spfile文件修改出现错误导致oracle无法启动时,可以使用 pfile文件启动数据库 spfile:从Oracle…...

zookeeper 客户端常用命令简单记录(实操课程系列--watcher功能测试)(发布订阅功能测试)
本系列是zookeeper相关的实操课程,课程测试环环相扣,请按照顺序阅读测试来学习zookeeper。阅读本文之前,请先阅读----zookeeper 单机伪集群搭建简单记录(实操课程系列) 1、命令行工具切换到zookeeper的bin目录下面&am…...

Scrapy爬虫数据存储为JSON文件的解决方案
什么是JSON文件 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人们阅读和编写,同时也易于机器解析和生成。它基于JavaScript Spark语言的一个子集,但独立于Smashing语言,因此在许多中…...
计算机设计大赛 选题推荐
0 前言 比赛介绍 中国大学生计算机设计大赛是中国高等教育学会“全国普通高校大学生竞赛排行榜”竞赛之一。自2008年开赛至2019年,一直由教育部高校与计算机相关教指委等或独立或联合主办。2023年(第16届)中国大学生计算机设计大赛是由、中…...

基于springboot,vue高校图书馆管理系统
开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:gradle-5.6.4 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatisred…...
如何打造更高效、安全、灵活的企业网络组网方案
随着互联网的快速发展,企业对于网络的需求也变得越来越高。然而,企业规模不断扩大,分布式办公越来越普遍,如何保证数据安全传输和网络稳定运行是每一家企业都需要面对的问题。因此,合理构建企业组网架构已经成为了现代…...

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

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

搭建samba服务
公司内部需要文件共享,自建samba服务,满足功能 在搭建过程中,踩了一些坑,如windows无法访问、macos无法访问、账号添加、权限控制 分享一下实现过程,内容不详细的地方,可评论或私聊 前置准备 服务器 阿里…...
总结vue3 的一些知识点:MySQL 排序
MySQL 排序 我们知道从 MySQL 表中使用 SQL SELECT 语句来读取数据。 如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。 语法 以下是 SQL SELECT 语句使用 ORDER B…...

从零开始:PHP实现阿里云直播的简单方法!
1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前,首先需要在阿里云控制台中创建直播应用,然后获取推流地址和播放地址。 推流地址一般格式为: rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…...

【数据结构】——二叉树特点
前言:我们前面已经了解了二叉树的一些概念,那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种:前序,中序,后序。 前序:先根节点,再左子树,最后右子树。 中…...

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

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

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

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...