【C++】类和对象——初始化列表和static修饰成员

首先我们来谈一下初始化列表,它其实是对于我们前边构造函数体内初始化的一种补充,换一种说法,它以后才是我们构造函数的主体部分。
我们先考虑一个问题,就是一个类里面有用引用const初始化的成员变量,比如说:
在这里插入图片描述
在构造函数中我们是不能给c和d进行赋值的,因为这两种类型只能在初始化时去赋值,在这种情况下,我们的初始化列表就有用处了
我首先写一下它的基本用法,就是语法所规定

A(int aa=1,int bb=2,int cc=3):a(aa)//初始化列表初始化,b(bb),c(cc),d(0)
{//函数体内初始化
}

这其实就是一个构造函数,两个大括号之间的就是我们之前所见过的构造函数在函数体内初始化,而上面所加的就是这里要说的初始化列表初始化,并且它们是可以混着用
下面一个问题,我如果在初始化列表不显示写(比如a成员的初始化),那么它还会不会初始化a这个成员变量?
答案是,因为初始化列表会初始化所有成员变量,即使你不写。为什么呢?我们之前是不是说过如果一个内置类型不写构造函数,它会被默认初始化为随机值,而对于一个没写构造函数的自定义类型则会去调用它的默认构造函数,这个过程实际上就是在初始化列表完成的。还有一个现象,就是我们会给成员变量缺省值,如果没有给构造函数,就会按缺省值来,这个过程也是在初始化列表完成的
除了这引用和const修饰的成员变量,还有自定义类型无默认构造或者说就算有默认构造但是我不想用给的缺省值我想自己传,这种情况需要用初始化列表,

#include<iostream>
using namespace std;
class B {
public:B(int ret1) {_ret = ret1;}
private:int _ret;
};
class A {
public:A(int aa = 1, int bb = 2, int cc = 3):a(aa)//初始化列表初始化, c(cc), d(0), r(0)
{//函数体内初始化
}
private:int a;char b;int& c;const int d;B r;
};
int main() {A a;return 0;
}

那么能不能取消掉函数体呢(就是构造函数里的大括号及里面的东西)?当然不能,函数体内可以做一些检查和初始化的工作,这是初始化列表做不了的,比如说:
在这里插入图片描述
最后要知道初始化列表初始化的顺序声明顺序
在这里插入图片描述
而不是初始化列表中写的顺序
在这里插入图片描述
下面一个例子可以证明一下
在这里插入图片描述
就是先用_b初始化_a,此时_b还是随机值,所以第一个打印随机值
请添加图片描述
下一个问题就是我们的static修饰成员,这里的成员包括成员变量和成员函数,我们先来看成员变量,
有这样一个问题,就是我们想看一下一个类创建了多少个对象,我们该怎么做呢?我们当然可以创建一个全局变量,每当调用构造函数或者拷贝构造时就让它++,这样是没问题的,但假如有多个类呢?并且这个全局变量也容易被更改。我们这时用static变量就显得很好了,下面先说一下它的声明和定义形式
在这里插入图片描述
下面我们就可以写统计一共创建了多少个对象的代码了

class A {
public:A(int ret = 1) {_a = ret;count++;}A(const A& aa) {_a = aa._a;count++;}int getcount() {return count;}
private:int _a;static int count;//声明
};
int A::count = 0;//定义
A Func() {A a;return a;
}
int main() {A a;Func();cout << a.getcount() << endl;return 0;
}

我们这里成员变量是私有的,可以给一个函数把count的值传出来,并且这个函数还有一个好处就是我们无法修改count的值
其实static修饰的成员变量可以看成专属于某个类的全局变量,用sizeof计算对象大小时也是不算static修饰的变量的大小的
下面是static修饰的成员函数,基本形式像下面这样
在这里插入图片描述

在这里插入图片描述
调用可以上面这两种方法调用,如果不用static修饰,第一种调用是不行的,并且它是没有this指针的,因为用static修饰,不管是变量还是函数都像一个专属这个类的全局的一样

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

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

相关文章

HTML_web扩展标签

1.表格标签 2.增强表头表现 4.表格属性&#xff08;实际不常用&#xff09; 结构标签&#xff1a; 合并单元格&#xff1a; 更多请查看主页

从零开始,探索Spring框架的魅力与实践

Spring 1&#xff0c;介绍1.1 为什么要学?1.2 学什么? 2&#xff0c;Spring相关概念2.1 初识Spring2.1.1 Spring家族2.1.2 了解Spring发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 spring主要内容 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2 IOC、IOC容器、Bean、DI…

影刀实例五,网页表单中多下拉框填写问题

一&#xff0c;背景 网页表单中&#xff0c;经常有这样一个场景&#xff0c;填写籍贯.并且是以三个下拉框表示&#xff0c;分别代表省&#xff0c;市&#xff0c;县.并且都是非标准的&#xff0c;不能直接使用影刀内置命令.常规思路是&#xff1a;分别处理省&#xff0c;市&…

万能的视频格式播放器

今天博主给大家带来一款“万能”的视频播放器——VLC Media Player&#xff0c;支持的文件格式非常多&#xff0c;大家快来一起看看吧&#xff01; VLC Media Player 是一款可播放大多数格式&#xff0c;而无需安装编解码器包的媒体播放器。可以播放 MPEG-1、MPEG-2、MPEG-4、D…

C语言-指针_02

指针-02 1. 指针的指针 概念&#xff1a;指针变量中存储的是指针的地址&#xff0c;又名 二维指针 语法&#xff1a; 数据类型 **p;示例&#xff1a; #include <stdio.h> int main(int argc, char const *argv[]) {int num 10;int *p1 &num;int **p2 &p1…

深度学习——第1章 深度学习的概念及神经网络的工作原理

1.1 序言——探索智能机器 千百年来&#xff0c;人类试图了解智能的机制&#xff0c;并将它复制到思维机器上。 人类从不满足于让机械或电子设备帮助做一些简单的任务&#xff0c;例如使用滑轮吊起沉重的岩石&#xff0c;使用计算器做算术。 人类希望计算机能够自动化执行更…

医美店会员管理系统预约小程序作用是什么

医美在美业中占据着一定地位&#xff0c;爱美使然和经济独立、悦己消费下&#xff0c;不少女性会前往医美机构做脸部整容、嫩肤补水等服务&#xff0c;如美容院一样都是具备本地外地属性的&#xff0c;因此在如今互联网盛行下&#xff0c;商家需要借势线上破解难题及增强生意效…

【预测工具】不须编码的预测和数据可视化工具

有一天&#xff0c;我的同事问我&#xff0c;他应该如何做一个快速预测模型而不是Excel&#xff0c;并产生比线性回归或Excel图中的那些简单方程更好的结果。这是我的答案。 TableCurve 2D (Image by author) Sigmaplot很早以前就推出了这个软件。它已被广泛用于在数据中寻找最…

Structured Streaming: Apache Spark的流处理引擎

欢迎来到我们的技术博客&#xff01;今天&#xff0c;我们要探讨的主题是Apache Spark的一个核心组件——Structured Streaming。作为一个可扩展且容错的流处理引擎&#xff0c;Structured Streaming使得处理实时数据流变得更加高效和简便。 什么是Structured Streaming&#…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、springboot分层架构、IDEA修改快捷键、vue代码风格

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(2)后端跨域、登录模块、sp…

python 图书馆选座小程序源码

开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索房间&#xff0c;轮播图&#xff0…

wordpress安装之Linux解压缩安装

本次教程是为了让大家少走弯路&#xff0c;可以更直观的去认识我们不懂的知识面。 首先我们安装解压缩的软件 命令如下&#xff1a; yum install -y unzip 上一篇我们讲到传输文件了 这篇我们把传输过来的压缩包解压并进行安装。follow me&#xff01; 我们输入命令 unzi…

FDM3D打印系列——天秤座黄金圣斗士模型制作全过程视频

FDM打印天秤座黄金圣斗士全过程视频 大家好&#xff0c;我是阿赵。   这次带来的是天秤座黄金圣斗士模型的3D打印加后期加工的全过程。其实打印的过程之前都已经介绍过了&#xff0c;不过有朋友说想实际看看整个制作过程是怎样&#xff0c;所以我录了这个视频。   上完色之…

测试Centos上用Gunicorn启动的Django-Web服务在Django源文件有改变的情况下能否自动重载最新源码下的web服务

01-先上传最新的源码文件 参考博文 https://blog.csdn.net/wenhao_ir/article/details/134762966 进行 02-先在Django直接开web服务下修改源码测试 这是没有问题的&#xff0c;会自己重置。 03-开启gunicorn服务 cd /djangoproject/mmdj01/ gunicorn -c /djangoproject/mm…

【开源】前后端分离的在线考试系统,支持多种部署方式

在线考试系统 https://download.csdn.net/download/mo3408/88593116 在线考试系统是一种利用网络技术&#xff0c;实现在线出题、答题、阅卷、成绩查询等一系列考试活动的系统。它不受地理位置限制&#xff0c;可以实现远程考试&#xff0c;大大提高了考试的效率和便利性。此…

Spring MVC学习随笔-控制器(Controller)开发详解:接受客户端(Client)请求参数

学习视频&#xff1a;孙哥说SpringMVC&#xff1a;结合Thymeleaf&#xff0c;重塑你的MVC世界&#xff01;&#xff5c;前所未有的Web开发探索之旅 第三章、SpringMVC控制器开发详解 3.1 核心要点 &#x1f4a1; 1. 接受客户端&#xff08;client&#xff09;请求参数[讲解] 2…

Docker的数据持久化;Docker网络;Dockerfile编写

Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b; 文章目录 Docker的数据持久化&#xff1b;Docker网络&#xff1b;Dockerfile编写&#xff1b;**Docker的数据持久化**1&#xff09;将本地目录映射到容器里2&#xff09;数据卷3&#xff09;将…

ARM架构安装RabbitMQ

1.查看centos内核版本 uname -a uname -r2.安装之前的准备工作 安装RabbitMQ必装Erlang(RabbitMQ官网添加链接描述) 2.1.Erlang简介 Erlang是一种通用的面向并发的编程语言&#xff0c;它由瑞典电信设备制造商爱立信所辖的CS-Lab开发&#xff0c;目的是创造一种可以应对…

Qt将打印信息输出到文件

将打印信息&#xff08;qDebug、qInfo、qWarning、qCritial等&#xff09;输出到指定文件来以实现简单的日志功能。 #include "mainwindow.h" #include <QApplication> #include <QLoggingCategory> #include <QMutex> #include <QDateTime>…

【Pytorch】Visualization of Feature Maps(4)——Saliency Maps

学习参考来自 Saliency Maps的原理与简单实现(使用Pytorch实现)https://github.com/wmn7/ML_Practice/tree/master/2019_07_08/Saliency%20Maps Saliency Maps 原理 《Deep Inside Convolutional Networks: Visualising Image Classification Models and Saliency Maps》&…