C++入门基础知识2

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.mzph.cn/bicheng/45738.shtml

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

相关文章

嵌入式C++、Qt/QML和MQTT:智能工厂设备监控系统的全流程介绍(附代码示例)

1. 项目概述 本项目旨在开发一套先进的智能工厂设备监控系统&#xff0c;集成嵌入式技术、工业通信协议和人机界面等多项技术&#xff0c;实现对工厂设备的全方位实时监控、高精度数据采集和智能化分析。该系统将显著提升工厂设备的运行效率&#xff0c;大幅降低维护成本&…

基于AT89C51单片机的16×16点阵LED显示器字符滚动显示设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 仿真效果图 仿真图 代码 系统论文 资源下载 设计的内容和要求 熟悉51系…

Python练习题(3)

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用文件流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import requests import jsondef copy(src, dst):read_file o…

【typedb】例子:药物发现 1: 模式导入

typedb-examples/drug-discovery/ Drug discovery监听0.0.0.0:1729 但这么连接肯定不行: localhost:1729 可以: 一直无法点击schema图标:先创建一个数据库 选中数据库: 选中后就可以了:

我的第128天创作纪念日

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;初阶数据结构笔记专栏&#xff1a; 初阶数据结构笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章…

演示:【Avalonia-Controls】Avalonia皮肤,主题,自定义控件,数据库,系统模块资源库

一、目的&#xff1a;分享一个Avalonia皮肤&#xff0c;主题&#xff0c;自定义控件&#xff0c;数据库&#xff0c;系统模块资源库 开源地址&#xff1a; GitHub - HeBianGu/Avalonia-Controls: Avalonia控件库 Nuget包地址&#xff1a; NuGet Gallery | Packages matchin…

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

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

大模型时代的目标检测

https://zhuanlan.zhihu.com/p/663703934https://zhuanlan.zhihu.com/p/6637039341.open set/open word/ood 这个任务是指在实际应用上可以检测任何前景物体&#xff0c;但是有些不需要预测类别&#xff0c;只要检测出框就行。在很多场合也有应用场景&#xff0c;有点像类无关…

力扣 爬楼梯

动态规划算法基础篇。 class Solution {public int climbStairs(int n) {int[] f new int[n 1];f[0] 1;f[1] 1;//当爬到n阶楼梯时&#xff0c;可知是由n-1阶或n-2阶楼梯而来for(int i 2; i < n; i) {f[i] f[i - 1] f[i - 2];//后面的每一阶种数由前两个状态得到}ret…

Milvus 核心设计 (3) ---- metric及index原理详解与示例(1)

目录 背景 Floating point embeddings 特点 适用场景 丈量方式 Euclidean distance (L2) Inner product (IP) Cosine similarity (COSINE) 代码写法 索引类型 In-Memory FLAT 索引 IVF_FLAT IVF_FLAT的工作流程 平衡准确性与速度 性能考虑 代码写法 IVF_SQ8 …

栈和队列 OJ (一)

括号匹配问题 题目链接&#xff1a; https://leetcode.cn/problems/valid-parentheses/ 遇到左括号入栈&#xff0c;遇到右括号&#xff0c;我们就出栈看看括号是否匹配 这里要注意如果左括号多于右括号的情况下&#xff0c;字符串循环遍历结束时&#xff0c;栈不为空&#x…

Android --- Kotlin学习之路:自己写一个SDK给别的APP用(暴漏一个接口,提供学生的身高数据)

今天又来肝kotlin了&#xff0c;主题是&#xff1a;用kt写一个SDK给其他人用&#xff0c;这个小技能在项目中会经常用到&#xff0c;应该有很多小伙伴还不会用&#xff0c;不会的请往下看—⬇ 在项目里面新建一个module 选择Android library&#xff0c;然后点击finish就行了 …

【Java】二维数组

文章目录 一、什么是二维数组二、二维数组的声明形式三、二维数组的创建(1)静态初始化(2)动态初始化 四、二维数组的输入五、二维数组在内存中的存储方式 一、什么是二维数组 一维数组的声明是int[] arr&#xff0c;int[] arr {0,1,2,3,…};通过一维数组的形式和表达式 我们…

window下tqdm进度条

原代码是linux下运行&#xff0c;修改后可在window下运行。 #ifndef TQDM_H #define TQDM_H#include <chrono> #include <ctime> #include <numeric> #include <ios> #include <string> #include <cstdlib> #include <iostream> #i…

WordPress 主题技巧:给文章页增加“谁来过”模块。

模块功能&#xff1a; 我个人目前在做一个电影类的网站&#xff0c;在开发文章页的模版时候&#xff0c;突然觉得给文章页增加一个“谁对本电影感兴趣”的功能模块可能会比较有趣&#xff0c;这个功能有点类似于‘足迹’的感觉&#xff0c;用户可以通过这个功能&#xff0c;发…

前端的页面代码

根据老师教的前端页面的知识&#xff0c;加上我也是借鉴了老师上课所说的代码&#xff0c;马马虎虎的写出了页面。如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

k8s 部署 metribeat 实现 kibana 可视化 es 多集群监控指标

文章目录 [toc]环境介绍老(来)板(把)真(展)帅(示)helm 包准备配置监控集群获取集群 uuid生成 api_key配置 values.yaml 配置 es 集群获取集群 uuid 和 api_key配置 values.yaml 查看监控 缺少角色的报错 开始之前&#xff0c;需要准备好以下场景 一套 k8s 环境 k8s 内有两套不同…

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

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

从汇编层看64位程序运行——参数传递的底层实现

大纲 小于等于6个参数一个参数总结 两个参数总结 三个参数总结 四个参数总结 五个参数总结 六个参数总结 大于6个参数七个参数总结 在32位系统中&#xff0c;参数的传递主要依靠栈来进行。那么64位系统上&#xff0c;是否依旧符合这个规则呢&#xff1f;答案是“不是”。64位系…

FFmpeg开发环境搭建

FFmpeg是音视频开发必备的库&#xff0c;也是唯一的库。本文主要讲解在ubuntu22和macOS14环境下的编译安装。 为什么要自己编译呢&#xff1f;其中一个很重要的原因就是ffmpeg在编译时可以加入很多插件&#xff0c;这种特定的库网络上可能找不到编译好的版本&#xff0c;另外如…