c嘎嘎入门篇

前言:

  由于c语言的开发时间较早,有许多的不足,因而在此基础上有了c++这一较为高级的语言,它通过一系列新语法较为巧妙的弥补了c语言遗留的坑。接下来我通过这篇文章来介绍c++中比较基础的新语法,了解他们可以为之后c++的学习扫清一些障碍。

命名空间:

  命名空间的必要性:

  在学习c语言时我们知道:变量名、函数名不能出现重复。这里的重复既指和程序员(自己或者别人)的,也可以是c++标准库里的命名。c语言中只能通过更改名称来解决问题,可试想:当代码量较多,多人协作编程时还要互相交流名称的使用未免过于麻烦。因此在c++中引入了命名空间的概念。

  命名空间(namespace)的定义(只能在全局定义):

  定义方式如下图所示,其中namespace是关键字,表示命名空间;an是命名空间的名称,可以自定义。命名空间也可以嵌套

  注:

  如果在同一工程中的几个文件定义了同名的命名空间,会被编译器识别为存在于同一个命名空间。

    命名空间的使用(三种方式):

1,全局展开:最为简单粗暴的方式,using和namespace一样也是关键字,表示使用。

2,局部展开:只展开命名空间里的某个名称,是比较折中稳妥的方法。其中 " :: ”是域作用限定符,在此用于访问命名空间这一名称域(c++中每一对" {} "括起来的都是一个域)

3,即兴展开:在日后的工作中最推荐的方式,虽然有点麻烦,但可以完美解决命名冲突的问题。平日自己代码练习的时候可以直接用第一种全局展开的方式。

    输入输出:




  我想大多数人和我一样,初学c语言时实现的第一个程序是用printf打印“hello world!”,而在c++里有了新的输入输出方式 ,接下来我进行简单的介绍(真的只是简单的介绍!!!咱初学者暂且会用就行)。

  cin(标准输入)cout(标准输出):

  cin要用流提取操作符">>"来使用,可以暂且理解为提取用户的输入。

  cout要用流插入操作符"<<"来使用,可以暂且形象的理解为数据跟随<<的指向流到了控制台上(cout里的c是控制台的英文"console"的首字母,同时也表示以字符的形式打印)

  

     注意:

  当前如果要控制输出数据的小数点位数可以用printf来实现,因为cout的相关功能的实现比较繁琐,以后才会学习。




缺省参数:

    概述:

  在c语言中一个函数要么没有参数,如果有参数的话在调用函数时就必须传递参数,这样比较呆板,在一些特殊情况下有局限性。c++中通过缺省参数来解决这种问题。

    基本形式:

  从下图可以看到,就是在定义函数时为参数赋予了值

     语法规则(全缺省和半缺省):

     1,每个参数都给定了初始值(缺省值)的叫做全缺省参数,只给了一部分的叫做半缺省参数

     2,语法上规定如果没有传参那变量就使用缺省值,传一部分就使用一部分

    3,正因为有第二点中传一部分参数的情况存在,所以为了避免歧义语法上规定缺省值只能从右往左给,不能从左开始或者间隔着给(因为为函数调用时传递的参数默认从左往右匹配)。

  




    函数重载:

    概述:

  在c语言中不能出现函数重名的情况,可函数名又在一定程度上体现了函数的功能,如果要想要定义几个功能相似(函数名相同)的函数就要用到c++中的函数重载。函数重载允许同一作用域中出现几个名称相同而参数有所差异的函数。

    函数重载的规则(体现在参数的类型、个数以及类型):

  1,参数的个数不同:值得注意的是一个无参函数和有参函数也构成重载,此时编译阶段能通过,但。

  2,参数的类型不同:字面意思,不多赘述。

  3,参数类型顺序不同:比如 function(int a , float b) 和 function(float a , int b)。

    一种应用场景(加法函数):

  

    函数重载的底层实现原理(函数名称的修饰):

  刚接触这一语法肯定不少人和我一样都产生了疑惑:那为啥c语言就不能这样玩呢?其实原因在于c++的函数会根据参数的类型、个数以及顺序偷偷的给自己的名称挂上前缀和后缀(具体会有些啥取决于编译器,有的简单有的难),下面用我VS环境下的编译器进行简单的演示c和c++的函数调用:

    引用(为变量取别名,比指针简单且不易出错,但底层仍由指针实现):

    概述:

  相信不仅仅是我,大家之前学习c语言的时候也被指针恶心过,传参的时候要传这样那样的地址,使用的时候又要这样那样的解引用,既麻烦又易错。相信c++的祖师爷同样对此不满,因此手搓c嘎嘎的时候加入了引用,很大程度上为大部分需要指针的场景提供了另一种更为简单的方法,下面来简单的进行介绍。

    引用的基本形式(与指针对照)

  值得注意的是在c++中 & 除了表示取地址外还可以表示引用。

  

  下面再通过一张图来加深理解指针和引用的区别:

  

    引用的应用场景(作为输出型参数传参、作为返回值):

  一、作为输出型参数传参:

  首先解释下,输出型参数就是进行函数传参后需要被改变的参数。下面用经典的交换连个变量值来举例说明:

  函数的定义

函数的使用

  2.作为返回值使用:作返回值时分两种情况,一种大概率会出错,另一种有妙用,接下来我逐一进行介绍。

  知识回顾:当调用函数时编译器会向系统申请一块临时的栈帧空间(并且是先传参再建立栈帧,先后顺序很重要),普通的临时变量在函数调用结束后会销毁(销毁后变量并非消失了,而是切断了变量的地址和变量的联系,有的编译器会保留变量的值,有的则会置为随机值,这是理解引用错误情况的关键),而静态变量、堆上动态申请(例如malloc)的内存则不会销毁。

  二、引用作为返回值时的错误情况:

图中可以看出,似乎没有出现什么错误,难道说这种情况下的引用返回没问题吗???,其实并非如此,我改一下条件了再来,请看下图:

终于,错误出现了!第二个ret的值居然是随机值,那么问题来了为何偏偏只有第二个ret是随机值呢,接下来我来进行简要的分析:

          一个不那么恰当的比喻:

上面这种通过引用来访问已经销毁的变量的操作就好比我开了一间房睡了一晚,第二天离开的时候偷偷留了一把钥匙,那我之后如果通过这把钥匙擅自进入这个房间,要么碰巧没人,可以啥事没有的睡一晚,如果有人,就BBQ了。这两种情况也就对应了编译器是否会把已经释放的空间置为随机值,而我偷偷留的钥匙也就相当于对返回值的引用。这样的操作是不安全的,所以要避免。

          三、引用作为返回值时的正确情况:

  具体情况看下图,其中能正常返回的原因在于这是一个顺序表,数组的空间都是用realloc动态开辟的堆上的空间,不主动释放的话数组出了函数的作用域也不会销毁。

引用相较于传值的优点:

  一、作输出型参数的优点:1、效率较高,不容易出错

                                             2、省去了形参拷贝传递的参数的空间和时间的浪费

  二、作返回值的优点:1、效率高,相比于返回数值有更广泛的用途

注:传值、返回值和传引用、返回引用时间效率上的具体效率差距我就不在这里演示了。

  引用的特性:

1、对同一变量可以定义多个引用(相当于对一个人取多个外号,嗯,很合理)

2、定义引用时必须初始化(简单理解就是取外号总得有个对象,不能空取)

3、同一个引用变量不能对应于多个变量(简单理解就是外号都是代表某一个人的特点,因此不能给不同的人取同样的外号)

  常引用(权限的放大、缩小和平移):

  常引用就是具有常量属性的值进行引用,在一种情况下是会报错的,比如对有const修饰的变量进行引用,请看下图:

    内联函数:

  概述: 在c语言中可以用宏来定义常量和函数,但使用宏可能会产生一系列的问题,尤其是宏定义的函数,下面看一个例子

因为宏只是简单的替代,因此编译器在预处理阶段就会把Add(a,b) 无脑替换为((a)+(b)),如果没有加上那么多的括号,a和b就可能被实际代码中出现的其他优先级高于交换的运算符给带走,容易出错,尤其是当宏函数较为复杂的时候更是如此,具体是如何体现的我就不赘述了,属于是是c语言的内容。为了更好的解决这种问题,c++就引入了内联函数的概念。

  性质:

     1,内联函数只适用于规模很小,需要频繁调用的函数;当内联函数规模较大或者使用了递归,编译器就会很聪明的把这个函数当作一般的函数。

     2,内联函数比较特殊,可以在头文件里同时声明定义,但不能声明和定义分离。简单解释下不能分离的原因:内联函数在被调用后是直接在调用处展开函数的内容,不会建立栈帧,因此不会生成地址。如果声明和定义分离(放在了不同文件),在调用内联函数时,编译器就无法通过地址来找到此函数的定义,只能看着一个空空的定义发愣,出现链接错误

    3,内联函数由于不会有建立和销毁栈帧空间的性能开销,提升程序的运行速度。

   新的关键字:nullptr

  在 c语言里空指针NULL被宏定义为0这个整形值,这在实际的使用中 会出现一些问题,因此在C++11这个版本中引入了nullptr这个关键字。

  1、建议日后在所以要用到空指针的时候使用nullptr来表示。

  2、nullptr不用包含任何头文件,可以直接使用。

  ——————————————————————————————————————————

以上就是本文的全部内容啦,拜拜

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值