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

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

相关文章

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

类和对象的定义和调用演示(C++)

我习惯把类的定义放在头文件中 Student.h #define _CRT_SECURE_NO_WARNINGS#include <string>using namespace std;class student{public:char m_name[25];int m_age;int m_score;char* get_name(){return m_name;}int set_name

react笔记 8-19 事件对象、获取dom元素、双向绑定

1、事件对象event 通过事件的event对象获取它的dom元素 run=(event)=>{event.target.style="background:yellowgreen" //event的父级为他本身event.target.getAttribute("aid") //这样便获取到了它的自定义属性aid}render() {return (<div><h2>{

Python---文件IO流及对象序列化

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 前文模块中提到加密模块,本文将终点介绍加密模块和文件流。 一、文件流和IO流概述         在Python中,IO流是用于输入和输出数据的通道。它可以用于读取输入数据或将数据写入输出目标。IO流可以是标准输入/输出流(stdin和stdout),也可以是文件流,网络流等。

小琳Python课堂:深入理解Python对象:状态、创建与管理

大家好,这里是小琳Python课堂。今天我们继续深入理解Python对象的状态、创建与管理。让我们一起来探索这些概念,以帮助你更好地掌握Python编程。 一、Python对象的状态 1. 实例属性与类属性 Python对象的属性分为实例属性和类属性。实例属性是对象独有的,而类属性则被类的所有实例共享。 实例属性:比如汽车的颜色、品牌和价格,每个汽车对象都有其独特的实例属性。类属性:比如

请解释JSP中的九大内置对象及其作用。什么是Java Web中的请求转发和重定向?它们有什么区别?

请解释JSP中的九大内置对象及其作用。 JSP(JavaServer Pages)中的九大内置对象(也称为隐式对象或自动对象)是JSP容器为每个页面提供的Java对象,这些对象在JSP页面被转换成Servlet时自动可用,无需显式声明。这些对象极大地简化了JSP页面的开发,因为它们提供了对Web应用程序中常见功能的直接访问。以下是九大内置对象及其作用的详细解释: request:javax.