240416 初始化列表 构造与隐式类型转换 static成员 友元 内部类

news2024/11/16 1:51:47

一、初始化列表

1、认识

【P】Stack不具备默认构造,MyQueue也无法生成默认构造
【S】引入初始化列表

MyQueue(int n)
	:_pushst(n)
	,_popst(n)
	,_size(0)
{}

初始化列表本质上可以理解为每个对象中成员定义的地方
所有成员既可以在初始化列表初始化,也可以在函数体初始化,下面的只能在初始化列表处初始化:

  1. 引用
  2. const
  3. 自定义类型成员没有默认构造(必须显式传参调构造)

const变量必须在初始化列表中定义,因为const变量只有一次初始化的机会,必须在定义时初始化

2、注意事项

  • 初始化列表无论写不写,每个成员变量都会先走一遍
  • 自定义成员会调用默认构造
  • 内置类型有的缺省值的用缺省值,没有的话看编译器,有的编译器会处理

先走初始化列表,再走函数体
【实践中】尽可能用初始化列表初始化,不方便再用函数体初始化

public:
	MyQueue()
		:_size(1) //显式写了就不用缺省值了
	{}
private:
	int _size = 0; //缺省值(给初始化列表使用)

【注】声明处的值是缺省值,并非定义,而是提供给初始化列表时使用的

3、初始化顺序

成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关

class A {
public:
	A(int a)
		:_a1(a)
		,_a2(_a1)
	{}

	void Print() {
		cout << _a1 << " " << _a2 << endl;
	}
private: // 初始化顺序与声明次序相同
	int _a2;
	int _a1;
};

int main() {
	A aa(1);
	aa.Print();
	return 0;
}

输出结果:
1 -858993460

二、单/多参数构造函数与隐式类型转换

在类中,声明成员变量给缺省值时也可以利用到【单/多参数构造函数与隐式类型转换】

B bb1(10);
// 拷贝构造
B bb2 = bb1;

// 隐式类型转换
// 内置类型转为自定义类型(单参数构造函数支持)
B bb3 = 1;// 1构造一个B的临时对象,再用这个临时对象拷贝构造bb3
B bb4 = 3.14;
B bb5 = 'a';
//B bb6 = "abcd"; // 字符串不可以
// 临时变量具有常性
const B& bb6 = 3.14;// bb6引用的是用3.14构造的临时对象
// 编译器遇到连续构造和拷贝构造->优化为直接构造

// 应用场景

// 原本
Stack st1;
B bbo(1);
st1.Push(bbo);
cout << endl;
// 简化后
st1.Push(2);

// 又例
list<string> lt;
string s1("abc");
lt.push_back(s1);
// 简化后
lt.push_back("abc");


C cc1(10, 20);
C cc2 = { 100,200 };
//C cc2 = (100,200);// 错误写法,但如果有单参数构造函数可能不会报错,逗号表达式只出一个结果
const C& cc3 = { 1000,2000 };

Stack st2;
st2.Push(cc1);
// 简化后
st2.Push({10,20});

三、静态成员变量

// 静态计数器
class MyClass {
public:
	MyClass() {
		++_instanceCount;
	}

	MyClass(const MyClass& other) {
		++_instanceCount;
	}

	~MyClass() {
		--_instanceCount;
	}

	// 没有this指针,只能访问静态成员
	static int getInstanceCount() {
		return _instanceCount;
	}

private:
	int _i1 = 1;
	int _i2 = 1;
	static int _instanceCount;
};

// 定义
int MyClass::_instanceCount = 0;

MyClass mctest() {
	MyClass mc4;
	return mc4;
}

int main(){
	MyClass mc1;
	cout << "sizeof(mc1) = " << sizeof(mc1) << endl;
	cout << "_instanceCount = " << MyClass::getInstanceCount() << endl;
	MyClass mc2(mc1);
	MyClass mc3 = mc2;
	mctest();
	cout << "_instanceCount = " << MyClass::getInstanceCount() << endl;
	MyClass obj = mctest();
	cout << "_instanceCount = " << MyClass::getInstanceCount() << endl;

	return 0;
}

结果为

sizeof(mc1) = 8
_instanceCount = 1
_instanceCount = 3
_instanceCount = 4

【练习】
在这里插入图片描述

解答:

#include <iostream>
using namespace std;

class Sum {
public:
	Sum() {
		_ret += _i;
		++_i;
	}

	static int GetRet() {
		return _ret;
	}

private:
	static int _i;
	static int _ret;
};

int Sum::_i = 1;
int Sum::_ret = 0;

int main() {

	Sum arr[100];
	cout << "1至100依次的加和是:" << Sum::GetRet() << endl;
	return 0;
}

四、友元

(1)友元函数
具体用例详见专栏里【240414 类和对象】文章中的【二、日期类:5. 流插入、流提取】部分
(2)友元类
单向,不具有交换性,不能传递,不能继承


class Time {
	//声明Date类是Time类的友元
	friend class Date;
public:
	//...
private:
	int _h;
	int _m;
	int _s;
	//...
};

class Date {
public:
	Date(int h, int m, int s) {
		_t._h = h;
		_t._m = m;
		_t._s = s;
	}
	//...
private:
	Time _t;
	//...
};

五、内部类

内部类就是外部类的友元类
B天生是A的友元

class A {
public:
	class B {
	public:
		B() {

		}

		void funcB() {

		}
	private:
		int _b1;
		int _b2;
	};

	A() {

	}

	void funcA() {

	}
private:
	int _a;
};
A aa;
cout << "sizeof(A) = " << sizeof(aa) << endl;

A::B bb;
cout << "sizeof(B) = " << sizeof(bb) << endl;

结果:
sizeof(A) = 4
sizeof(B) = 8

B是与A平行的独立类,仅仅只受类域限制

将第三部分的【练习】题改写成内部类

class Solution {
private:
	class Sum {
	public:
		Sum() {
			_ret += _i;
			++_i;
		}
		static int getRet() {
			return _ret;
		}
	private:
		static int _i;
		static int _ret;
	};

public:
	int sum_solution(int n) {
		Sum* arr = new Sum[n];
		int result = Sum::getRet();
		delete[] arr;
		return result;
	}
};

int Solution::Sum::_i = 1;
int Solution::Sum::_ret = 0;

main 函数:

Solution sol;
cout<< "1至100依次的加和是:" << sol.sum_solution(100) << endl;

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

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

相关文章

1. geoserver 安装

1. 下载 geoserver官网 以window为例 选择稳定版本 不同平台需要下载不同安装包 如果需要发布瓦片图层&#xff0c;需要下载扩展插件 前提需要有java环境&#xff0c;根据提示默认安装&#xff0c;需要安装在不同位置选择自己的文件夹即可 2. 使用 扩展插件解压之后的所…

【油猴脚本】编写一个简单的油猴(Tampermonkey)脚本,在网页中加入一个表格

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享【油猴脚本】编写一个简单的油猴&#xff08;Tampermonkey&#xff09;脚本&#xff0c;在网页中加入一个表格&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xf…

2024年最新老薛主机优惠码

老薛主机优惠码是其推出的一种优惠促销方式&#xff0c;大家在新购或续费老薛主机相关产品时&#xff0c;填写使用优惠码可以享受专属折扣。 一、老薛主机优惠码 1、终身七折优惠码&#xff1a;u70 2、新购七折优惠码&#xff1a;ABC 二、优惠码适用范围 老薛主机的优惠码通…

《使用 LangChain 进行大模型应用开发》学习笔记(三)

前言 本文是 Harrison Chase &#xff08;LangChain 创建者&#xff09;和吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《LangChain for LLM Application Development》&#xff08;使用 LangChain 进行大模型应用开发&#xff09;的学习笔记。由于原课程为全英文视频课…

Keil MDK报错:Browse information of one or more files is not available----解决方法:

Keil MDK报错&#xff1a;Browse information of one or more files is not available----解决方法&#xff1a; 问题描述 最近在项目中遇到这样一个问题&#xff1a;拷贝过来添加到工程的.c文件在编译时报如下错误&#xff1a; 解决方案&#xff1a; 总结以下一些解决办法&…

PCL 读取和保存点云

目录 一、概述 1.1原理 1.2实现步骤 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#xff09; 一、概述 1.1原理 PCL (Point Cloud Library) 是…

开源免费的工贸一体行业ERP管理系统

引言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;中小企业面临着前所未有的挑战与机遇。如何实现数字化转型发展&#xff0c;成为了众多中小企业主心头的大事。 据相关数据显示&#xff0c;目前我国中小企业数量已经超过了 4000 万户&#xff0c;然而成功实现数字化转型的比例…

单向链表之创建,插入,输出(下)

文章目录 &#x1f34a;自我介绍&#x1f34a;插入&#xff08;下&#xff09;尾插法有序插入&#xff1a;按照指定顺序插入 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介绍 H…

Arduino 2线串行 通信 驱动 LCD 12864

上效果图片 源代码 Arduino 328p /****************************************************************** 2线 LCD 12864 (屏幕主控芯片 ST7920)******************************************************************//***********************端口/引脚定义区域************…

Golang | Leetcode Golang题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; func readBinaryWatch(turnedOn int) (ans []string) {for i : 0; i < 1024; i {h, m : i>>6, i&63 // 用位运算取出高 4 位和低 6 位if h < 12 && m < 60 && bits.OnesCount(uint(i)) turnedOn {ans …

WPF创建不规则窗体时WebBrowser控件不显示的问题

最近有小伙伴需要在不规则窗体上放置WebBrowser控件&#xff0c;因为设置了WindowStyle"None" 和 AllowsTransparency"True"。 导致WebBrowser控件不显示。 界面代码如下所示&#xff1a; 1 <Window x:Class"WebBrowserDemo.MainWindow" …

【CTF Web】BUUCTF BUU UPLOAD COURSE 1 Writeup(文件上传+PHP+文件包含漏洞)

BUU UPLOAD COURSE 1 1 上课用~ 点击启动靶机。 解法 疑似存在文件包含漏洞。 http://15a5666e-1796-4f76-b892-0b69cf97df8e.node5.buuoj.cn:81/index.php?fileupload.php查看网页源代码。判断是后端检查。 <!DOCTYPE html> <html lang"zh-cn"> &…

区块链Dapp开发:质押挖矿的各模式开发详解

质押挖矿是区块链去中心化金融&#xff08;DeFi&#xff09;生态系统中的核心部分&#xff0c;吸引了大量用户参与。随着Dapp&#xff08;去中心化应用&#xff09;的普及&#xff0c;质押挖矿的模式多样化发展&#xff0c;不同模式各有其优点和风险。本文将介绍质押挖矿的基本…

SpringBoot快速接入OpenAI大模型(JDK8)

使用AI4J快速接入OpenAI大模型 本博文给大家介绍一下如何使用AI4J快速接入OpenAI大模型&#xff0c;并且如何实现流式与非流式的输出&#xff0c;以及对函数调用的使用。 介绍 由于SpringAI需要使用JDK17和Spring Boot3&#xff0c;但是目前很多应用依旧使用的JDK8版本&…

计算机毕业设计选题推荐-校园车辆管理系统-Java/Python项目实战(亮点:数据可视化分析、账号锁定)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

最新版微服务项目搭建

一&#xff0c;项目总体介绍 在本项目中&#xff0c;我将使用alibabba的 nacos 作为项目的注册中心&#xff0c;使用 spring cloud gateway 做为项目的网关&#xff0c;用 openfeign 作为服务间的调用组件。 项目总体架构图如下&#xff1a; 注意&#xff1a;我的Java环境是17…

C语言-数据结构 弗洛伊德算法(Floyd)邻接矩阵存储

弗洛伊德算法相比迪杰斯特拉相似的地方都是遍历邻接矩阵不断调整最短路径的信息&#xff0c;并且两种算法面对多源最短路径的时间复杂度都是O(n^3)&#xff0c;Floyd采用的是动态规划而Dijkstra是采用贪心的思想。在Floyd中我们将创建两个数组进行辅助&#xff0c;一个path二维…

swift qwen2-vl推理及加载lora使用案例

参考: https://swift.readthedocs.io/zh-cn/latest/Instruction/LLM%E5%BE%AE%E8%B0%83%E6%96%87%E6%A1%A3.html#%E5%BE%AE%E8%B0%83%E5%90%8E%E6%A8%A1%E5%9E%8B https://blog.csdn.net/weixin_42357472/article/details/142150209 SWIFT支持300+ LLM和50+ MLLM(多模态大模型…

MySQL主从同步延时高问题排查

文章目录 背景数据库性能指标1、sysbench工具安装1.1、yum方式在线安装1.2、离线安装1.3、sysbench简介 2、主从延时过高问题排查流程2.1、登录从库查看从库状态、事务及相关进程2.2、查看服务器磁盘、cpu等信息2.3、使用fio命令压测数据盘性能2.3.1、安装fio工具2.3.2、执行磁…

element-plus组件问题汇总

element-plus组件问题汇总 一、el-select 1. 下拉选项实现添加全部 问题描述&#xff1a;value为空时&#xff0c;select框中不显示全部选项&#xff0c;但是下拉列表中全部显示是勾选状态 图片&#xff1a; 解决办法&#xff1a;添加 :empty-values“[null, undefined]” …