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

2024-05-25 18:28
文章标签 对象 下篇 未完结

本文主要是介绍类和对象(下篇)(未完结)!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 在谈构造函数
    • 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  1B.程序崩溃
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.chinasem.cn/article/1002282

相关文章

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以

C++类和对象之默认成员函数的使用解读

《C++类和对象之默认成员函数的使用解读》:本文主要介绍C++类和对象之默认成员函数的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、默认成员函数有哪些二、各默认成员函数详解默认构造函数析构函数拷贝构造函数拷贝赋值运算符三、默认成员函数的注意事项总结一

golang 对象池sync.Pool的实现

《golang对象池sync.Pool的实现》:本文主要介绍golang对象池sync.Pool的实现,用于缓存和复用临时对象,以减少内存分配和垃圾回收的压力,下面就来介绍一下,感兴趣的可以了解... 目录sync.Pool的用法原理sync.Pool 的使用示例sync.Pool 的使用场景注意sync.

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java实例化对象的​7种方式详解

《Java实例化对象的​7种方式详解》在Java中,实例化对象的方式有多种,具体取决于场景需求和设计模式,本文整理了7种常用的方法,文中的示例代码讲解详细,有需要的可以了解下... 目录1. ​new 关键字(直接构造)​2. ​反射(Reflection)​​3. ​克隆(Clone)​​4. ​反序列化