《C++详解》(一)C++命名空间,缺省参数与函数重载

目录

 

零,写在前面

一,C++的诞生

二,C++的输入输出

三,C++命名空间

1,编译器变量查找规则

2,C语言的缺陷  

 3,namespace 与 :: 限定符

4,C++标准库

四,缺省参数

1,缺省参数的理解

 2,多种缺省参数

 全缺省参数

半缺省 /部分缺省

五,函数重载


零,写在前面


   相比于C语言,C++细节繁多复杂,语法难以理解。因此许多人调侃其为 “C++,从入门到入土”。因此我打算创建《C++详解》这一系列博客,每星期稳定更新,记录自己C++学习历程,遇到困难时可以打开博客加以复习,同时将疑难知识点和大家分享,帮助其他人解决疑惑,查漏补缺。

一,C++的诞生


c语言是结构化和模块化的语言,适合处理小规模的程序。然而对于规模较大的程序以及复杂的问题,c语言显得有点难以支架,为了顺应时代潮流计算机界提出了“面向对象(oop)”的思想,支持面向对象的编译语言应运而生。

总的来说,C++既可以进行C语言的过程化程序设计,也可以进行C++的基于对象的程序设计。C++弥补着C语言的不足,同时它也是完全兼容着C语言,因此我们编程时一般是哪个方便就用哪个。

二,C++的输入输出


首先C++ 使用#include<iostream>引入iostream为输入输出流,在iostream库中,C++抛弃了printf和scanf作为输出,输入的关键字,转而引入了cout和cin这两个关键字。众所周知,在c语言程序中,输入输出变量都要先指定变量的类型,如int类型是%d,地址的类型是%p,并手动填入关键字括号中。

#include<stdio.h>
int i = 0;
scanf("%d",&i);
printf("%d", i);

而cin和cout会自动识别类型,无需手动指定,例如

int i = 0;
cout<<"hello world";
cout<<i;

有时候输出数据要确定到小数点后面几个位那么用cout就不够方便,由于C++是兼容C语言,所以谁方便就用谁

三,C++命名空间


1,编译器变量查找规则

 在C语言学习中我们了解到,每当程序要使用某个变量时(例如输出,修改值,作为函数参数等),编译器都要往上去寻找该变量的值,而编译器的变量查找有自己的一个规则,那就是:

先在局部变量中找,局部变量里找不到就在全局变量里找。

例如

输出的值是0而不是1。

2,C语言的缺陷  

 我们进入了C++的第一个重点,首先来看一串代码

    很容易看到该程序报错,为什么呢?

在C语言中的学习中我们知道,在编译的预处理阶段,编译器会将该段代码的头文件展开并复制到全局变量内。

 然而rand已经在头文件中被定义成了一个函数,当rand函数被复制到全局变量中后,我们在全局变量中再次将其定义为int类型的变量时,会报“重定义”的错误。

    C语言的第一个缺陷就在于此,C语言只能报错,而不能解决错误。如果在大公司的项目中需要两位程序员的代码进行合并,而两位程序员又定义了同名的变量,对于双方的协作会造成很大影响。

   因此C++提出了一个解决方案,引入了namespace 命名空间这个关键词。

 3,namespace 与 :: 限定符

namespace称为C++中的域,后接大括号{}。括号内放入变量或者函数

namespace space
{
  int i = 0;
  void fun()
 {
   cout<< "hello world"<<endl;

 }


}

域同样也可以嵌套

namespace space1
 {

  namespace space2
   {

   }

 }

作为C++的命名空间,可以在内定义任意类型的变量和函数。

而namespace相当于一座高墙,把在内的变量和函数与外界隔离开,因此没有特殊的操作就无法访问域内的变量,如果直接访问是肯定不行的。

C++函数引入了域限定关键词"::",如果要访问space域内的变量需要用::限定词,例如

space::i = 2;
cout<<space::i<<endl;

  由于域的出现,更改了编译器的查找规则,如果要求了在指定域中找那就只在该指定域中找,如果指定域中找不到那就会报错。

如果定义了多个名称相同的域,那么这些域会被合并。(如果域存在嵌套,则只有同一级的域会被合并)。

4,C++标准库

C++已经把C++所有所需的关键字都定义到了C++标准库:std 当中。但是使用起来较为复杂,例如

#include<iostream>
int main()
{
  std::cout<<"hello world"<<std::endl;
  std::cout<<"hello world1"<<std::endl;
  std::cout<<"hello world2"<<std::endl;

  return 0;
}

每使用一次关键字都要在前加上std标准库和域作用限定符,为了简洁,开发了一种新的使用方法,using namespace std 也就是将std展开,将其写入编译器以后调用std内的关键字无需域作用限定符。

四,缺省参数


1,缺省参数的理解

缺省参数是函数在声明和定义时给函数的参数指定一个缺省值,如果给形参传了值就用传的这个值,如果没有传值那就直接用实参指定的值。

如何理解?下面来看一段代码

在第一个函数时,我们没有给a传值,那么输出的a的值就是定义该函数时给的值。在第二个函数中,我们将5传给了a,因此即使声明时有了值也不使用,使用的是传给a的5。

缺省参数只有在函数声明或定义时就已经给了函数内变量值时才可以使用,否则不能缺省参数。

 2,多种缺省参数

 全缺省参数

顾名思义,那就是函数有多个参数时全部缺省,例如

 

注意,fun(-1, ,-2)跳跃的缺省是不支持的。

半缺省 /部分缺省

半缺省只能从右往左连续缺省

 

相比前面的代码,a在定义时没有赋予参数,因此传参数a必须要传值。

注意,缺省函数不能在声明和定义中同时使用,是因为编译器为防止声明和定义时参数的值不一样而造成歧义,例如

此时会报错。

缺省参数现在为止只是需要了解,后面的章节会继续补充更重要的用法。

五,函数重载


重载的意义是什么?重载就是赋予多个意义,相当于一词多义,相同的词语在不同语境下所要表达的态度是不同的。

函数重载也是同样的道理,

C++允许在同一作用域中声明几个同名函数,这些同名函数的参数个数,参数类型或者参数顺序不同,一般用来处理功能类似,而数据类型不同的问题。例如

参数类型不同

参数顺序不同

 注意:这里的函数顺序不同指的是不同类型参数的顺序不同,如果两个形参全都是整型或者字符型,不管a和b的顺序如何变化都会视为同一顺序。

参数个数不同

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值