【C++初阶】类和对象(下)再谈构造函数、static成员、C++11的成员初始化新玩法、友元类、内部类

news2025/1/17 2:57:54

文章目录

  • 再谈构造函数
  • static成员
  • C++11的成员初始化新玩法
  • 友元类
  • 内部类

再谈构造函数

1.构造函数体赋值
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。
在这里插入图片描述
在这里插入图片描述
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。
2.初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
在这里插入图片描述
注意
2.1 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
在这里插入图片描述
在这里插入图片描述
2.2 类中包含以下成员,必须放在初始化列表位置进行初始化:
a. const修饰的成员变量
在这里插入图片描述

在这里插入图片描述
我们以前学过,const修饰的变量在定义后是,不能修改的,只能在定义的时候进行赋值,所以只能在初始化列表初始化。

在这里插入图片描述
在这里插入图片描述
b. 引用成员变量
在这里插入图片描述
在这里插入图片描述
修改后
在这里插入图片描述

在这里插入图片描述
c. 自定义类型成员变量(该类没有默认构造函数
在这里插入图片描述
在这里插入图片描述
修改后
在这里插入图片描述
在这里插入图片描述
2.3尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化

2.4.成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
下面我们来看一道例题
在这里插入图片描述
A. 输出1 1
B.程序崩溃
C.编译不通过
D.输出1 随机值
相信在看过第4点后大家都知道应该选什么,没错就是选D,大家如果没学过第四点肯定有大部分人会想选A。
3. explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。
在这里插入图片描述
我们在这里可以看到d1和d2两种构造方式,其实第二个是赋值构造,其中发生了隐式转换。它先把2022隐式转换成临时日期类,再把临时日期类赋值给d2.
而要避免这种情况得发生就要用explicit关键字来限制它。
在这里插入图片描述
在这里插入图片描述

static成员

概念
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态的成员变量一定要在类外进行初始化
在这里插入图片描述
在这里插入图片描述
下面我们来看一道牛客网的有关真题
在这里插入图片描述
这题本来是很简单的,但是因为限制了很多都方法,所以我们肯能会无从下手,其实这里我们运用到了一个巧解。
在这里插入图片描述
在这里插入图片描述
本题牛客网链接
大家有兴趣也可以再试试看有没有其它方法
总结

  1. 静态成员为所有类对象所共享,不属于某个具体的实例
  2. 静态成员变量必须在类外定义,定义时不添加static关键字
  3. 类静态成员即可用类名::静态成员或者对象.静态成员来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员和类的普通成员一样,也有public、protected、private3种访问级别,也可以具有返回值

C++11的成员初始化新玩法

C++11支持非静态成员变量在声明时进行初始化赋值,但是要注意这里不是初始化,这里是给声明的成员变量缺省值。
在这里插入图片描述
在这里插入图片描述
如果初始化了类,便不会给成员变量缺省值
在这里插入图片描述
在这里插入图片描述

友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
友元关系是单向的,不具有交换性。

比如Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量
在这里插入图片描述
但想在Time类中访问Date类中私有的成员变量则不行。
在这里插入图片描述
在这里插入图片描述
友元关系不能传递
如果B是A的友元,C是B的友元,则不能说明C时A的友元。

内部类

概念
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。
特性:
1.内部类可以定义在外部类的public、protected、private都是可以的。
2. 注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。
在这里插入图片描述
在这里插入图片描述

3 sizeof(外部类)=外部类,和内部类没有任何关系。
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

客户管理系统如何提升体验

数字化时代,客户与企业交互的触点爆炸式增长,客户体验正从单一触点走向端到端旅程。众多的产品、海量的数据,导致客户对体验的要求越来越多......CRM客户管理系统是企业提升客户体验的有效工具,它不仅可以帮助您进一步了解客户&am…

App自动化之dom结构和元素定位方式(包含滑动列表定位)

先来看几个名词和解释: dom: Document Object Model 文档对象模型dom应用: 最早应用于html和js的交互。界面的结构化描述, 常见的格式为html、xml。核心元素为节点和属性xpath: xml路径语言,用于xml 中的节点定位,XPath 可在 xml…

javaSE - 三个常用的接口(Comparable,Comparator,Cloneable)

1、Comparable 英 [ˈkɒmpərəbl] 美 [ˈkɑːmpərəbl] 可比较的;可比的;可比性;可比;可比较   2、Comparator 美 [kəmˈpɜrətər] n. 比较器,比色器,比较电路,比长仪,场强计 3、 Cloneable 可复制的 一、Comparable …

MySQL性能优化浅析

1. 硬件 1.1 CPU IO密集型,提升CPU核心数 计算密集型,提升CPU频率 1.2 磁盘 机械硬盘在随机访问时,由于受磁针移动速度的限制,性能会大幅降低。使用固态硬盘可以大幅提升随机访问的能力。按需选择。 1.3 其他 带宽、内存频…

Superset 安装配置

文章目录Superset 安装配置一、Superset 概述1. Superset简介2. 功能概述3. 支持的数据库二、Superset 环境部署步骤三、创建虚拟机,安装CentOS1.下载CentOS2.创建虚拟机3.编辑虚拟机设置4.安装centos7.9mini版本5.启动centos,并进行登录四、CentOS配置1…

小米(Android)刷NetHunter安装指南

一、安装NetHunter 前提:确保手机已经root,已装上magisk。如果没有root,可用尝试magisk root 后执行此文 1、下载Nethunter:Get Kali | Kali Linux 然后push 到sdcard 里, 2、打开magisk,选择刚刚下好的…

Windows下安装libtorch与Clion配置

Windows 安装和使用libtorch 1.下载libtorch libtorch的下载链接,如下图所示,libtorch有release和debug版本可以选择。为了方便调试,下debug版。电脑上没CUDA,下次有需要再更新吧。 2.libtorch使用 在Visual Studio的使用可以参…

云原生周刊 | 让 ChatGPT 以电子邮件的方式来解释 KubeSphere

过去的一周是 ChatGPT 的狂欢,我猜每一位云原生玩家都很好奇他是如何看待 Kubernetes 的。咱们不防换个方式来提问,让它使用电子邮件的方式来向别人推荐 KubeSphere 和 OpenFunction。 开源项目推荐 Tailscale Ingress Controller 这是针对 Tailscale …

【DevOps实战系列】第七章:详解Docker私服Harbor篇

个人亲自录制全套DevOps系列实战教程 :手把手教你玩转DevOps全栈技术 Harbor私服搭建 讲完Nexus3再来看下harbor,其实大同小异,只不过harbor的管理要比Nexus3更专业、功能更完善,大家按需选择即可,Nexus的优势是他能和…

web网站工程项目前期需求分析与规划怎么写?

在当下,判断一份网站工程项目文档是否优秀,项目目录是最直接的体现,同时,工程说明、需求分析和项目规划各版块的内容都缺一不可。工欲善其事必先利其器,前期准备得越充分,后期就会越顺利。 本期&#xff0c…

Centos7安装图形化界面并使用Windows远程桌面连接(包含离线部署)

一、在centos7 中部署远程桌面所使用的程序 1、关闭防火墙和selinux(xrdp是通过3389端口远程桌面连接 ) [rootlocalhost ~]# systemctl stop firewalld #临时关闭防火墙 [rootlocalhost ~]# systemctl disable firewalld.service #永久关闭防火墙 [rootlocalhost ~]# setenf…

SpringMVC:SpringMVC之JSON数据传输参数(5)

JSON数据传输参数1 JSON数据传输参数2 JSON普通数组3 JSON对象数据4 JSON对象数组5 小结1 JSON数据传输参数 现在比较流行的开发方式为异步调用。前后台以异步方式进行交换,传输的数据使用的是JSON,所以前端如果发送的是JSON数据,后端该如何接收? 对于…

面试官:单体架构怎么向分布式微服务架构演变的?(8000字干货)

随着网站规模越来越大,单体应用往往很难再满足要求,就需要向分布式,微服务架构演变。 那么这个演变过程是怎么样的呢?都涉及到哪些组件,会遇到哪些问题,以及相应的解决方案都是什么,本篇文章就…

ESP 低功耗入门

此篇博客以 ESP32 为例来说明 ESP 的睡眠模式。 ESP32 芯片可以大致分成以为五个模块: RF 模块,也就是射频模块,用于蓝牙 / Wi-Fi 的收发(TX / RX)功能。CPU,如 Xtensa 内核 (ESP32 / ESP32-S2 / ESP32-S3),RISC-V 内…

ssm项目-商城管理系统

1 逆向工程设计 1.1 xml文件配置&#xff08;generatorConfig.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"&q…

滑动窗口的最大值【滑动窗口问题】

文章目录题目解题思路代码展示题目 给定一个长度为 n 的数组 num 和滑动窗口的大小 size &#xff0c;窗口从最左边滑动到最右边&#xff0c;每次向右边滑动一个位置&#xff0c;找出所有滑动窗口里数值的最大值。 窗口大于数组长度或窗口长度为0的时候&#xff0c;返回空 数…

硬件需知知识 -- 基本元件(电阻)

一、电阻 1.1 贴片电阻 1.1.1 贴片电阻的封装大小是和功率时相关的。 封装大小功率(W)0201120\frac{1}{20}201​0402116\frac{1}{16}161​0603110\frac{1}{10}101​080518\frac{1}{8}81​12060.2518120.5或1201012\frac{1}{2}21​25121或者21.1.2 贴片电阻读数 贴片电阻的读数…

Spring Security 竟然可以同时存在多个过滤器链?

目录Spring Security 中的过滤器多个过滤器链多个过滤器链配置例子http.authorizeRequests() 开头是什么意思&#xff1f;引用Spring Security 中的过滤器 Spring Security 中认证、授权功能的实现机制是通过过滤器来实现的。Spring Security 中一共提供了 32 个过滤器&#x…

Nacos集群版本安装(三)

一、前言 注&#xff1a;我这里的nacos集群安装环境使用的是本地MacOs系统&#xff0c;使用的是同一个IP不同端口&#xff0c;这里就不再讲解具体的目录结构之内的了&#xff0c;下面我们开始演示具体的配置和安装。了解nacos单机版本安装 二、nacos集群安装部署&#xff1a; …

Redis常见面试题(二)

目录 1、Redis和Memcached有什么区别? 2、Redis支持哪些数据类型? 3、Redis支持JSON数据类型吗?为什么? 4、Redis模块系统有什么用? 5、Redis支持对象映射模型吗? 6、Redis默认支持多少个数据库?怎么修改? 7、Redis SET命令可以代替SETNX吗? 8、Redis单个实例最…