C++入门之类和对象(下)

C++入门之类和对象(下)

文章目录

  • C++入门之类和对象(下)
    • 一、初始化列表
      • 1.1 概念
      • 1.2 注意事项 1
      • 1.3 注意事项 2
      • 1.4 注意事项 3
    • 二、explicit关键字
      • 2.1 为什么要有explicit关键字
    • 三、static成员
      • 3.1 static修饰类的成员和成员函数

一、初始化列表

1.1 概念

先来看看构造函数

#include <iostream>
using namespace std;class Date
{
public:Date(int year,int month,int day){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{Date d(2024, 4, 18);d.Print();return 0;
}

以上代码中的代码中的构造函数准确来说并不是给类中的成员初始化,只是给类中的成员赋一个初始值,初始化只能初始化一次,而构造函数体内可以多次赋值

  这里就引出了一个概念,给类中的成员变量初始化的方法
初始化列表:以一个 冒号 :开始,同逗号 ,隔开每一个成员变量,每个成员变量后跟一个( ) ,括号中的内容就是初始的值(可以是初始值也可以是表达式)

1.2 注意事项 1

#include <iostream>
using namespace std;class Date
{
public:Date(int y):_year(2024), _month(4), _day(18), xx(10)  //const成员必须在初始化列表初始化,yy(y)    //引用也必须在初始化列表初始化,time(20,20,20) //没有默认构造函数的自定义类型也必须在初始化列表初始化{//_year = 2024; //与上面写法等价//_month = 4;//_day = 18;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;const int xx;int& yy;Time time;
};class Time
{
public:Time(int hours, int minutes, int seconds){_hours = hours;_minutes = minutes;_seconds = seconds;}
private:int _hours;int _minutes;int _seconds;
};
int main()
{int y = 0;Date d(y);d.Print();return 0;
}

初始化列表本质可以理解每个对象中的成员定义的地方

注意事项1:

所用的成员的可以在初始化列表中初始化,也可以在函数体中初始化(也就是大括号里),但是有三种特殊情况
1. 引用修饰的成员变量 (引用必须在定义时初始化)
2. const修饰的成员变量 (const修饰的变量也必须在定义时初始化)
3. 没有默认构造函数的自定义类型 (需要显式传参才可以调用)

1.3 注意事项 2

#include <iostream>
using namespace std;class Date
{
public:Date():_a1(10),_a2(20){}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _a1;int _a2;//在定义时给一个缺省值int _year = 2024;int _month = 4;int _day = 18;
};int main()
{Date d;d.Print();return 0;
}

注意事项2:

1. 就算没写初始化列表,每个成员变量都会走一遍(有编译器实现)
2. 内置类型(int char等),会看看是否有缺省值,有缺省值用缺省值,如果没有,取决于编译器是否对内置类型进行处理
3. 自定义类型(class struct等),会调用默认的构造函数,如果没有编译器则会报错
4. 先走初始化列表,再走函数体
5. 建议:尽量使用初始化列表初始化,如果不好在初始化列表中初始化的再在函数体中实现

1.4 注意事项 3

#include <iostream>
using namespace std;class A
{
public:A(int x):_a1(x)   //x赋值给a1,_a2(_a1) //_a1赋值给a2{}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a2;int _a1;
};int main()
{A aaa(10);aaa.Print();return 0;
}

代码运行结果: 10 随机值

出现随机值的主要原因是因为初始化时并不是按初始化列表顺序初始化的,而是变量在声明的顺序,在上述代码中,_a2先声明,_a1后声明,在初始化时,会先初始化_a2,而此时_a1是随机值,之后再通过x赋值_a1

注意事项3:

初始化顺序与初始化列表顺序无关,与声明顺序有关

二、explicit关键字

2.1 为什么要有explicit关键字

构造函数在接收参数时,还具有类型转换的作用

#include <iostream>
using namespace std;class A
{
public://单参数构造//explicit A(int x)    为了防止类型转换可以在函数名前面加上explicit关键字A(int x):_a(x){cout << "A(int x)" << endl;}//多参数构造A(int x, int y):_a(0),_a1(x),_a2(y){cout << "A(int x, int y)" << endl;}//拷贝构造A(const A& a):_a(a._a){cout << "A(const A& a)" << endl;}void Print(){cout << _a1 << " " << _a2 << endl;}
private:int _a;int _a1;int _a2;
};int main()
{A a(10);    //构造A b = a;    //拷贝构造A c = 10;   //隐式类型转换,将int类型构造出一个A自定义类型的临时对象,再用这个对象拷贝构造给cconst A& d = 10; //与上述同理,临时对象的拷贝构造,由于临时对象具有常性(只能读,不能修改),需要用const修饰,否则就是权限的放大//与单参数拷贝构造一致A e(1, 2);A f = { 1,2 };const A& g = { 1, 2 };return 0;
}

变量 a : 调用构造函数
变量 b : 调用拷贝构造函数
变量 c : 存在隐式类型转换,将内置类型转换成自定义类型,在语法上,先将10构造出一个A的临时对象,再将这个临时对象拷贝构造给c 但是编译器在遇到,连续调用构造函数和拷贝构造函数时,会优化为直接构造
变量d : 与变量c一致,不过由于引用的是临时对象,临时对象具有常性(只能读,不能修改),如果直接引用存在权限的放大(可读可修改),所以要加上const,让其只读
变量e f g是多参数构造,与单参数构造一致,在碰到连续调用构造函数和拷贝构造函数时,会优化为直接构造,其次赋值时要使用花括号

讲这么多还是没提到explicit关键字的作用
由于构造函数会存在类型转换的情况,为了防止这种情况呢,可以在函数名前面加上explicit关键字

三、static成员

3.1 static修饰类的成员和成员函数

计算创建了多少个对象

#include <iostream>
using namespace std;class A
{
public:A(){++_count;}A(const A& x){++_count;}//static修饰的函数中没有this指针static int GetCount(){return _count;}private:int _a;static int _count;
};int A::_count = 0;
int main()
{A arr[10];cout << A::GetCount() << endl;return 0;
}

注意事项:

  1. staric修饰成员变量
    类似与函数声明与定义分离,staric修饰成员变量在类中声明,在类外面初始化,
    类中:static int _count;
    类外:int A::_count = 0;
    不能给缺省值,因为缺省值是给初始化列表的,而static修饰的变量是存放在静态区的,不在对象中
    属于整个类,属于所有对象
  2. static修饰成员函数
    由于是在类中被private修饰了,类外面无法拿到,且只能通过static修饰的成员函数来使用,可以写一个static成员函数来获取static成员变量的值
    static修饰的成员函数是没有this指针的,所以只能访问static成员变量

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

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

相关文章

MySQL 中 InnoDB 存储引擎使用的 B+树底层数据结构

简要介绍 InnoDB 和它为什么选择使用 B树 InnoDB 是 MySQL 中默认的存储引擎&#xff0c;广泛用于生产环境中&#xff0c;特别是在要求高可靠性和事务性的应用场景。这个存储引擎支持事务处理、行级锁定、外键约束等高级数据库功能&#xff0c;这使得它非常适合处理大量数据并…

力扣爆刷第122天之CodeTop100五连刷96-100

力扣爆刷第122天之CodeTop100五连刷96-100 文章目录 力扣爆刷第122天之CodeTop100五连刷96-100一、912. 排序数组二、24. 两两交换链表中的节点三、297. 二叉树的序列化与反序列化四、560. 和为 K 的子数组五、209. 长度最小的子数组 一、912. 排序数组 题目链接&#xff1a;h…

AI大模型量化格式介绍(GPTQ,GGML,GGUF,FP16/INT8/INT4)

在 HuggingFace 上下载模型时&#xff0c;经常会看到模型的名称会带有fp16、GPTQ&#xff0c;GGML等字样&#xff0c;对不熟悉模型量化的同学来说&#xff0c;这些字样可能会让人摸不着头脑&#xff0c;我开始也是一头雾水&#xff0c;后来通过查阅资料&#xff0c;总算有了一些…

嵌入式学习57-ARM6(linux驱动启动程序)

知识零碎&#xff1a; arm2440 精简指令集架构 …

MongoDB聚合运算符:$reverseArray

MongoDB聚合运算符&#xff1a;$reverseArray 文章目录 MongoDB聚合运算符&#xff1a;$reverseArray语法使用举例 $reverseArray聚合运算符接受数组表达式作为参数&#xff0c;并返回一个元素按相反顺序排列的数组。 语法 { $reverseArray: <array expression> }参数可…

DFS之剪枝(上交考研题目--正方形数组的数目)

题目 给定一个非负整数数组 A A A&#xff0c;如果该数组每对相邻元素之和是一个完全平方数&#xff0c;则称这一数组为正方形数组。 返回 A A A 的正方形排列的数目。 两个排列 A 1 A1 A1 和 A 2 A2 A2 不同的充要条件是存在某个索引 i i i&#xff0c;使得 A 1 [ i …

Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway.

报错信息 Description: Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway. Action: Please set spring.main.web-application-typereactive or remove spring-boot-starter-web dependency.解析 这个错误信息是因为你的项目中同时存在…

前端基础(之五)

Q1: git常用的命令有哪些 git init 在当前目录下创建一个新的Git仓库 git clone 复制一个远程仓库到本地 git add 将文件添加到暂存区&#xff0c;准备提交 git commit 提交暂存区的更改到本地仓库&#xff0c;并记录提交信息 git status 查看仓库的当前状态&am…

头歌平台云计算实验

云计算 Hive综合应用案例——用户学历查询1 查询每一个用户从出生到现在的总天数2 同一个地区相同的教育程度的最高收入3 统计各级学历所占总人数百分比 Hive综合应用案例——用户学历查询 1 查询每一个用户从出生到现在的总天数 ---------- 禁止修改 ----------drop databas…

测试一下 Meta Llama3-70b-Instruct-q8

测试一下 Meta Llama3-70b-Instruct-q8 0. 引言1. 测试 Meta Llama3-70b-Instruct-q8 0. 引言 今天&#xff0c;Meta 正式介绍Meta Llama 3&#xff0c;Meta 开源大型语言模型的下一代产品。 这次发布包括具有80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff0…

5G 边缘计算如何赋能工业自动化生产线?

5G边缘计算为工业自动化生产线带来的赋能主要体现在以下几个方面&#xff1a; 低延迟与高可靠性&#xff1a;5G网络的低延迟特性对于工业自动化是至关重要的&#xff0c;特别是在需要快速响应的生产线上。边缘计算可以在数据产生地点附近处理数据&#xff0c;从而进一步减少通信…

LeetCode-最大子数组和

每日一题 今天刷到的是一道利用动态规划解决的题目 题目要求 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-…

指纹浏览器如何高效帮助TikTok账号矩阵搭建?

TikTok的账号矩阵&#xff0c;可能听起来还比较陌生&#xff0c;但随着TikTok业务已经成为吃手可热的跨境业务&#xff0c;TikTok多账号矩阵已成为流行策略。但它有什么优点呢&#xff1f;操作多个帐户会导致被禁止吗&#xff1f;如何有效地建立账户矩阵开展业务&#xff1f;这…

第十三章数据质量10分

原则&#xff1a;重要的数据先开始。 重点&#xff1a;PDCA&#xff1b;评估数据质量维度&#xff1b;根因分析&#xff1b;数据质量报告13.1 引言 有数据质量团队&#xff08;Data Quality Program Team&#xff09;。 数据质量团队负责与业务和技术数据管理专业人员协作&…

CANfestival 主机进入预操作态(preOperational)自动发送复位节点指令。

核心是iam_a_slave ,这个是字典生产的时候自动生成的。

【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版

系列文章目录 多语言方案&#xff1a;flutter_localizations 与 GetX 配合版&#xff0c;好处&#xff1a;命令行生成多语言字符串的引用常量类&#xff0c;缺点&#xff1a;切换语言以后&#xff0c;主界面需要手动触发setState&#xff0c;重绘将最新的Locale数据设置给GetM…

使用LangChain和Llama-Index实现多重检索RAG

大家好&#xff0c;在信息检索的世界里&#xff0c;查询扩展技术正引领着一场效率革命。本文将介绍这一技术的核心多查询检索&#xff0c;以及其是如何在LangChain和Llama-Index中得到应用的。 1.查询扩展 查询扩展是一种信息检索技术&#xff0c;通过在原始查询的基础上增加…

基于Springboot的简历系统

基于SpringbootVue的简历系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 简历模板 招聘会 求职论坛 系统公告 后台登录 后台首页 用户管理 简历模板 模板…

uniapp中scroll-view初始化的时候 无法横向滚动到某个为止

项目需求 实现日历&#xff08;13天&#xff09;默认高亮第六天 并定位到第六 左边右边各六天&#xff08;可以滑动&#xff09; 直接上代码 <template><scroll-view class"scroll-X":show-scrollbar"true" :scroll-x"scrollable":…

OpenHarmony网络组件-Mars

项目简介 Mars 是一个跨平台的网络组件&#xff0c;包括主要用于网络请求中的长连接&#xff0c;短连接&#xff0c;是基于 socket 层的解决方案&#xff0c;在网络调优方面有更好的可控性&#xff0c;暂不支持HTTP协议。 Mars 极大的方便了开发者的开发效率。 效果演示 编译…