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

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

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d

PHP7扩展开发之对象方式使用lib库

前言 上一篇文章,我们使用的是函数方式调用lib库。这篇文章我们将使用对象的方式调用lib库。调用代码如下: <?php $hello = new hello(); $result = $hello->get(); var_dump($result); ?> 我们将在扩展中实现hello类。hello类中将依赖lib库。 代码 基础代码 这个扩展,我们将在say扩展上增加相关代码。sa

hibernate修改数据库已有的对象【简化操作】

陈科肇 直接上代码: /*** 更新新的数据并并未修改旧的数据* @param oldEntity 数据库存在的实体* @param newEntity 更改后的实体* @throws IllegalAccessException * @throws IllegalArgumentException */public void updateNew(T oldEntity,T newEntity