C++基础入门一

目录

写在前面的话

一,命名空间

1.1命名空间的定义

1.2命名空间的使用

二,标准输入输出

三,缺省参数

四,重载

4.1重载实现

4.2重载只在C++中

五,引用

5.1引用做参数

5.2引用做返回值

5.3常引用

5.4引用和指针的区别

六,内联函数

tips:为什么宏不好?

七,auto关键字

auto使用注意事项:

八,范围for


写在前面的话

小伙伴们大家好啊!这里是小菜鸡库森,今天为大家带来的是有关C++基础知识的一些内容,因为我们知道,对于C语言来说,其实在有些地方是比较不方便且很难实现的,所以前辈们在C语言的基础上进行了一系列的改进,最后得到了C++。好的,那么接下来我们一起看看吧!

 

一,命名空间

那么首先我们思考这样一个问题,在我们现有的C语言程序中,大家有没有发现有一些函数名 ,变量名以及C++中的类,其实都有一个问题,就是命名冲突问题,因为这些变量等的名字可能很多,每个人写的最后连接到一起都是重复的。

 

1.1命名空间的定义

所以C++这里提出了一个命名空间的概念,来将我们的变量,函数等限制在一个区域。从而有效地避免命名污染或命名冲突的问题,实现了对标识符的名称本地化。这也就是关键字namespace的作用。

如下图所示,这里有两个空间分别是 A 和 N,A 空间嵌套在 N 空间中。

1.2命名空间的使用

如果我们想在主函数中(空间外)访问空间内成员,此时我们就需要通过域作用限定符(::)来访问。当然,对于嵌套命名空间来说,也是需要通过逐层域作用限定符来访问的。

那么除此之外,还可以使用 using 或者using namespace 将命名空间成员引入。如下图所示:

二,标准输入输出

那么对于C++来说,提出了一种相较与C语言更方便的输入(cin)输出(cout),在使用时,必须包含头文件<iostream>,以及标准命名空间 std 。

那么如上图所示,cout 和 cin 在输入输出时,是不需要选择判断类型的,这是他们的优势所在,但是也不一定他们就一定是有优势的,因为在有些地方的输出,必须得按照一定的规则,这样cout就显得比较繁琐了。

三,缺省参数

缺省参数就是在函数声明或者定义的时候,给函数参数指定一个参数值,在函数调用时,如果没有指定参数值,则采用该默认值。

如上图所示,一般情况下都会有两种形式的缺省值传递。全缺省和半缺省,那么全缺省就是对于所有的形参都给了缺省值,而对于半缺省而言就是对一部分形参给了缺省值。

注意:

1.如果是半缺省的话,形参的值必须从右往左依次给,不能任意给。同时,在函数调用传递参数的时候,形参没有给缺省值的参数有几个,那么需要传递的参数就有几个。

2.不能在函数定义和声明的地方同时给缺省值,因为如果都给了,恰巧还不一样,那么函数就不知道用哪个参数值了。

3.缺省值一定是常量或者全局变量,否则报错。

4.C语言是没有缺省值的概念的。

四,重载

4.1重载实现

在C++中,存在这样一种情况,在一定的作用域内,一些函数除了函数名相同之外,形参的个数,形参的类型,形参的位置这三者中一定是互斥存在的。

那么在C++中的这些函数就构成了重载,如上图所示。

4.2重载只在C++中

那么如题目所说,重载只在C++中有,那为什么C语言中没有重载呢?

其实通过我们的观察,可以看到,上面所示的三个重载函数,他们的区别是三个函数的参数都是不同的,这其实也就是根本原因了:在C/C++中,当在程序编译的最后一个环节链接环节时,链接器会根据函数的地址去找函数,然后再将该函数链接在一起。

那么链接时,链接器会通过那个函数名的地址去找呢?

这里C++和C语言就有不同了。在C语言中,它的函数名修饰规则是仅仅将函数名作为一个标识符存在某个地址上;而在C++中,它的函数名修饰规则是比较复杂的,比如在linux环境下,它的函数名修饰规则是:_Z+函数长度+函数名+类型首字母。

所以当程序链接时,C++对于重载函数的修饰会导致每个重载函数生成的函数名都不一样,当然最后的地址都不一样了;而对于C语言来说,因为对于每个函数仅仅只是函数名决定,导致最后几个函数是一样的地址,那就必然会出错了。

所以我们知道了,因为C语言和C++对于函数名的修饰规则是不一样的,而C++的修饰规则决定了它的程序可以实现重载函数。

五,引用

在语法上来说,引用就是给已经存在的变量取一个别名,没有开辟新空间,它和引用的变量共用同一块空间。

如下图所示:

 这里的 p2 就是 p1 的别名,我们将其称为引用,而 p3 则是指向 p1 指向空间的一个指针。

那么其实在这里来看的话,引用和指针在用处上貌似没有什么区别,因为他们都是表示了一个空间。是的,这里来看的话,确实是没有什么实际的用处的,那么对于引用来说,其实主要用在连个方面。

5.1引用做参数

我们知道,函数在传递参数的时候,有两种形式,传值和传址,如果是传值的话,是需要进行拷贝的,如果是传址,那么就需要新开辟指针来接收实参。

而如果我们用引用传参的话,我们可以在形参前面加上 & ,表示引用,这样形参就是实参的一个别名,也就是说此时的形参就是实参,那么对形参进行改变,也就是对实参进行改变。

5.2引用做返回值

因为函数一旦返回之后,其刚开辟的函数栈帧是会销毁回收的,所以返回值如果能够返回,那么一定是额外存了下来,其实对于函数返回值来说,一般是有两种存储形式的。

1.函数返回值如果比较小,比如在 4个字节或者 8 个字节范围内,是存放在寄存器里面的

2.如果返回值太大,在寄存器里面放不下,那么就需要在该函数栈帧里面开辟空间存放。

那么也就是说,一定存在额外的内存消耗。那么如果我们用引用将返回值返回,也就不存在额外消耗空间了。但是这里需要注意,函数中最后需要返回的值,一旦出了作用域就会销毁,也就是说,如果我们通过引用直接将返回值传递回去,不进行拷贝,同时这个变量是局部变量,那么此时就存在非法访问内存的问题了。

所以这个变量一定是全局变量或者静态变量。

事实上,我们就是这么做的: 

而且对于传值返回来说,它的效率是非常低的,因为不管是那种形式的拷贝,都需要付出一定的代价,而如果是传引用就会省去这些步骤,效率就会高很多。

5.3常引用

如果我们在引用的时候,不想我们引用的对象发生改变的话,那么我们就需要在引用前面加上const 来修饰,保证我们的变量不被改变。

同时我们需要注意的是,对于引用来说,权限可以放大,但是不能缩小。

5.4引用和指针的区别

在语法上来说,引用就是变量的别名,并没有发生实质性的变化。但在底层实现来说,引用是按照指针的方式实现的,所以在底层上,引用和指针是没有实质性的区别的,如下图所示。

 那么对于他们,毕竟是不一样的内容,所以还是有不同的:

1.引用在定义时必须初始化,而指针则不需要。

2.引用一旦引用一个实体之后,就不能在引用其他实体了。而指针可以转换对象。

3.不能存在空引用,但是可以有空指针。

4.引用自增,是对引用变量进行加1,而指针自增是指针向后偏移一个变量类型大小。

5.引用相对于指针更安全。 

六,内联函数

以 inline 修饰的函数就是内联函数,那么对于内联函数而言,它的优势就是不会进行函数的压栈操作,而会在函数调用地方展开它,也就是说,可以有效提升效率。如下图所示:

当然,对于内联函数而言,其实也不一定就完全适配所有的函数。因为这是一种典型的 “ 以空间换时间 ”的做法,所以对于递归函数或者比较大的函数就不会去使用内联,即使使用了内联函数,也会被编译器优化掉。

其次,必须要知道的是,内联函数的声明和定义是不建议分开的,因为一旦分开了,则有可能会导致连接时找不到函数地址的错误。

所以,总的来说,对于内联函数而言,首先不建议声明和定义分离,其次对于编译器而言,内联函数始终是一种建议,因为只有小函数等一些实现很方便的函数才会用内联函数实现。

tips:为什么宏不好?

原因:我们知道,为了定义一些简便的函数或者长变量,我们通常会通过宏去实现。但是在使用宏的时候,我们发现了很多问题,首先,因为宏在程序编译的预处理阶段就会被替换,那么就导致宏没法调试,同时它的代码可读性,可维护性等都比较差,而且宏没有类型检查。

解决方法:那么此时我们学习了内联函数之后,我们发现,其实内联函数是一种比较好的方式去替代宏在小函数上的作用。而且之前如果是我们需要用宏去定义一些常量的话,我们可以用 const 去替代,尽量不去使用宏。

七,auto关键字

在C++11中,auto是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导得来,在编译期编译器会将该变量的类型替换为原有类型。

auto使用注意事项:

第一个就是 auto 在对于指针和引用的使用上。

auto在使用指针时,加不加 * 号,都是可以的,但是在使用引用 & 时,不能缺。

第二个是不能推导函数的参数,还有就是不能用来定义数组。

那么对于auto具体的实用的地方,其实是在比如一些较长的变量的类型的推导以及范围 for 这些地方。

八,范围for

顾名思义,范围 for 就是有范围的 for 循环。

它的基本格式是:for ( 范围内用于迭带的变量 : 迭代的范围 )

那么对于它的使用,我们需要注意的第一点就是迭代的范围必须是确定的。同时迭代的对象是具有++ 和 == 的操作。

好的,那么对于C++的基础部分需要了解的一些新增的,以及一些改善的内容到这里就结束啦!如有问题,还请指正呀!

                                 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值