C++入门知识点(2)

本文介绍了C++中的内联函数如何提高效率,auto关键字的自动类型推断,基于范围的for循环简化数组遍历,以及类和对象的概念,包括this指针的工作原理。
摘要由CSDN通过智能技术生成

前言

上期我们讲到了传值和传引用的效率比较,今天我们继续.

一.内联函数

在C语言中我们学习了宏,但是宏在使用过程中存在一些缺点,如直接替换,不能调试,没有安全类型的检查,所以在C++中就创造了内联函数。

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率
看第一张图片中call了Add函数,但是第二张图片就是直接将Add函数展开,效率更高,同时也避免了宏的一些麻烦之处,但是也有不足的地方,inline比较于函数而言,是空间换时间,因为要在编译时展开,所以会形成更大的文件。
在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不
会对代码进行优化,我演示一下vs2022的方法
看到最后一排的属性,点击。
还要注意的一点就是,inline函数只是给编译器一个建议,不同的编译器实现inline的机制不同,一般建议函数规模较小,不是递归,且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性,我们可以演示一下
大家可以看一下,小编还只写了10多行,他就把inline特性忽略了
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址
了,链接就会找不到

二.auto关键词(C++11)

我们在c语言中接触过简单的变量类型,也接触过复杂的变量类型,面对复杂的变量类型,我们总要思考一小会才能确定下来,所以在C++中就创造了auto这个关键词,我们学过一个英文单词automatic,意思为自动的,那就让我们来看一下他有哪些用处吧

我们可以看到auto能够自动识别变量的类型,从而接收变量,但是使用auto定义变量必须初始化。

我们来看这个,大家想想b和c的类型是否一样,我给大家提供一个查看变量类型的函数

typeid(变量名).name()

我们可以看到,b和c的类型是一样的,有*只是给你显示出它是指针类型,同样有&也只是表示他是变量a的一个别名。
如果你想在同一行使用auto定义多个变量,那么这些变量必须都是相同类型,否则就会报错
还要两个在使用auto需要注意的地方
1.auto不能作为函数的参数
2.auto不能用来声明数组

三.基于范围的for循环

以前我们在使用C语言的时候想打印数组中的元素,我们是不是下面这么做的呢?

今天小编就带大家用一种更简单的方式去打印一个数组

首先我们要明白,对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因 此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范 围内用于迭代的变量,第二部分则表示被迭代的范围。
我们再来看一段代码
我们来分析一下上面的代码,明明我们把e*=2了,为何数组里面的值还没有变呢,我来告诉大家,其实这个e的值是赋值给他的,它并不是代表arr中真正的那个元素,所以就是把它*=2,arr数组中的值也不会改变,那么我们如何才能让arr数组中的值改变呢?我们上期不是学过引用嘛?可以试一试
注意:与普通循环类型,也可以使用continue来结束本次循环,也可以用break来跳出整个循环

四.类和对象

我们要知道C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。

C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完
成。
在C语言的结构体中,我们只能定义变量,但是在C++的结构体中,我们还能还能够定义函数
在C++中我们一般用class代替struct,class就是类的关键词,{}中的内容就是类的主体,注意类结束后的分号不能省略,类主体中的变量被称为成员变量或类的属性,类中的函数被称为类的方法或是成员函数
大家在定义类的时候 最好是把声明放在.h的文件中,把定义放在.cpp的文件中
类的访问限定符
public修饰的成员是可以在类外进行访问,但是protect和private修饰的成员不能在类外访问
class的默认访问权限是private,意思是如果你在你的类中没有写访问限定符,那么就不能在类外面访问类中的成员,而 struct的默认访问限定符是public,因为我们在学习c语言的时候就没有这样的限制,使用为了兼容C,就能够访问类中的成员
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 ::
作用域操作符指明成员属于哪个类域
但是如果我将func的声明放在private中,那么即使你用作用域操作符也不能访问func,大家可以自己试一试
类的实例化
对于一个类,他只是一个模型,限定了这个类有哪些成员,并没有实际的空间,就好像一个类型一样,你得使用它去创造一些变量一样,下面的图片中我用类的名字直接访问_year就会报错,但是当我创建一个变量后就不会了。

五.this指针

我们首先创建一个日历

那么类里面的这个Init函数是怎么知道是d1还是d2调用它的呢,我们原来在对结构体成员进行初始化的时候,我们都会把结构体变量的地址传过去,但是这里也没有传地址,那究竟是怎么回事呢?其实在这里编译器自动帮我们把d1和d2的地址传了过去,只是没有给用户们看到,这个接收地址的指针称为this指针,类型是const*

大家看,就算我们使用this指针编译器也不会报错,但是如果我们知道隐藏的this指针我们可以不写

那么this指针存放在哪里呢?this指针可以为空吗?

留给大家思考,欢迎大家在评论区下方留言!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZENG zhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值