作者:一个喜欢猫咪的的程序员
专栏:《C++》
喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》
目录
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。熟悉C语言之后,对C++学习有一定的帮助,本篇博客主要目标:
- 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。
- 为后续类和对象学习打基础。
1.C++关键字
C++总计63个关键字,C语言32个关键字
这些关键字不需要特别记
2.命名空间
2.1局部变量和全局变量
C语言中,局部变量优先于全局变量
int a = 10; void f1() { int a = 1; printf("%d\n", a);//运行结果为1 }
在有局部变量的情况下,如何使用全局变量
在全局变量前面加::(域作用限定符)
int a = 10; void f1() { int a = 1; printf("%d\n", a);//运行结果为1 printf("%d\n", ::a);//运行结果为10 }
C语言在 变量重命名的时候,但都不能被改变量名时,没有很好的办法解决
2.2命名空间的概念及使用
命名空间(namespace)——命名空间域,只影响使用,不影响生命周期
c++当变量重命名的时候,但都不能被改变量名时,就需要命名空间
命名空间可以嵌套,甚至可以多次嵌套
变量放在命名空间内
namespace Bbit { struct node { struct node* next; int val; }; struct queue { struct node* head; struct node* tail; }; int min = 1; } using namespace Abit; using namespace Bbit; int main() { //struct node a;//默认在局部和全局找,而现在结构体在命名空间内 struct Abit::node a; struct Bbit::node b; Abit::min++; cout << "12346" << endl; Bbit::min++; return 0; }
- 当变量不是放在命名空间时,变量默认在局部和全局找。
- 当变量放在命名空间时,变量默认先去命名空间找,然后再去局部和全局找。
2.3std命名空间
std是C++标准库的命名空间
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对
象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +
using std::cout展开常用的库对象/类型等方式。
3.C++输入&输出
cin标准输入流,cout标准输出流
- 1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件以及按命名空间使用方法使用std。
- 2. cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含头文件中。
- 3. <<是流插入运算符,>>是流提取运算符。
- 4.cin,cout会自动识别类型,不需要%d %s
int main() { //<<流插入 //endl 相当于换行符 cout << "hello world" << endl; cout << "hello world" << endl; int i; //>>流输出 cin >>i ; return 0; }
4.缺省参数
4.1缺省参数的概念及使用
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实
参则采用该形参的缺省值,否则使用指定的实参。
缺省参数说的简单点,就是给函数参数写默认值
返回值类型 函数名 (参数类型 参数名=x)(x为任意常数/全局变量)
有缺省参数时:
- 当函数调用的时候,有传函数参数时,就用传过来的函数参数,没有传函数参数就用缺省参数的值
void func(int a=10)//这里的a就是缺省参数 { cout << a << endl; } int main() { func(); return 0; }
4.2全缺省和半缺省
缺省参数的使用分为全缺省和半缺省
- 全缺省:有n个函数参数,就需要设置n个缺省参数
- 半缺省:有n个函数参数,设置k(n>k>0)个缺省参数
半缺省的规则:
半缺省必须从右往左缺省
在有缺省参数的情况下,只能不给有缺省参数的函数参数传值,没有缺省参数的函数必须传值
void func1(int a = 10, int b = 20, int c = 30) {//全缺省 cout << a << endl; cout << b << endl; cout << c << endl; } int main() { /*func(15); func();*/ func1(1, 2, 3); func1(1, 2); func1(1); func1(); //func1(, 20, );//跳着传不可以 return 0; }
- 声明和定义缺省参数不能在函数声明和定义中同时出现
5.函数重载
5.1函数重载的使用
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这
些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型
不同的问题。
函数重载:
- 1.函数名和返回类型相同
- 2.参数个数 或 类型 或 类型顺序有一种或者多种不同
int Add(int left, int right) { cout << "int Add(int left, int right)" << endl; return left + right; } double Add(double left, double right) { cout << "double Add(double left, double right)" << endl; return left + right; }
5.2函数重载的底层原理
C语言中函数调用是通过函数名进行查找的。
C++函数重载后,很明显就不可以通过函数名查找,通过函数的修饰名查找
由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使
用了g++演示了这个修饰后的名字。
通过下面我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成
- 【_Z+函数长度+函数名+类型首字母】。
vs的情况