菜鸟笔记
提升您的技术认知

C++入门(一)

C++入门(一)

  • 1.C++简介
  • 2.C++关键字(C++98)
  • 3.命名空间
    • 3.1命名空间的定义
    • 3.2命名空间的使用
  • 4.C++输入&输出
  • 5.缺省参数
    • 5.1缺省参数分类
  • 6.函数重载
    • 6.1函数重载的概念
    • 6.2.函数重载的使用
    • 6.3C++支持函数重载的原理——名字修饰

1.C++简介

C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。熟悉C语言之后,对C++学习有一定的帮助,本章节主要目标:

  1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用
    域方面、IO方面、函数方面、指针方面、宏方面等。
  2. 为后续类和对象学习打基础。

2.C++关键字(C++98)

C++总计63个关键字,C语言32个关键字

刚入门,只需看看就好

3.命名空间


可以看到上图中的代码报错了,可是为什么呢?
因为rand这个变量和stdlib.h这个库里的函数命名冲突了,C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决。

3.1命名空间的定义



需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。


同样也可以嵌套使用,但是如果同一个工程里存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中,因此如果有相同的命名,依旧会报错,不过可以像上图一样使用嵌套命名空间。

3.2命名空间的使用

1.部分展开(使用using 命名空间名称::变量名)将命名空间中某个成员引入

2.指定命名空间访问(加命名空间名称及作用域限定符)

这里解释一下::符号,他是作用域限定符,如果左侧什么都没有,则默认去全局找变量

3.全局展开(using namespace 命名空间名称 引入)


总结:展开后就相等于还会去命名空间找,也可以理解为变成了全局变量
默认都是找局部变量、全局变量,就近原则,先局部变量。

4.C++输入&输出

  1. 使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件
    以及按命名空间使用方法使用std。
  2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含<
    iostream >头文件中。
  3. <<是流插入运算符,>>是流提取运算符。
  4. 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。
    C++的输入输出可以自动识别变量类型。

5.缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。

5.1缺省参数分类

1.全缺省参数

2.半缺省参数

注意:

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
  2. 缺省参数不能在函数声明和定义中同时出现

  3. 缺省值必须是常量或者全局变量
  4. C语言不支持(编译器不支持)

6.函数重载

6.1函数重载的概念

函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。

6.2.函数重载的使用


见上图,函数名都一样,但是没有报错,C则不行。

6.3C++支持函数重载的原理——名字修饰

每个编译器都有自己的函数名修饰规则。
由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使
用了g++演示了这个修饰后的名字。

我们一开始先写了一个最基本的c源文件。(Linux指令有相关问题的,可以看我的另一篇博客)

然后进行gcc编译,具体的指令就不解释了

我们可以看到c的函数名修饰规则就是原来的函数名,并没有变化,因此当你写了相同函数名的函数就会报错,因为编译器无法知道具体是哪个。


而使用C++ 的编译器g++后的的函数修饰后变成【_Z+函数长度+函数名+类型首字母】。也就是说链接时合并段表时并不会发生冲突。
结论:在linux下,采用gcc编译完成后,函数名字的修饰没有发生改变。在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参数类型信息添加到修改后的名字中。通过这里就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
另外还有一点要注意: 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。(我既可以接收返回值也可以不接收)。