类和对象(下篇)(未完结)!

news2025/3/19 8:14:01

文章目录

  • 在谈构造函数
    • 1.构造函数体赋值
    • 2.初始化列表
    • 尽量使用初始化列表?
    • 初始化列表的初始化顺序?
    • 成员变量声明处的缺省值
    • 构造函数支持类型转换
    • 3.explicit关键字
  • static成员

在谈构造函数

1.构造函数体赋值

class Date
 {
 public:
 Date(int year, int month, int day)
 {
 _year = year;
 _month = month;
 _day = day;
 }
 private:
 int _year;
 int _month;
 int _day;
 };

2.初始化列表

构造函数分为俩个阶段:初始化列表 函数体赋值
初始化列表结构:冒号( :)开始 成员变量(值)逗号(,)分隔,大括号({})结束,这里的成员变量(值)可以不写。
调用构造函数先会进入初始化列表 ,在进入函数体中。
即使初始化列表什么也没有,也会先进入到初始化列表,因为初始化列表是成员变量定义的地方,先定义才能赋值。
在初始化列表中给成员变量值是初始化,在函数体中给值只能说是赋值,因为初始化列表完成的是对成员变量的定义和初始化,即使没有显示写初始化列表,也会定义成员变量,初始化的值是随机值。

class Date
 {
 public:
 Date(int year, int month, int day)

     :_year
     ,_month
     ,_day
 {}

 private:
 int _year;
 int _month;
 int _day;
 };

对象的实例化是对整体成员变量(对象)的定义
初始化列表是对每个成员变量定义初始化地方,
无论是初始化列表还是函数体中赋值,都能给成员函数赋值,但是有一些特殊的变量,必须有初始化列表中完成的。
必须有初始化列表中完成的:只能初始化一次的变量,(初始化列表只能对对成员变量初始化一次,函数体中对成员变量赋值可以是多次,所以初始化一次的只能在初始化列表中完成)。
类中包含以下成员,必须放在初始化列表位置进行初始化:
引用成员变量
const成员变量
自定义类型成员(且该类没有默认构造函数时)

自定义类型成员(且该类没有默认构造函数时)为什么要在初始化列表中初始化?
因为 无论是默认还是显示的构造函数 ,初始化列表中没有显示写自定义类型成员(也会在初始化列表中定义),都会去调用它的默认构造函数给自定义类型初始化,如果自定义类型成员没有默认构造函数,只能在初始化列表中初始化,否则会报错。

尽量使用初始化列表?

因为调用构造函数都会进入初始化列表,直接在初始化列表中初始化一步到位。

初始化列表的初始化顺序?

初始化列表的初始化顺序是成员变量声明处的顺序。
因此我们在显示写初始化列表的时候要和成员变量声明顺序一致,以防初始化错乱。
这个程序会是什么答案?

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();
 }
 A. 输出1  1
 B.程序崩溃
C.编译不通过
D.输出1  随机值

初始化的顺序是成员变量声明的顺序,调用构造函数先进入初始化列表,先初始化_a2初始化的值是_a1的值,因为_a1还没有初始化,所以_a2是随机值,接下来初始化_a1初始化时传给a的值1

成员变量声明处的缺省值

成员变量声明处的缺省值是给初始化列表的初始化缺省值。
如果初始化列表显示写并有初始化值,优先使用显示写的值。
成员声明处的初始化还能这么给,初始化列表中能给的,声明处也能。
在这里插入图片描述

初始化列表和函数体混着用
在这里插入图片描述

构造函数支持类型转换

构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。
在这里插入图片描述

不同类型的赋值 会产生类型转换
下面的 C cc2 = 2 2给C类型对象赋值 会产生类型转换 2的类型转换是有C类中构造函数 构造的 然后由临时变量接收构造的类型
然后临时的对象是已有的对象 为要创建的cc2 拷贝构造
这里会先构造 然后在拷贝构造 编译器会优化 连续的构造会合为一个构造
内置类型能类型转换成自定义类型是通过构造函数
在这里插入图片描述
在这里插入图片描述

这里的不同类型赋值 也会产生类型转换 只是内置类型之间的转换不需要构造函数了,i int类型转换成double 类型转换不是i的类型发生了变化,使用临时变量转换成double,类型转换的是临时变量
在这里插入图片描述
下面的例子涉及到权限放大,临死变量具有常性
2构造成c类型对象 放在临时变量 C& cc3 = 2是给2构造成c类型对象 起别名, C& cc3没有const修饰 就会改变2构造成c类型对象,不合法
下面也是在这里插入图片描述
改正:在这里插入图片描述
有了类型转换这一概念,自定义类型赋值 可以用不同类型的值赋值,通过隐式的类型转换是合法的。
所以也可以这么给缺省值
xx是全局的 c 类型
在这里插入图片描述
C++11 多参数的构造函数也支持隐式类型转换
{1,2} 调用构造函数 构造成左值类型 临时对象接收 然后拷贝构造给左值
连续构造会合并成一个
在这里插入图片描述

3.explicit关键字

不想让隐式类型准换发生(不想类型转换发生) 函数前+ 关键字explicit
在这里插入图片描述
在这里插入图片描述

static成员

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

面试题:实现一个类,计算程序中创建出了多少个类对象。
DEBUG版本 4次
Release版本 3次 不同版本下会产生优化的

在这里插入图片描述
静态成员函数 不会有this指针
成员变量在私有的情况下,不能在类外面使用 ,因此外面可以写一共提供成员变量信息的函数
在这里插入图片描述

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

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

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

相关文章

MATLAB:插值函数之interp与griddata

MATLAB 提供了多种插值函数来处理不同维度的数据。其中&#xff0c;interp1、interp2 和 griddata 是常用的插值函数&#xff0c;分别用于一维、二维和多维&#xff08;不规则&#xff09;数据的插值。 之前有对interp1进行过详细介绍&#xff0c;如需详细了解&#xff0c;请查…

【算法】决策单调性优化DP

文章目录 决策单调性四边形不等式决策单调性 形式1法1 分治法2 二分队列例题 P3515Solution 形式2例题 P3195Solution 形式3例题 CF833BSolution 形式4例题Solution 后话 决策单调性 四边形不等式 定义: 对于二元函数 w ( x , y ) w(x,y) w(x,y)&#xff0c;若 ∀ a , b , …

【Linux取经路】线程同步——条件变量

文章目录 前言一、条件变量1.1 pthread_cond_init——初始化一个条件变量1.2 pthread_cond_destroy——销毁一个条件变量1.3 定义一个全局的条件变量1.4 pthread_cond_wait——等待条件满足1.5 pthread_cond_signal——唤醒一个等待线程1.6 pthread_cond_broadcast——唤醒所有…

云界洞见:移动云服务开启技术创新与问题解决的新篇章

一、什么是移动云 移动云以“央企保障、安全智慧、算网一体、属地服务”为品牌支撑&#xff0c;聚焦智能算力建设&#xff0c;打造一朵智能、智慧、安全可信可控的云&#xff0c;提供更优质的算力服务&#xff0c;引领云计算产业发展。 那么下面博主带领大家了解移动云的优势所…

为什么建立数据库连接耗时?究竟耗时多久?

数据库连接从连接池中取这已经是大家的共识了&#xff0c;因为频繁的建立或者关闭连接代价太大&#xff0c;那么代价究竟有多大&#xff1f; 我们先准备一个简单的数据库连接代码段 public static void main(String[] args) throws ClassNotFoundException, SQLException, Int…

Aligned Layer:trustless应用的通用验证层

1. 引言 Aligned Layer近期获得了2000万美金的A轮融资&#xff0c;Aligned Layer&#xff1a; 致力于成为 去中心化 zero-knowledge (ZK) proof 验证层。旨在为不同证明系统&#xff0c;提供快速、经济且可扩展的零知识证明验证。作为以太坊生态系统及其他生态系统的通用sour…

都2024年了!是谁还不会优化 Hive 的小文件啊!!!速看!

文章目录 小文件产生的原因1.查询建表或者插入2.装载数据3.动态分区小文件影响解决方法针对已经存在的小文件进行优化1.小文件归档2.getmerge3.concatenate4.重写针对写入数据时的优化1.调参优化2.动态分区优化3.使用 Spark 算子控制小文件数量查看 HDFS 上的文件时,无意间点进…

1791.找出星形图的中心节点

刷算法题&#xff1a; 第一遍&#xff1a;1.看5分钟&#xff0c;没思路看题解 2.通过题解改进自己的解法&#xff0c;并且要写每行的注释以及自己的思路。 3.思考自己做到了题解的哪一步&#xff0c;下次怎么才能做对(总结方法) 4.整理到自己的自媒体平台。 5.再刷重复的类…

蓝桥杯备赛——DP【python】

一、小明的背包1 试题链接&#xff1a;https://www.lanqiao.cn/problems/1174/learning/ 问题描述 输入实例 5 20 1 6 2 5 3 8 5 15 3 3 输出示例 37 问题分析 这里我们要创建一个DP表&#xff0c;DP&#xff08;i&#xff0c;j&#xff09;表示处理到第i个物品时消耗j体…

# 【基于随机森林算法的数据回归预测】附详细Matlab代码

文章目录 1. 引言2. 随机森林算法原理2.1 决策树基础2.2 随机森林的构建 3. 随机森林回归的实现3.1 数据准备3.2 模型训练3.3 模型预测 4. 模型评估5. 参数调优6. 结论7. 参考文献 在数据科学的世界里&#xff0c;预测模型是解决未来未知问题的关键工具。随机森林算法&#xff…

[国产大模型简单使用介绍] 开源与免费API

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 随着大模型技术蓬勃发展和开源社区越来越活跃,国内的大模型也如雨后春笋一般.这时,一些就会问了,有了llama3,Mistral还有Gemma等等,国外大厂接连发力,一些开源社区也会有一些不错的模型,国内怎么比?对一个人使用,oll…

Golang单元测试

文章目录 传统测试方法基本介绍主要缺点 单元测试基本介绍测试函数基准测试示例函数 传统测试方法 基本介绍 基本介绍 代码测试是软件开发中的一项重要实践&#xff0c;用于验证代码的正确性、可靠性和预期行为。通过代码测试&#xff0c;开发者可以发现和修复潜在的错误、确保…

小猪APP分发:一站式托管服务,轻松玩转应用市场

在当今移动应用爆炸式增长的时代&#xff0c;开发者们面临的挑战不再仅限于创意的火花和代码的实现&#xff0c;更在于如何让精心打造的应用快速触达广大用户。这正是小猪APP分发www.appzhu.net应运而生的背景——作为一个全面、高效的APP托管服务分发平台&#xff0c;它为开发…

相关服务器介绍

服务器是一种高性能的计算机&#xff0c;它被设计用来为其他计算机或终端设备提供服务&#xff0c;如数据处理、文件存储、网络通信等。服务器通常具有强大的计算能力、大容量的存储空间和高效的网络连接能力。 常见的服务器种类及其特点 文件服务器 文件服务器主要负责中央存储…

什么是JDK21虚拟线程

JDK21虚拟线程 1. 来一段小故事2. 什么是虚拟线程3. 虚拟线程的几个关键特点4.细说关键特点1.为什么轻量级的1.传统线程运行时间2.虚拟线程运行时间3.对垃圾回收的影响 2.非绑定OS线程的魅力所在3.和传统相比为何易于使用4.阻塞优化有什么好处1.什么是阻塞优化2.JDK 21虚拟线程…

基于SSH的母婴用品销售管理系统带万字文档

文章目录 母婴商城系统一、项目演示二、项目介绍三、系统部分功能截图四、万字论文参考五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 母婴商城系统 一、项目演示 母婴商城系统 二、项目介绍 基于SSH的母婴商城系统 系统…

海外仓储管理系统:提升效率,标准化海外仓管理,科技赋能业务

海外仓作为跨境物流的关键一环&#xff0c;完全可以说海外仓的效率直接决定了后续物流的整体运作效率。 对于海外仓而言&#xff0c;一套高效&#xff0c;易用的海外仓储系统&#xff0c;无疑将成为提升企业竞争力的重要工具&#xff0c;帮助海外仓实现从野蛮生长到标准化管理…

边用边充电影响寿命吗?看看计算机指令组成与操作类型

计算机指令集体系结构之指令 指令由操作码和地址码字段组成。 操作码指明了指令要完成的操作。 长度可以固定&#xff1a;比如RISC&#xff08;reduced instruction set computer&#xff09;精简指令集计算机 与之对应的RISC&#xff08;复杂指令集计算机&#xff09;&…

【C++进阶】AVL树

0.前言 前面我们已经学习过二叉搜索树了&#xff0c;但如果我们是用二叉搜索树来封装map和set等关联式容器是有缺陷的&#xff0c;很可能会退化为单分支的情况&#xff0c;那样效率就极低了&#xff0c;那么有没有方法来弥补二叉搜索树的缺陷呢&#xff1f; 那么AVL树就出现了&…

【C++】类与对象——多态详解

目录 一、多态的定义 二、重载、覆盖(重写)、隐藏(重定义)的对比 三、析构函数重写 四、C11 override 和 final 1. final 2. override 五、抽象类 六、多态的原理 一、多态的定义 多态是在不同继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的行为…