c++类和对象(下篇)上

        今天又重新回到c++的学习中~在前两篇博客中,我简单的学习了类的定义,实例化,以及类中的默认成员函数.下篇是类和对象的收尾篇,在这篇中我将补充一下中篇所讲的构造函数以及介绍一些类和对象的新知识.下面让我们开始学习吧.

再谈构造函数

        在之前我们实现构造函数时,初始化成员变量主要用函数体内的赋值,但是构造函数还可以用初始化列表进行成员变量的初始化,(并且最好以后都用初始化列表).初始化列表使用方式为以一个冒号开始,以逗号分隔的数据成员列表,每个成员变量后跟一个放在括号中的初始值或表达式(可以写在一行,但推荐每个成员独占一行).

        每个成员变量在初始化列表中只能出现一次,初始化列表是每个成员变量定义初始化的地方.

        引用成员变量,const修饰的成员变量,没有默认构造的类类型变量必须在初始化列表处进行初始化,否则会编译报错.

        c++11支持在成员变量的声明处给缺省值.这个初始值会给到初始化列表,用于给没有在初始化列表中显示初始化的成员初始化.如果在初始化列表中显示初始化了缺省值就没用了.

        尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显⽰在初始化列表初始化的自定义类型成员调用这个成员类型的默认构造函数,如果没有默认构造会编译错误

        初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序⽆关。(建议类的成员变量的声明顺序和初始化列表顺序保持⼀致).

        注:⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表.

             ⽆论是否在初始化列表显示初始化成员变量,每个成员变量都要⾛初始化列表初始化.

        下表为上面内容的大体总结:

        下面为一些对应代码:

//简单的实验初始化列表
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;class Date
{
public://错误示范//Date(int year , int month , int day )//	:_year(2025)//	, _month(3)//	, _day(13)//{////}//正确做法Date(int year=2025, int month=3, int day=13):_year(year),_month(month),_day(day){}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{//错误示范对应的测试//Date d1;//会报错,不要将初始画列表与函数的缺省值弄混了//这里没有缺省值,必须要写实参,如下//Date d1(2222, 2, 2);//d1.Print();//调用之后发现无论给什么值去初始化最后都会打印初始化列表对应的日期Date d1;d1.Print();Date d2(2024,3,14);d2.Print();return 0;
}
class Time
{
public:Time(int hour):_hour(hour){cout << "Time(int hour)" << endl;}
private:int _hour;
};
class Date
{
public:Date(int year = 2025, int month = 3, int day = 13):_year(year), _month(month), _day(day),_a(_day),_b((int*)malloc(sizeof(int)*4))//可以用表达式来初始化, _t1(10){//错误示范// 引用成员变量,const修饰的成员变量,没有默认构造的类类型变量// 必须在初始化列表处进行初始化,否则会编译报错.//a = _day;//b = 2;//t1(1);}void Print(){cout << _year << " " << _month << " " << _day << endl;cout << _a << " " << _b << " " << endl;}
private:int _year;int _month;int _day;int& _a;const int* _b;Time _t1;
};
// class Time
//{
//public:
//	Time(int hour)
//		:_hour(hour)
//	{
//		cout << "Time(int hour)" << endl;
//	}
//private:
//	int _hour;
//};
//class Date
//{
//public:
//	Date(int year = 2025, int month = 3, int day = 13)
//		:_a(_day)
//		, _b((int*)malloc(sizeof(int) * 4))//可以用表达式来初始化
//		, _t1(10)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//		//也可以混着用
//	}
//	void Print()
//	{
//		cout << _year << " " << _month << " " << _day << endl;
//		cout << _a << " " << _b << " " << endl;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//
//	int& _a;
//	const int* _b;
//	Time _t1;
//};int main()
{Date d1;d1.Print();return 0;
}
class Date
{
public:Date(int year = 2025, int month = 3, int day = 13){}void Print(){cout << _year << " " << _month << " " << _day << endl;}
private://可以在声明时给缺省值,作用在初始化列表上int _year=2024;int _month=5;int _day=21;
};int main()
{Date d1;d1.Print();return 0;

        上面这个程序输出见上.因为_a1,_a2在初始化列表上都显示初始化了,所以下面的缺省值就没有用了.又因为初始化列表中按照成员变量在类中声明顺序进行初始化,所以输出值为1,随机值.

类型转换

        c++支持内置类型隐式转化为类类型的对象,但需要有相关内置类型为参数的构造函数.

        构造函数前⾯加explicit就不再⽀持隐式类型转换.

        类类型的对象之间也可以隐式转换,需要相应的构造函数⽀持.

        下面为一些代码:

class A
{
public://explicit A(int a = 1)//	:_a1(a)//{//	cout << "A(int a)" << endl;//}//加了explicit之后就禁止隐式转换了A(int a = 1):_a1(a){cout << "A(int a)" << endl;}A(int a, int b):_a1(a), _a2(b){cout << "A(int a, int b)" << endl;}int Geta1()const//因为下面为只读引用,所以这里要加const修饰*this{return _a1;}
private:int _a1 = 1;int _a2 = 1;
};class B
{
public:B(const A& a)//这里用const修饰了,a就只读了所以*this也要只读(205行):_b(a.Geta1()){cout << "B(const A& a)" << endl;}
private:int _b = 1;
};int main()
{A aa1 = 2;//隐式类型转换+拷贝构造A aa2 = { 3,4 };//隐式类型转换+拷贝构造B bb = aa1;//隐式类型转换+拷贝构造return 0;
}

static成员

        ⽤static修饰的成员变量,称之为静态成员变量静态成员变量⼀定要在类外进行初始化.静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区

        静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表.静态成员变量第一次创建(在内存中开空间)是在他第一次使用的时候.

        ⽤static修饰的成员函数,称之为静态成员函数静态成员函数没有this指针.静态成员函数中可以访问其他的静态成员,但是不能访问类中非静态的,因为没有this指针(静态成员函数一般用于取得静态成员变量).但是非静态的成员函数,可以访问任意的静态成员变量和静态成员函数.

        突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量 和静态成员函数.(在全局中可以通过上两种方式来初始化私有的静态成员变量).静态成员也是类的成员,受public、protected、private 访问限定符的限制.(若在类中设置成私有那么就不可以在main函数中突破类域直接访问).

练习:实现⼀个类,计算程序中创建出了多少个类对象?

class A
{
public:A(int n = 0):_aa(n){++_a;}//~A()//{//	--_a;//}static int Get_a(){return _a;}
private:int _aa;static int _a;
};int A::_a = 0;
void func()
{A a4;
}
int main()
{A a1;A a2;A a3;func();cout << a1.Get_a() << endl;cout << A::Get_a() << endl;//也可以通过类来调用静态成员变量return 0;
}

        好啦,今天的学习就到这里啦,在下一篇博客会把类和对象的最后一点东西写完,那我们下篇博客见.晚安~

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

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

相关文章

深度学习 bert流程

Token IDs 在自然语言处理任务中&#xff0c;特别是使用预训练模型如BERT时&#xff0c;文本首先通过一个分词器&#xff08;例如 BertTokenizer&#xff09;转换为一系列的token IDs。这些ID是每个词或子词单元在词汇表&#xff08;包含汉字、英文单词、标点符号&#xff09;…

PPT内视频播放无法播放的原因及解决办法

PPT内视频无法播放&#xff0c;通常是视频编解码的问题。目前我遇到的常见的视频编码格式有H.264&#xff0c;H.265&#xff0c;VP9&#xff0c;AV1这4种。H.264编解码的视频&#xff0c;Windows原生系统可以直接播放&#xff0c;其他的视频编码格式需要安装对应的视频编解码插…

星越L_行李舱空间拓展讲解

目录 1.储物槽 2.底板盖储物空间 3.挂钩 3.左侧照明灯 4.第二排座椅放倒 1.储物槽 使用钥匙或者后备箱按钮打开电动后备箱,左侧储物槽可储藏物品。 2.底板盖储物空间 打开地板盖,下方有储物空间。并放置了随车工具。 3.挂钩 后备箱左右两测各有一个挂钩。

深度学习与大模型-矩阵

矩阵其实在我们的生活中也有很多应用&#xff0c;只是我们没注意罢了。 1. 矩阵是什么&#xff1f; 简单来说&#xff0c;矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵&#xff0c;可以写成这样&#xff1a; 这个矩阵有2行3列&#xff0c;每个数字都有一个位置&a…

LuaJIT 学习(2)—— 使用 FFI 库的几个例子

文章目录 介绍Motivating Example: Calling External C Functions例子&#xff1a;Lua 中调用 C 函数 Motivating Example: Using C Data StructuresAccessing Standard System FunctionsAccessing the zlib Compression LibraryDefining Metamethods for a C Type例子&#xf…

基于 FastText、dlib 和 CppJieba 的中文语义相似度计算实践

在自然语言处理(NLP)领域,语义相似度计算是许多任务的核心,例如问答系统、文本检索和推荐系统。然而,中文因缺乏显式分词和复杂的语义结构,实现高效的语义对比具有一定挑战性。 本文将介绍如何结合 CppJieba(高效中文分词工具)、FastText(词向量模型)和 dlib(机器学…

HCIA-11.以太网链路聚合与交换机堆叠、集群

链路聚合背景 拓扑组网时为了高可用&#xff0c;需要网络的冗余备份。但增加冗余容易后会出现环路&#xff0c;所以我们部署了STP协议来破除环路。 但是&#xff0c;根据实际业务的需要&#xff0c;为网络不停的增加冗余是现实需要的一部分。 那么&#xff0c;为了让网络冗余…

Unity基于C#+UGUI解决方案,制作每日签到系统(本地存储签到数据)

一、需求介绍:基于本地存储系统制作一个每日签到系统界面,相关签到界面如下图所示,点击“签到有礼”按钮后就会跳转到“每日登录礼”这个界面,点击“立即签到”按钮之后,按钮就会置灰,而且按钮的文字会变成“等待明日”。 二、制作界面显示相关功能,需要在Unity中新建一…

AI本地部署

文档加载&#xff08;Document Loading&#xff09;&#xff1a;从多种不同来源加载文档。LangChain提供了100多种不同的文档加载器&#xff0c;包括PDF在内的非结构化的数据、SQL在内的结构化的数据&#xff0c;以及Python、Java之类的代码等​ •文本分割&#xff08;Splitti…

精准车型识别:视觉分析技术的力量

随着智慧城市和智能交通系统的快速发展&#xff0c;车型识别检测成为交通管理、安全监控和数据分析的关键技术之一。利用视觉分析的方式&#xff0c;我们可以高效、准确地检测监控下的车辆类型、车牌信息及车流量&#xff0c;为城市交通管理提供有力支持。本文将从背景、技术实…

上下文微调(Contextual Fine-Tuning, CFT)提高大型语言模型(LLMs)在特定领域的学习和推理能力

大型语言模型(LLMs)在开放领域任务中表现出色,但在快速演变的专业领域(如医学、金融)中面临挑战: 知识更新难题:传统指令微调(Instruction Fine-Tuning, IFT)依赖显式指令,难以适应动态知识。灾难性遗忘:持续预训练(Continued Pretraining, CPT)可能导致模型遗忘已…

在 LaTeX 中强制表格位于页面顶部

在 LaTeX 中强制表格位于页面顶部&#xff0c;可以通过以下 多种方法结合使用&#xff0c;按优先级推荐&#xff1a; 方法 1&#xff1a;使用 [!t] 位置限定符 原理&#xff1a;通过 [!t] 强制 LaTeX 优先将表格放置在页面顶部&#xff08;Top&#xff09;&#xff0c;! 表示忽…

kotlin与MVVM的结合使用总结(二)

在 MVVM&#xff08;Model - View - ViewModel&#xff09;架构中&#xff0c;M 层即 Model 层&#xff0c;主要负责数据的管理、存储和获取&#xff0c;它与业务逻辑和数据处理相关。在 Kotlin 中实现 MVVM 的 M 层&#xff0c;通常会涉及数据类的定义、数据的本地存储与远程获…

电子元器件选型与实战应用—16 怎么选一个合适的MCU芯片?

文章目录 1. 选型要素1.1 价格1.2 技术支持1.3 厂家优势1.4 功耗1.5 特殊功能1.6 统计外设1.7 确定外设占用的内存和flash大小1.8 确定外设通信接口1.9 确定外设通信接口的电平1.10 确定外设的GPIO数量1.11 确定外设的供电和功耗1.12 确定外设GPIO的种类1.13 确定ADC的数量1.14…

VSCode 搭建C++编程环境 2025新版图文安装教程(100%搭建成功,VSCode安装+C++环境搭建+运行测试+背景图设置)

名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、VScode下载及安装二、安装 MinGW-w64 工具链三、Windows环境变量配置四、检查 M…

Django系列教程(7)——路由配置URLConf

目录 URLconf是如何工作的? path和re_path方法 更多URL配置示例 URL的命名及reverse()方法 使用命名URL 硬编码URL - 不建议 URL指向基于类的视图(View) 通过URL传递额外的参数 小结 Django的项目文件夹和每个应用(app)目录下都有urls.py文件&#xff0c;它们构成了D…

transformer bert 多头自注意力

输入的&#xff08;a1,a2,a3,a4&#xff09;是最终嵌入&#xff0c;是一个(512,768)的矩阵&#xff1b;而a1是一个token&#xff0c;尺寸是768 a1通过wq权重矩阵&#xff0c;经过全连接变换得到查询向量q1&#xff1b;a2通过Wk权重矩阵得到键向量k2&#xff1b;q和k点乘就是值…

Spring Boot + MyBatis-Plus 项目目录结构

以下是一个标准的 Spring Boot MyBatis-Plus 项目目录结构及文件命名规范&#xff0c;包含每个目录和文件的作用说明&#xff0c;适用于中大型项目开发&#xff1a; 项目根目录结构 src/ ├── main/ │ ├── java/ # Java 源代码 │ │ └── com/…

Webpack优化前端性能

Webpack优化前端性能☆☆ 涵盖了代码分割、懒加载、压缩、缓存优化、Tree Shaking、图片优化、CDN使用等多个方面。 Webpack优化前端性能详解(2025综合实践版) Webpack作为现代前端工程化的核心工具,其优化能力直接影响项目的首屏速度、交互流畅度和用户体验。以下从代码维…

ardunio R4 WiFi连接实战

ardunio WiFi连接模板 ardunio R4 WiFi 开发板有着不错的性能和板载内存&#xff0c;本机自带 WiFi 连接模块&#xff0c;可以完成简单的网络服务。对于这个小东西我情有独钟&#xff0c;也总希望能够用它来做些什么&#xff0c;所以先从 WiFi 连接开始学起&#xff0c;未来考…