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下游应用市场将会越来越广阔。这也将推动…...
16进制字符串转字符串
一、浏览器上 function hexToUtf8(hexString) {const hexArray hexString.match(/.{1,2}/g) || [];const uint8Array new Uint8Array(hexArray.map(hex > parseInt(hex, 16)));const textDecoder new TextDecoder(GB2312); //可以切换字符编码return textDecoder.decode…...
pymysql.err.InternalError: (1054, “Unknown column ‘nan‘ in ‘field list‘“
记录在本地环境通过,然后在云环境,解决问题的过程; 最近两天遇到一个bug,具体就是在本地Pyhon环境运行成功,但是当放在云服务跑的时候,去屡屡报错,具体报错信息如下: pymysql.err.I…...
SQL 错误 [1476] [22012]: ORA-01476: 除数为 0
Oracle sql 语句 添加判断,如果分母为0,则查询结果为0,如果分母不为0,则返回查询结果 你可以使用条件表达式来实现这个要求。以下是一个示例的Oracle SQL查询语句,其中添加了判断条件来处理分母为0的情况:…...
go语言项目的目录结构
Golang 的项目目录结构并没有一个强制的标准,但社区中形成了一些共识和最佳实践,以便更好地组织和管理代码。以下是一个典型的 Golang 项目目录结构示例: /myproject ├── /cmd | ├── /app | | └── main.go | …...
Android : DataBinding 简化开发 简单应用
1.导包 ViewModel 用于观察数据 // 使用androidx版本库 ViewModelProviders implementation androidx.lifecycle:lifecycle-extensions:2.1.0-alpha032.在build.gradle 添加 在android 代码块中添加 复制后点更新(Sync Now) android{...// 步骤1.开启…...
计算机网络:应用层(下篇)
文章目录 前言一 、电子邮件(Email)1.邮件服务器2.SMTP[RFC 2821]3.邮件报文格式4.邮件访问协议 二、DNS(域名系统)1.DNS的历史2.DNS总体思路和目标(1)问题1:DNS名字空间(2ÿ…...
干货分享 | TSMaster小程序启动和停止的自动化控制流程
在实际应用场景中,用户常常需要按一定逻辑和时序来控制TSMaster内置功能模块的启动和停止,TSMaster软件内置有C/Python小程序和图形程序,开发者可以通过编程对这些模块的运行进行精确控制。本文将重点和大家分享一下如何通过C代码来控制TSMas…...
AI视频智能分析识别技术的发展与EasyCVR智慧安防视频监控方案
随着科技的不断进步,基于AI神经网络的视频智能分析技术已经成为了当今社会的一个重要组成部分。这项技术通过利用计算机视觉和深度学习等技术,实现对视频数据的智能分析和处理,从而为各个领域提供了广泛的应用。今天我们就来介绍下视频智能分…...
外包干了2个月,技术倒退2年。。。
先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…...
书-用数组存储高于60低于70的人单独存起来
#include<stdio.h> # define N 10 //书-用数组存储高于60低于70的人单独存起来 int main(){float s[N]{68.2,62.3,63.4,34.5,45.6,56.7,67.8,78.9,89.0,100};int i;float diyu[100];int j0;for(i0;i<N;i){if(s[i]>60 && s[i]<70)diyu[j]s[i];//这里的范…...
企业网站建设模板多少钱/seo推广方案怎么做
构造函数 C中的类可以定义与类名相同的特殊成员函数,这种函数叫构造函数 构造函数在定义时可以有参数或没有参数 没有任何返回类型的声明 析构函数 C中的类可以定义一个特殊的成员函数清理对象,叫析构函数 语法:~calssname() 析构函数没有任…...
甘肃做网站多少钱/设计网站
本节书摘来自异步社区《现代体系结构上的UNIX系统:内核程序员的对称多处理和缓存技术(修订版)》一书中的第2章,第2.4节,作者:【美】Curt Schimmel著,更多章节内容可以访问云栖社区“异步社区”公…...
深圳盐田建设交易中心网站/优化推广公司哪家好
第4章 类和接口 类和接口是Java程序设计语言的核心,它们也是Java语言的基本抽象单元。Java语言提供了许多强大的基本元素,供程序员用来设计类和接口。 13. 使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于…...
有没有做废品的网站/个人代运营一般怎么收费
这里主要是用户名与密码的判断:先用sharedpreferences方式存储数据,包含用户名和密码:username,password然后在登录的时候进行判断:代码如下:String name et_username.getText().toString(); String passw…...
深圳市住房和城乡建设委员会网站/网上卖产品怎么推广
2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 花间小酌 :分享Delacey的单曲《Dream It Possible》--今日循环的歌曲 《Dream It Possible》- Delacey 手机党少年们…...
网页制作与网站建设实战大全/上海网络推广营销策划方案
施工图纸是建造房屋的依据,是“工程的语言”,它明确规定了要建造一幢什么样的建筑,并且具体规定了形状、尺寸、做法和技术要求。除了较多地接触本工种的图纸外,有时还要结合整个工程图纸看图,才能交圈配合,…...