C++入门基础知识2

news2024/9/22 13:42:24

1.引用

1.1引用的使用

1.引用在实践中主要是引用传参和引用做返回值中减少拷贝提高效率和改变引用对象时同时改变被引用对象

2.引用传参跟指针传参功能是类似的,引用传参相对更方便一些

3.引用和指针在实践中相辅相成,功能有重叠性,各有特点

在函数返回值类型的后面加&,即返回的是引用,实体是返回的值,那么在main函数里本来栈顶的数据是1,通过把4赋值给栈顶,则栈顶的数据就变为4而不是1,因为别名就是跟栈顶的数据是一样的,有相同的地址,改变一个都会改变,若不加&则返回的是一个临时变量,就是拷贝了一个与返回值一样的大小的数据,而赋值4给临时变量就会出错,临时变量生命周期用完就没了,当别名的实体是临时变量时,要加const,而这样临时变量的生命周期就会改变,当别名销毁时,这个临时变量就会销毁。

int& STTop(ST& rs)
{
	assert(rs.top > 0);
	return rs.a[rs.top-1];
}

int main()
{
	调用全局的
		ST st1;
	STInit(st1);
	STPush(st1, 1);
	STPush(st1, 2);

	STModityTop(st1, 3);

	STTop(st1) = 4;

}

表达式的返回值一个临时变量,具有常性,生命周期会被const影响,就是当别名是const,这个临时变量就不会马上销毁,当引用的销毁了这个临时变量才销毁

1.2const引用

1.可以引用一个const对象,但是必须用const引用。const也可以引用普通对象,因为对象的访问权限可以在引用的过程缩小,但是不能放大。

2.int& rb=a*3;double d=12.34;int& rd=d;a*3是一个表达式,是存储在一个临时变量中,就是说rb的引用对象是临时对象,而c++规定临时对象具有常性,所以这里触发了权限放大(常性是常量的特性,不能被修改,而引用没有const,就说明引用可以改变这个常量,权限被放大了),必须要用常引用才可以。(权限不可以放大,但是可以缩小,int b=1;const int& rb=b;)

3.临时对象就是编译器需要一个空间暂存表达式的求值结果时临时创建的一个未命名的对象,c++中把这个未命名对象叫做临时对象

4.在类似转换时会发生隐式转换,有临时变量,例如int a=10 是常量10拷贝放到整形变量a里面,函数返回值也会有临时变量

2.内联函数

1.用inline修饰的函数叫做内联函数,编译时c++编译器会在调用的地方展开内联函数,调用内联函数就不需要建立栈帧了,可以提高效率。

#define Add(a,b) ((a)+(b))
int main()
{
	int ret = Add(1, 2);
	//宏定义后面不加分号是因为下面有报错
	//cout << Add(1, 2); << endl;
	//之所以要加外面的括号是防止优先级导致结果错
	cout << Add(1, 2) * 5 << endl;
	//之所以里面加括号也是优先级会影响
	Add(1 & 2, 3 & 4);
	return 0;
}

2.inline对于编译器而言只是一个建议,你加了inline编译器也可以选择在调用的地方不展开,不同编译器关于inline什么情况是不同的(代码的行数),c++为规定这个。inline适用于频繁调用的短小函数,对于递归函数,代码多一点的函数,加上inline也会被编译器忽略掉。

3.C语言实现宏宏函数也会在预处理时替换展开,但是宏函数实现很复杂且容易出错,不方便调试,C++设计inline目的是替换C的宏函数

4.vs编译器debug版本下默认是不展开inline的,这样方便调试,debug版本想展开需要设置一下

5.inline不建议声明和定义分离到俩个文件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会报错。

3.指针空值nullptr

在C语言中NULL实际上是一个宏,在传统的C头文件(stddef.h)里,可以看到下面的代码:

#ifndef NULL
#ifdef __cplusplus
#define NULL   0
#else
#define NULL   ((void *)0)
#endif
#endif

NULL可能被定义为字面常量0,或者定义为无类型指针(void*)的常量。下面是使用NULL遇到的麻烦,比如:

void Fun(int x)
{
	cout << "f(int)" << endl;
}
void Fun(int* x)
{
	cout << "f(int *)" << endl;
}
int main()
{
	Fun(0);
	Fun(NULL);
	//Fun((void*)0);
	return 0;
}

可以看到俩个都是int,NULL为参数并没有打印int*,而(void*)0就会报错,因为俩个参数都不符合,要隐式转换,不知道进哪一个函数里面,所以NULL设计的有些不合理,于是有了nullptr,

C++11中引入nullptr,nullptr是一种特殊关键字,nullptr是一种特殊类型的字面量,它可以转换成任意其它类型的指针类型。使用nullptr定义指针可以避免类型转换的问题,因为nullptr只能被隐式转换成指针类型,而不能转换为整数类型。

 

4.类

4.1类的引入

C语言结构体只能定义变量,在C++中,结构体不仅可以定义变量,也可以定义函数。

C语言用的是struct,而C++用class来代替,也可以使用struct。

4.2类的定义

class className
{
// 类体:由成员函数和成员变量组成
};   // 一定要注意后面的分号

class为定义类的关键字,className为类的名字,{}为类的主体,注意类定义结束时后面的分号不能省略。

类体中内容为类的成员:类中的变量为类的属性或成员变量;类中的函数称为类的方法或者成员函数。

类的俩种定义方式:

1.声明和定义全部放在类体中,注意的是在类中定义的成员函数会被当做内联函数处理

下面定义一个类:

class person
{
public:
	void ShowInfo()
	{
		cout << _name << _sex << _age << endl;
	}
private:
	char* _name;
	char* _sex;
	int _age;
};

int main()
{
	
	return 0;
}

也可以把成员函数的实现放在另一个文件里面。

4.3类的访问限定符及封装

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

访问限定符说明:

1.public修饰的成员在类外可以被访问

2.protected和private修饰的成员在类外不能直接被访问

3.访问权限作用域从该访问限定符出现的位置开始到下一个访问限定符出现时为止

4.如果后面没有访问限定符,作用域到}结束

5.private默认权限为private,struct默认为public

4.4类的实例化

用类类型创建对象的过程,称为类的实例化

1.类是对象进行描述的,是一个模型一样的,限定了类有那些成员,定义出一个类并没有分配实际的内存空间来存储它

2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,并存储类成员变量

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

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

相关文章

[论文笔记]构建基于RAG聊天机器人的要素

引言 今天带来一篇构建RAG的论文笔记&#xff1a;FACTS About Building Retrieval Augmented Generation-based Chatbots。 基于生成式人工智能构建企业聊天机器人迅速成为行业中最受关注的应用之一&#xff0c;旨在提高员工生产力。 然而&#xff0c;构建成功的企业聊天机器…

【LeetCode】2187. 完成旅途的最少时间

1. 题意 2. 分析 二分法有一个关键特征&#xff1a;如果答案answer满足题意&#xff0c;那么对于任何整数i&#xff0c;如果有i>answer&#xff0c;那么i也会是一个存在的解&#xff0c;只不过不是最优解。 本题想要找出一个达到 totalTrips 趟需要的最少时间成本t&#x…

如何入门单片机嵌入式?

入门单片机嵌入式系统开发可以按照以下步骤进行。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&#xff0c;敲个22就可以免费获得。 选择单片机开发板&…

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

FakeNewsGPT4: Advancing Multimodal Fake News Detection through Knowledge-Augmented LVLMs 论文地址:https://arxiv.org/abs/2403.01988https://arxiv.org/abs/2403.01988 1.概述 当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性…

input 输入框,带清空图标

https://andi.cn/page/621495.html

虚幻引擎ue5游戏运行界面白茫茫一片,怎么处理

根剧下图顺序即可调节游戏运行界面光照问题&#xff1a; 在大纲里找到post&#xff0c;然后选中它&#xff0c;找到Exposure 把最低亮度和最高亮度的0改为1即可

【算法】代码随想录之链表(更新中)

文章目录 前言 一、移除链表元素&#xff08;LeetCode--203&#xff09; 前言 跟随代码随想录&#xff0c;学习链表相关的算法题目&#xff0c;记录学习过程中的tips。 一、移除链表元素&#xff08;LeetCode--203&#xff09; 【1】题目描述&#xff1a; 【2】解决思想&am…

JS登录页源码 —— 可一键复制抱走

前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…

el-table 动态添加删除 -- 鼠标移入移出显隐删除图标

<el-table class"list-box" :data"replaceDataList" border><el-table-column label"原始值" prop"original" align"center" ><template slot-scope"scope"><div mouseenter"showClick…

电脑如何重新分盘——保姆级教程

方法一&#xff1a; 通过此电脑&#xff0c;鼠标右键点击此电脑&#xff0c;点击管理 点击磁盘管理进入 二&#xff0c;磁盘分区 我这里选择的是“磁盘0”的C盘进行操作&#xff0c;一般新电脑拿到手的时候都处于这么一个状态&#xff0c;只有一个磁盘分区。现在我要把C盘拆分…

翻译语音识别在线的软件,分享4款实用的软件!

在全球化日益加速的今天&#xff0c;语言沟通已成为人们生活中不可或缺的一部分。无论是商务洽谈、学术交流还是日常交流&#xff0c;翻译语音识别技术都扮演着举足轻重的角色。今天&#xff0c;我们就来揭秘一下&#xff0c;那些能让你在语言沟通中如虎添翼的翻译语音识别软件…

LCM通讯的使用

本文主要介绍LCM通讯的基本使用&#xff0c;内容主要整理自官网 https://lcm-proj.github.io/lcm/index.html LCM&#xff0c;即Library for Communication and Marshalling&#xff0c;是一组用于消息传递与数据封装的库和工具&#xff0c;它主要的面向对象是要求高带宽、低延…

[Elasticsearch]ES近似实时搜索的原因|ES非实时搜索的原因|ES Near real-time search

Elasticsearch-专栏&#x1f448;️ 往期回顾&#xff1a; ES单一查询定义&#x1f448;️ ES深分页问题&#x1f448;️ ES商城搜索实战&#x1f448;️ ES环境搭建:单节点模式/集群模式&#x1f448;️ ES开启认证&#x1f448;️ 近似实时搜索&#xff08;Near real-t…

稀疏辅助信号平滑方法在一维信号降噪和旋转机械故障诊断中的应用(MATLAB)

基于形态成分分析理论&#xff08;MCA&#xff09;的稀疏辅助信号分解方法是由信号的形态多样性来分解信号中添加性的混合信号成分&#xff0c;它最早被应用在图像处理领域&#xff0c;后来被引入到一维信号的处理中。在基于MCA稀疏辅助的信号分析模型中&#xff0c;总变差方法…

自定义“请求头”

请求头是HTTP请求的重要部分&#xff0c;可以用“头部字典”按需定制请求头。 (笔记模板由python脚本于2024年07月12日 19:28:44创建&#xff0c;本篇笔记适合喜欢钻研web知识点的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free…

JavaDS —— 栈 Stack 和 队列 Queue

栈的概念 栈是一种先进后出的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶&#xff0c;另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子&#xff1a; 栈的模拟实现 下面是Jav…

mysql和oracle数据库的备份和迁移

本文主要讲述了mysql数据库的备份和迁移&#xff1b;oracle的肯定是备份和数据迁移&#xff0c;同时介绍了linux的定时任务。 一、mysql Docker容器下mysql备份方法 1、数据库备份 # 进入容器docker exec -it 《containerId容器id》 /bin/bash# mysqldump命令备份并生成数据…

02MFC画笔/画刷/画椭圆/圆/(延时)文字

文章目录 画实心矩形自定义画布设计及使用连续画线及自定义定义变量扇形画椭圆/圆输出颜色文本定时器与定时事件 画实心矩形 自定义画布设计及使用 连续画线及自定义定义变量 扇形 画椭圆/圆 输出颜色文本 定时器与定时事件

近期matlab学习笔记,学习是一个记录,反复的过程

近期matlab学习笔记&#xff0c;学习是一个记录&#xff0c;反复的过程 matlab的mlx文件在运行的时候&#xff0c;不需要在文件夹路径下&#xff0c;也能运行&#xff0c;但是需要调用子函数时&#xff0c;就需要在文件所在路径下运行 那就先运行子函数&#xff0c;把路径换过来…

【STM32CubeMX安装教程】

【STM32CubeMX安装教程】 1. 前言2. 下载软件3. 安装配置4. 测试5. 小结 1. 前言 STM32CubeMX是一款图形化工具&#xff0c;可以非常轻松地配置STM32微控制器和微处理器&#xff0c;以及为Arm Cortex-M内核生成相应的初始化C代码&#xff0c;或为Arm Cortex-A内核生成部分Linu…