【C++的类与对象(下)】

目录

  • 一、细说构造函数
    • 1.1初始化列表的引入
    • 1.2初始化列表
    • 1.2关键字explicit
  • 二、static成员
    • 2.1static成员的特性
    • 2.2题目:实现一个类,计算程序中创建出了多少个类对象
    • 2.3题目:设计一个类 只能再栈上或者堆上创建

一、细说构造函数

1.1初始化列表的引入

我们都知道构造函数的作用是在创建对象的时候给对象的成员属性赋值。
那么下面的场景可以用构造函数进行赋值吗?

#include<iostream>
using namespace std;
class example1
{
public:
	//可以这么写吗?  编译器能通过吗?
	example1(int i, int j)
	{
		x = i;
		j = y;
	}
private:
	const int x;
	int& y;
};
int main()
{
	return 0;
}

答案是不可以的。编译器也不支持这么胡搞。
在这里插入图片描述
首先要知道为什么不可以这么写。
在这里插入图片描述
为了解决上面不能使用构造函数来初始化的场景,所以就引入了初始化列表这个概念。可以通过初始化列表来完成初始化。比如:
在这里插入图片描述

1.2初始化列表

初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。
注:

  1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
  2. 类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量、 const成员变量、自定义类型成员(且该类没有默认构造函数时)
    怎么理解上面被加粗的这段话呢?
    之前在C++类和对象(上)说过默认构造函数会对内置类型不做处理对自定义类型会调用其默认构造函数。这句话准确的来讲是在初始化列表会调用自定义类型的默认构造函数。如图:
    在这里插入图片描述
    那如果example2没有默认构造函数呢?我的意思是你重载了一个有参构造函数、或者说你重载了两个有参构造函数,此时默认构造函数就失效了,而编译器又不知道你调用的有参构造函数的参数是多少,所以编译器不能帮你调用有参构造函数,所以就会报错。
    在这里插入图片描述
  3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。
  4. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。这个比较坑,稍不留神都不知道自己错在哪里。比如:
    在这里插入图片描述
    初始化列表顺序是从_arr开始,而_arr需要使用_capacity来初始化,慢慢的开始离谱了。

1.2关键字explicit

这个是4/6级词汇。顺带复习一下。
explicit:adj 清楚的、明确的、易于理解的。
explicitness:n 直言不讳、明确性
explicitly:adv 清楚明确地
在了解explicit这个关键字的作用之前先看看这个代码:
在这里插入图片描述
这么写为什么不会报错呢?这个代码不符合我们对类的常规认识呀。
其实这里发生了隐式类型转换。具体如下:
在这里插入图片描述
这里再补充一个奇葩的写法。如下:
在这里插入图片描述
说明如下:
在这里插入图片描述
那如果你不想发生隐式类型转换怎么办呢?就需要用到关键字explicit 这个英文含义是直接了当的,不需要隐式类型转换这个含糊不清的东西。比如:
在这里插入图片描述

二、static成员

2.1static成员的特性

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。
特点:

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

2.2题目:实现一个类,计算程序中创建出了多少个类对象

代码:

#include<iostream>
using namespace std;
class example
{
public:
	example()
	{
		num++;
	}
	static int GetNum()
	{
		return num;
	}
private:
	static int num;
};
int example::num = 0;
void test()
{
	for (int j = 0; j < 10; j++)
	{
		example ex;
	}
}
int main()
{
	for (int i = 0; i < 10; i++)
	{
		example ex;
	}
	test();
	cout << example::GetNum() << endl;
	return 0;
}

**补充:**非静态成员函数可以调用静态成员函数,而静态成员函数不可以调用非静态成员函数。
为什么呢?解释如下:
刚刚上面说过了静态成员函数不能访问非静态成员变量。如果一个非静态成员函数A进行了对非静态成员函数的访问,那么此时你用静态成员函数B再去访问非静态成员函数A不就相当于完成了对非静态成员的访问了?那么就矛盾了。

2.3题目:设计一个类 只能再栈上或者堆上创建

#include<iostream>
using namespace std;
class example
{
public:
	static example GetObjectInStack()
	{
		example ex;
		return ex;
	}
	static example* GetObjectInHeap()
	{
		return new example;
	}
private:
	example()
	{}
};
int main()
{
	example ex1 = example::GetObjectInStack();
	example* ex2 = example::GetObjectInHeap();
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

buuctf8

目录 crypto 摩丝 password 变异凯撒 Quoted-printable Rabbit web [护网杯 2018]easy_tornado [HCTF 2018]admin misc 被劫持的神秘礼物​编辑 crypto 摩丝 下载文件&#xff0c;得到一串摩斯密码 在线解码 password 下载文件 张三英文zs&#xff0c;加上生日&a…

【语义分割】标注工具ISAT with segment anything介绍

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 极速分割标注工具 1. 正文 1.1 安装 创建虚拟环境 conda create -n ISAT_with_segment_anything python3.8 conda activate ISAT_with_segment_anyt…

前端011_标签模块_列表功能

标签模块_列表功能 1、需求分析2、Mock添加数据列表模拟接口3、Api调用接口4、列表模版5、分页查询实现1、需求分析 标签模块主要文章标签进行管理,类别和标签的关系是一对多,一个类别下面存在多个标签。 首先开发模块中的列表功能,包含数据列表、分页。 2、Mock添加数据…

记录--前端实现点击选词功能

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 今天有一个需求&#xff0c;点击选中某个英文单词&#xff0c;然后对这个单词做一些处理&#xff0c;例如高亮背景、查看一些详细信息等等&#xff0c;今天简单实现了一下&#xff0c;效果如下&#x…

性能测试的核心原理

性能测试的核心原理 1 基于协议&#xff0c;前后端交互机制&#xff0c;性能核心。基于界面决定和前端用户交互&#xff0c;基于代码决定了后端。 1 网络分布式架构。 2 单机应用&#xff0c;比如安安兔&#xff0c;鲁大师。主要判断io读写&#xff0c;以及对资源的消耗。 2 多…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法&#xff1a;使用chroot定制系统&#xff0c;但有时候我们想自定义的安装包不在上游的仓库源中&#xff0c;在我们本地应该怎么办呢&#xff1f;如果我们将deb包拷贝到iso目录再安装有点过于麻烦了&#xff0c;而且还可能需要手动处理…

GPT-4的免费使用方法分享

目录 方法1&#xff1a;使用Ora.sh的LLM应用 方法2&#xff1a;使用https://steamship.com 方法3&#xff1a;使用https://nat.dev 方法4&#xff1a;http://tdchat.vip 方法5&#xff1a;使用Poe网站或App 方法6&#xff1a;使用 Opencat App 方法7:使用https://Huggin…

基于git的开发规范总结

文章目录 各分支命名规范gitee基本开发流程及定义gitflow工作流gitflow工作流常用分支主要工作流程命名规则gitflow工作流程图 Git分支开发管理策略主分支Master开发分支DevelopGit创建Develop分支的命令&#xff1a;将Develop分支发布到Master分支的命令&#xff1a; 临时性分…

潍坊这一城市商业综合体有奖征名

云创金谷项目商业购物中心名称及IP形象征集开始啦&#xff01;&#xff01;你有什么好想法&#xff1f;快来参与吧&#xff01;&#xff01; 云创金谷&#xff0c;是奎文区重点打造的城市更新代表力作&#xff0c;位于文化路以东、新华路以西&#xff0c;北宫街以北、卧龙东街以…

前端开发代码规范工具

规范化是前端工程化的一个重要部分。现在&#xff0c;有许多工具能够辅助我们实行代码的规范化,比如你一定知道的 ESLint 和 Prettier。 今天&#xff0c;来聊聊这些工具的工作原理和基本使用&#xff0c;了解它们是如何发挥作用的&#xff0c;以及如何更好地利用这些工具去规…

Nginx介绍

文章目录 Nginx介绍与apahche区别联系反向代理负载均衡动静分离 Docker安装nginx拉取镜像配置nginx测试nginxNginx配置详解 Nginx介绍 Nginx (“engine x”)是一个高性能的HTTP和反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上Nginx的并…

Linux权限划分的原则

考察的不仅是一个具体的指令&#xff0c;还考察对技术层面的认知。 如果对 Linux 权限有较深的认知和理解&#xff0c;那么完全可以通过查资料去完成具体指令的执行。更重要的是&#xff0c;认知清晰的程序员可以把 Linux 权限管理的知识迁移到其他的系统设计中。 权限抽象 一…

LeetCode之回溯算法

文章目录 思想&框架1.组合/子集和排列问题2.组合应用问题 组合/子集问题1. lc77 组合2. lc216 组合总和III3. lc39 组合总和4. lc40 组合总和II5. lc78 子集6. lc90 子集II 排列1. 全排列I2. 全排列II 组合问题的应用1.lc17 电话号码的字母组合2.lc131 分割回文串3. lc19 复…

《编程思维与实践》1070.复数幂

《编程思维与实践》1070.复数幂 题目 思路 思路比较简单,就是细节比较繁琐: ( a b i ) ( c d i ) ( a c − b d ) ( a d b c ) i (abi)(cdi)(ac-bd)(adbc)i (abi)(cdi)(ac−bd)(adbc)i , 利用该公式分实部和虚部进行计算结果即可. 由于涉及加减和正负号,所以在大整数结构…

致力于中小企业JavaEE企业级快速开发平台、后台框架平台

一、开源项目简介 J2eeFAST 是一个 Java EE 企业级快速开发平台&#xff0c; 致力于打造中小企业最好用的开源免费的后台框架平台 。系统基于&#xff08;Spring Boot、Spring MVC、Apache Shiro、MyBatis-Plus、Freemarker、Bootstrap、AdminLTE&#xff09;经典技术开发&…

亲测好用|甲方、专家和领导,用三维模型汇报方案如何投其所好?

身为设计方的你&#xff0c;有没有这样的经历&#xff1a; ➤ 一个非常优秀的方案未能被甲方采纳&#xff0c;反而甲方选择了一个不如自己的方案&#xff0c;造成了很大的遗憾&#xff1b; ➤ 在讲述自己的设计方案的时候&#xff0c;经常越说越散&#xff0c;甚至到了最后自…

应用在虚机和容器场景下如何优雅上下线

在生产场景中部署的服务提供者常因业务升级或其他场景需要下线和上线的部署操作&#xff0c;本文总结了应用在上下线过程中会遇到的典型问题&#xff0c;并思考在虚机和容器场景该如何处理这些问题&#xff0c;规避该过程中可能出现的服务消费者的请求失败&#xff0c;实现应用…

springboot文件上传

1.新建文件上传页面 在static目录中新建upload-test.html&#xff0c;上传页面代码如下所示&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>springboot文件上传测试</title> <…

mysql数据库的库操作 --2

目录 库操作 2.1&#xff1a;数据库的查看与创建与使用 2.2&#xff1a;字符集和效验规则 2.3&#xff1a;修改和删除数据库 2.4&#xff1a;数据库的备份和恢复 2.5&#xff1a;查看连接情况 库操作 2.1&#xff1a;数据库的查看与创建与使用 2.1.1&#xff1a;数据库…

Redis 持久化

文章目录 1. Redis 持久化2. RDB2.1 自动触发2.2 手动触发2.3 RDB 优点2.4 RDB 缺点2.5 RDB 文件修复2.6 总结 3. AOF3.1 AOF持久化工作流程3.2 AOF 缓冲区三种写回策略3.3 AOF 优点3.4 AOF 缺点3.5 AOF 重写机制3.6 AOF 重写原理3.7 总结 4. 混合持久化5. 纯缓存模式 1. Redis…