【C++初阶】类与对象(下)

目录

再探构造函数:初始化列表

使用方法:

特点:

1、初始化列表是每个成员变量定义初始化的地方

2、每一成员变量在初始化列表只出现一次

3、必须在初始化列表中出初始化的成员变量

4、成员变量给缺省值

5、在构造函数体内初始化和在初始化列表中初始化有什么区别?

6、指针成员变量初始化

7、成员变量初始化顺序

注:()和{}初始化使用

总结:

类型转换

static成员

静态成员的调用:

静态成员变量:

1、

2、

​编辑3、

静态成员函数:

1、

2、

3、

注:静态成员也受访问限定符的限制

代码:

友元

内部类

匿名对象

特点:

1、

2、

3、使用场景

4、

5、匿名对象和临时对象的区别


再探构造函数:初始化列表

在前面构造函数的学习中,成员变量的初始化主要在函数体内赋值,但还有一种初始化的方法,就是:初始化列表

使用方法:

在函数名下,以一个冒号开头,接着是一个以逗号分隔的数据成员列表,每一个成员变量后面跟一个放在括号中的初始值或表达式

class A
{
public:A():_a1(0)//成员变量初始化, _a2(0){}
private:int _a1;int _a2;
};int main()
{A a(1,1);//对象初始化return 0;
}

特点:

1、初始化列表是每个成员变量定义初始化的地方

在语法上可以这么理解:初始化列表是每个成员变量定义初始化的地方

2、每一成员变量在初始化列表只出现一次

class A
{
public:A():_a1(0)//,_a1(1)//error, _a2(0){}
private:int _a1;int _a2;
};

3、必须在初始化列表中出初始化的成员变量

1、引用成员变量

2、const成员变量

3、没有默认构造函数的类类型成员变量

正确代码:

class B
{
public:B(int b){_b = b;}
private:int _b;
};class A
{
public:A(int a1, int a2):_a1(a1), _a2(a2), _a3(1), _a4(1), _a5(1){}
private:int _a1;int _a2;//必须在初始化列表上初始化的成员变量const int _a3;const int& _a4;//没有默认构造的自定义类型成员变量也必须在初始化列表上初始化B _a5;
};int main()
{A a1(1, 1);return 0;
}

4、成员变量给缺省值

可以在成员变量声明时给缺省值,这里的缺省值其实就是给初始化列表的,当成员变量给了缺省值时,初始化列表就按照缺省值初始化成员变量

class B
{
public:B(int b){_b = b;}
private:int _b;
};class A
{
public:A(int a1, int a2){}
private:int _a1 = 0;int _a2 = 0;const int _a3 = 1;const int& _a4 = 1;B _a5 = 1;
};int main()
{A a1(1, 1);return 0;
}

5、在构造函数体内初始化和在初始化列表中初始化有什么区别?

//函数体内就相当于下面这种:
int i;
i = 1;
//初始化列表中初始化就相当于:
int i = 1;

6、指针成员变量初始化

class A
{public:A(int n):_a((int*)malloc(n)){}private:int* _a;//指针成员变量//int* _a = (int*)malloc(n);
}

7、成员变量初始化顺序

初始化列表中按照成员变量在类中声明顺序进行初始化,和在初始化列表中出现的顺序无关

所以成员变量声明顺序和初始化列表中顺序要保持一致

注:()和{}初始化使用

注意事项:
//int i(1);//error
int i{ 1 };//可以用{}来初始化,不能用()

总结:

在成员变量初始化的时候尽量走初始化列表,在编译器中即使不写出初始化列表或者不在初始化列表中初始化的成员变量,也会自动走初始化列表

当成员变量在声明时写了缺省值时,初始化列表会按照缺省值进行初始化(初始化列表中没有初始化赋值)

所以,以后成员变量初始化时一般都用初始化列表或给缺省值

类型转换

1、C++支持内置类型隐式转换为类类型对象,但需要相应的内置类型的构造函数

在C++11后支持多参数隐式转换

class A
{
public:A(int a):_a =a{}A(int a1,int a2):_a1(a1),_a2(a2){}
private:int _a1 = 1;int _a2 = 1;
}int main()
{A a=1;const A& a1 = 1;A a2(1,2);return 0;
}

代码中的隐式类型转换会涉及构造函数和拷贝构造函数,中间产生临时变量,但经过编译器的优化,就只会有一个直接构造函数

2、构造函数前面加上explicit就不会支持隐式类型转换

class A
{
public:explicit A(int a)//加上explicit关键字:_a1(a){}
private:int _a1 = 1;
};int main()
{A a=1;return 0;
}

3、类与类之间也可以进行隐式类型转换,但也需要对应的构造函数支持

它的原理与内置类型隐式类型转换为自定义类型相同

class A
{
public://explicit A(int a)//加上explicit关键字,就不支持隐式类型转换A(int a)//内置类型与自定义类型:_a(a){}int Get() const{return _a;}
private:int _a = 1;
};class B
{
public:B(const A& a):_b(a.Get()){}
private:int _b = 0;
};int main()
{A a = 1;B b = a;return 0;
}

static成员

静态成员的调用:
 

静态成员变量:

1、

用static关键字修饰的成员变量被称为静态成员变量,静态成员变量在类内声明,但必须在类外初始化

class A
{
public:private://类中声明static int a;
};//类外初始化
int A::a = 1;

2、

静态成员变量是属于所有该类的对象的,而不是专属于某一个对象,它不存在对象中,存放于静态区


3、

静态成员变量不能在声明处给缺省值,因为静态成员变量不走初始化列表,由前文可知:给成员变量的缺省值是给初始化列表

class A
{
public:private://类中声明static int a;//static int a = 1;//error:不能再类中初始化
};//类外初始化
int A::a = 1;

静态成员函数:

1、

用static修饰的成员函数,它没有this指针,而且它不能使用类型限定符

2、

因为它没有this指针,所以它只可以访问静态成员函数和静态成员变量,非静态成员是不能访问的

3、

非静态成员可以任意访问静态成员

注:静态成员也受访问限定符的限制

代码:

class A
{
public:A(){a++;}void Print() const{cout << a << endl;}//static int GetA() const//静态成员函数不能使用类型限定符static int GetA(){return a;}
private://类中声明static int a;//static int a = 1;//error:不能再类中初始化
};//类外初始化
int A::a = 1;int main()
{/*cout << A::a << endl;*/cout << A::GetA() << endl;A a1;a1.Print();cout << a1.GetA() << endl;A a2;a2.Print();return 0;
}

友元

1、友元提供了⼀种突破类访问限定符封装的⽅式,友元分为:友元函数和友元类,在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。

2、外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数

3、友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。

4、⼀个函数可以是多个类的友元函数。

5、友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。

6、友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。

7、友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。

内部类

这一部分了解就可以了

一个类被定义在另一个类中,就叫做内部类

class A
{
public:class B//内部类{};
};int main()
{A::B b1;return 0;
}

内部类是一个独立的类,它和定义在全局的类的相比就只是会被外部类的类域和访问限定符的限制,所以外部类实例化的类中不包含内部类

内部类在C++中用的比较少,在Java中用得较多

匿名对象

特点:

1、

用类型定义出来的对象就叫做匿名对象,而我们之前定义的类型对象是叫有名对象

A();//匿名对象

2、

匿名对象的生命周期只在当前这一行,如果当需要临时定义一个对象使用,就可以定义匿名对象

3、使用场景

1、在调用成员函数时:

class A
{
public:int f1(){return _a;}private:int _a = 1;
};int main()
{//之前A a1;cout << a1.f1() << endl;//使用匿名对象cout << A().f1() << endl;return 0;
}

2、做缺省参数

void f2(const A& a = A())//做缺省值
{}

4、

匿名对象具有常性

class A
{
public:A():_a(1){}
private:int _a;
};int main()
{const A& a1 = A();return 0;
}

5、匿名对象和临时对象的区别

匿名对象是我们主动创建的,而临时对象是编译器创建的

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

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

相关文章

Android设备是如何进入休眠的呢?

首先我们手机灭屏后&#xff0c;一般需要等一段时间CPU才真正进入休眠。即Android设备屏幕暗下来的时候&#xff0c;并不是立即就进入了休眠模式&#xff1b;当所有唤醒源都处于de-avtive状态后&#xff0c;系统才会进入休眠。在手机功耗中从灭屏开始到CPU进入休眠时间越短&…

多线程知识概述

目录 1. 基本知识概述 2. 多线程概述 2.1 优点 2.2 使用场景 3. 创建线程 3.1 继承 Thread 类 3.2 实现 Runnable 接口 3.3 比较 3.4 创建 Callable 接口 3.5 使用线程池 4. Thread 类常用方法 5. 线程生命周期 6. 线程安全机制 6.1 同步代码块 6.2 同步方法 6.3 …

elasticsearch是哪家的

Elasticsearch&#xff1a;数据搜索与分析的领航者 在当今这个信息爆炸的时代&#xff0c;快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…

Spring学习笔记:工厂模式与反射机制实现解耦

1.什么是Spring? spring是一个开源轻量级的java开发应用框架&#xff0c;可以简化企业级应用开发 轻量级 1.轻量级(对于运行环境没有额外要求) 2.代码移植性高(不需要实现额外接口) JavaEE的解决方案 Spring更像是一种解决方案&#xff0c;对于控制层&#xff0c;它有Spring…

【一个月备战蓝桥算法】递归与递推

字典序 在刷题和计算机科学领域&#xff0c;字典序&#xff08;Lexicographical order&#xff09;也称为词典序、字典顺序、字母序&#xff0c;是一种对序列元素进行排序的方式&#xff0c;它模仿了字典中单词的排序规则。下面从不同的数据类型来详细解释字典序&#xff1a; …

前端学习——CSS

CSS CSS&#xff08;Cascading Style Sheets&#xff09;级联样式表语法 选择器全局选择器元素选择器类选择器ID选择器合并选择器选择器的优先级 字体属性字体颜色 背景属性background-color属性background-image属性background-repeat属性background-size属性background-posit…

【Python 2D绘图】Matplotlib绘图(统计图表)

【Python 2D绘图】Matplotlib绘图&#xff08;统计图表&#xff09; 1. 概述1.1 简介1.2 安装1.3 导入1.4 保存1.5 数据来源1.5.1 Numpy ndarray1.5.2 Pandas DataFrame 1.6 中文显示 2. 基础样式2.1 颜色2.1.1 简称2.1.2 全称 2.2 布局2.2.1 Matplotlib 画布划分2.2.2 绘制子图…

学习笔记:Python网络编程初探之基本概念(一)

一、网络目的 让你设备上的数据和其他设备上进行共享&#xff0c;使用网络能够把多方链接在一起&#xff0c;然后可以进行数据传递。 网络编程就是&#xff0c;让在不同的电脑上的软件能够进行数据传递&#xff0c;即进程之间的通信。 二、IP地址的作用 用来标记唯一一台电脑…

Spark-TTS:基于大模型的文本语音合成工具

GitHub&#xff1a;https://github.com/SparkAudio/Spark-TTS Spark-TTS是一个先进的文本到语音系统&#xff0c;它利用大型语言模型&#xff08;LLM&#xff09;的强大功能进行高度准确和自然的语音合成&#xff1b;旨在高效、灵活、强大地用于研究和生产用途。 一、介绍 Sp…

【RAG】检索后排序 提高回答精度

问题: RAG中&#xff0c;有时&#xff0c;最合适的答案不一定排在检索的最前面 user_query "how safe is llama 2" search_results vector_db.search(user_query, 5)for doc in search_results[documents][0]:print(doc"\n")response bot.chat(user_qu…

线程安全问题(面试重难点)

这里只是简单介绍以下线程安全,具体情况要结合代码进行判断 线程 是随机调度,及 抢占式执行 ,具有随机性,就可能会让我们的结果出现不同 当我们得到的结果并不是我们想要的时候(不符合需求),就会被认定为BUG,此时就是出现了线程安全问题 那么存在线程不安全的代码就被认为是…

数据结构第七节:红黑树(初阶)

【本节要点】 红黑树概念红黑树性质红黑树结点定义红黑树结构红黑树插入操作的分析 一、红黑树的概念与性质 1.1 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red和 Black 。 通过对 任何…

读书报告」网络安全防御实战--蓝军武器库

一眨眼&#xff0c;20天过去了&#xff0c;刷完了这本书「网络安全防御实战--蓝军武器库」&#xff0c;回味无穷&#xff0c;整理概览如下&#xff0c;可共同交流读书心得。在阅读本书的过程中&#xff0c;我深刻感受到网络安全防御是一个综合性、复杂性极高的领域。蓝军需要掌…

从传统到智能:Node-red工控机助力农业大棚高效监控

智慧农业逐渐成为现代农业发展的主流方向。在这一背景下&#xff0c;农业用工控机&#xff08;简称“农控机”&#xff09;作为智慧农业的核心设备之一&#xff0c;正在为农业大棚的智能化管理提供强有力的支持。本文将详细探讨农控机在智慧农业大棚监控中的应用&#xff0c;并…

硬件学习笔记--48 磁保持继电器相关基础知识介绍

目录 1.磁保持继电器工作原理 2.磁保持继电器内部结构及组成部分 3.磁保持继电器主要参数 4.总结 1.磁保持继电器工作原理 磁保持继电器利用永磁体的磁场和线圈通电产生的磁场相互作用&#xff0c;实现触点的切换。其特点在于线圈断电后&#xff0c;触点状态仍能保持&#…

WOA-Transformer鲸鱼算法优化编码器时间序列预测(Matlab实现)

WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09; 目录 WOA-Transformer鲸鱼算法优化编码器时间序列预测&#xff08;Matlab实现&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现WOA-Transformer鲸鱼算法优化编…

K8S学习之基础十九:k8s的四层代理Service

K8S四层代理Service 四层负载均衡Service 在k8s中&#xff0c;访问pod可以通过ip端口的方式&#xff0c;但是pod是由生命 周期的&#xff0c;pod在重启的时候ip地址往往会发生变化&#xff0c;访问pod就需要新的ip地址&#xff0c;这样就会很麻烦&#xff0c;每次pod地址改变就…

R语言的基础命令及实例操作

> T & F [1] FALSE > T & T [1] TRUE > T | F [1] TRUE > F | F [1] FALSE > a <- c(T,F,T) > b <- c(F,F,T) > a & b [1] FALSE FALSE TRUE > a | b [1] TRUE FALSE TRUE 在 R 中&#xff0c;大小写是敏感的&#xff0c;也就是说…

LLM 模型 Prompt 工程

目录 1、Prompt 基础概念 2、Prompt 主要构成 3、Prompt 相关技术 3.1、思维链 3.2、自洽性 3.3、思维树 1、Prompt 基础概念 Prompt 工程是通过设计和优化自然语言提示&#xff08;Prompt&#xff09;&#xff0c;引导LLM生成符合特定任务需求的输出的技术。其核心目标是…

Springboot基础篇(4):自动配置原理

1 自动配置原理剖析 1.1 加载配置类的源码追溯 自动配置的触发入口&#xff1a; SpringBootApplication 组合注解是自动配置的起点&#xff0c;其核心包含 EnableAutoConfiguration&#xff0c;该注解使用AutoConfigurationImportSelector 实现配置类的动态加载。 启动类的注…