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

news2024/9/21 22:33:06

目录

  • 一、细说构造函数
    • 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;
}

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

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

相关文章

【A、B、C、D、E类IP地址划分依据,你都会吗?】

IP 地址的格式&#xff1a;IP 地址 网络地址 主机地址 如果 IP 进行了子网划分&#xff1a; 则IP地址网络地址子网地址主机地址 网络地址是互联网上的节点在网络中具有的逻辑地址。MAC 地址&#xff0c;处于数据链 路层&#xff0c;IP 地址处于网络层&#xff0c;端口号处…

考研数据结构--树和二叉树(1)

树和二叉树 文章目录 树和二叉树树定义形式化定义递归定义 树的&#xff08;逻辑&#xff09;表示树形表示法文氏图表示法凹入表示法括号表示法 树的基本术语1. 结点的度与树的度2. 分支结点与叶结点3. 路径与路径长度4. 孩子结点、双亲结点和兄弟结点5. 子孙结点和祖先结点6. …

搭建web服务器

目录标题 搭建web服务器&#xff0c;并显示Redhat测试界面linux主机作为服务器部署web服务程序 Apache http server&#xff08;httpd&#xff09;当前主机启动该服务程序关闭防火墙和selinux 客户端 搭建网站创建自拟定网页文件linux主机作为服务器部署web服务器程序当前主机启…

Qt配置glfw库(Windows)

文章目录 一、下载glfw二、配置2.1、创建Qt工程2.2、移植库文件2.3、导入库到Qt工程2.4、添加OpenGL库2.5、测试代码 一、下载glfw glfw官网下载&#xff1a;https://www.glfw.org/download.html 下载之后&#xff0c;解压如下&#xff1a; 二、配置 2.1、创建Qt工程 创建一…

优质且免费的10个在线图片设计网站!

1.即时设计 即时设计资源社区是一个开源式免费商用图片素材网站&#xff0c;将社交、作品浏览和模板复用融合在一起。它内置了来自国内外优秀设计系统如TDesign、Arco Design、Ant Design和Material Design等的海量设计规范&#xff0c;以及超过3000个UI组件库和每月更新的上百…

远程桌面连接是什么?如何开启远程桌面连接详细教程

远程桌面连接是一种非常方便的技术&#xff0c;它允许用户通过互联网在不同的计算机之间共享资源和访问数据。目前这个技术已经广泛地应用于企业、教育、医疗和其他领域&#xff0c;使得人们能够更高效地工作和学习。 这篇文章&#xff0c;我将解释远程桌面连接是什么&#xf…

leecode111——二叉树最短路径

递归三部曲&#xff1a; 最小深度是从根节点到最近叶子节点的最短路径上的节点数量 &#xff08;1&#xff09;确定参数和返回值&#xff0c; 参数为传入根节点&#xff0c;再根据此遍历左右左右树的节点。返回最短路径&#xff0c;即int类型。 &#xff08;2&#xff09;确…

第4章 静态网站部署

第4章 静态网站部署 Nginx是一个HTTP的web服务器&#xff0c;可以将服务器上的静态文件&#xff08;如HTML、图片等&#xff09;通过HTTP协议返回给浏览器客户端 4.1 案例&#xff1a;将ace-master这个静态网站部署到Nginx服务器上 4.1.1 通过Xftp将ace-master到linux服务器…

深入探究HDFS:高可靠、高可扩展、高吞吐量的分布式文件系统【上进小菜猪大数据系列】

上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货。 引言 在当今数据时代&#xff0c;数据的存储和处理已经成为了各行各业的一个关键问题。尤其是在大数据领域&#xff0c;海量数据的存储和处理已经成为了一个不可避免的问题。为了应…

Sharding-JDBC之广播表(公共表)

目录 一、简介二、maven依赖三、数据库3.1、创建数据库3.2、创建表 四、配置&#xff08;二选一&#xff09;4.1、properties配置4.2、yml配置 五、实现5.1、持久层5.2、持久层5.3、服务层5.4、测试类5.4.1、保存数据5.4.2、查询广播表5.4.3、查询订单数据&#xff08;关联广播…

selenium——unittest框架

目录 一、unittest框架基本介绍二、unittest框架解析三、unittest框架使用方法1.测试固件2.测试套件3.用例的执行顺序4.忽略测试用例中的方法5.unittest断言6.HTML报告生成 一、unittest框架基本介绍 在进行selenium IDE脚本录制导出的脚本中&#xff0c;我们发现其中多了很多…

第十三章_Redis中的BigKey

MoreKey案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行&#xff0c;插入100W # 生成100W条redis批量设置kv的语句(keykn,valuevn)写入到/tmp目录下的redisTest.txt文件中 for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redi…

使用Eclipse +SpotBugs 检测代码弱点

文章目录 SpotBugs 插件的安装SpotBugs 的使用弱点扫描弱点查看的视图SpotBugs 是分析Java代码弱点的静态分析工具,SpotBugs提供了Eclipse的插件使用方式,在Eclipse 中安装插件之后就可以坚持Java代码的弱点了。 SpotBugs 插件的安装 SpotBugs 的插件安装主要有两种方式 在插…

8款 Vue 富文本编辑器

文章目录 TinyMCE - 富文本编辑器里的 Word &#xff0c;功能想不到的丰富tiptap - 多人在线实时协同编辑CKEditor 5 - 开源免费可商用&#xff0c;行内编辑Quill - 易扩展、轻量级二开、代码高亮好用Froala - 插件丰富&#xff0c;UI友好&#xff0c;编辑器里的苹果summernote…

Android系统原理性问题分析 - 消息传递机制的分析(Looper 和 Handler)

声明 在Android系统中经常会遇到一些系统原理性的问题&#xff0c;在此专栏中集中来讨论下。比如&#xff1a;Android为了线程安全&#xff0c;不允许在UI线程外操作UI&#xff0c;很多时候做界面刷新都需要通过Handler来通知UI组件更新。此篇参考一些博客和书籍&#xff0c;不…

数据库sql语句练习(三)

例题&#xff1a; ●哪些项目消费了不止一次 select distinct name消费了不止一次的项目 from shopping group by name having count(*)>1 注&#xff1a;加disdinct去除重复的返回值&#xff0c;不加默认为all ●按照不同消费项目的总金额从高到低的顺序&#xff0c;列出不…

PMP证书“扫盲”时间2023年考证人快看过来

二&#xff0c;PMP报考指南 学历与工作经验要求&#xff1a; 本科及以上学历&#xff0c;三年或以上的项目管理工作经验&#xff1b; 专科及以上学历&#xff0c;五年或以上的项目管理工作经验。 项目管理培训&#xff1a;35小时以上的项目管理教育/培训。 备注&#xff1…

Vue3-黑马(一)

目录&#xff1a; &#xff08;1&#xff09;vue3-基础-环境准备 &#xff08;2&#xff09;vue3-基础-入门案例 &#xff08;3&#xff09;vue3-基础-main.ts &#xff08;1&#xff09;vue3-基础-环境准备 vue3的技术选型&#xff0c;它提供了两套API&#xff0c;一个是选…

面试题——selenium原理解析、appium原理解析

这里写目录标题 一、selenium原理解析1、目的2、技术点3、Selenium 介绍4、Selenium 自动化测试5、为什么能够支持这么多种浏览器&#xff1f;6、Selenium 工作原理 二、appium原理解析1、目的2、技术点3、Appium 介绍4、Appium 工作原理 一、selenium原理解析 1、目的 了解是…

远程桌面连接出现了内部错误怎么解决?

远程桌面连接是一种非常方便的工具&#xff0c;可以让用户从远程访问其他计算机的桌面界面。但是&#xff0c;有时候在连接远程桌面时会出现内部错误&#xff0c;导致无法连接或者连接后无法正常使用。在本文中&#xff0c;我们将会讨论远程桌面连接出现内部错误的原因和解决方…