行业知识
【C++】C++入门
关于C++是什么
C��言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。
C++在许多领域都有广泛的应用,包括游戏开发、系统/应用软件、驱动和嵌入式系统开发、高性能服务器和客户端应用,以及创建大型复杂的图形用户界面和数据库应用。
一、关键字
C语言中的关键字有32个,C++中的关键字有63个,几乎增长了一倍。
| asm | do | if | return | try | continue | auto | double | inline |
|---|---|---|---|---|---|---|---|---|
| short | typedef | for | bool | dynamic_cast | int | signed | typeid | public |
| break | else | long | sizeof | typename | throw | case | enum | mutable |
| static | union | wchar_t | catch | namespace | explicit | static_cast | unsigned | default |
| char | export | new | struct | using | friend | class | extern | operator |
| switch | virtual | register | const | false | private | template | void | true |
| while | protected | this | volatile | const_cast | delete | template | goto | reinterpret_cast |
二、命名空间
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
2.1 命名空间的作用
命名空间能够避免命名冲突。当模块越来越大时,不同模块中可能存在相同名称的类、函数等。使用命名空间可以将相关的类和函数分组,有效避免这些名称冲突。
例子:在下面这个代码中就会发生命名冲突,原因是因为全局中定义了一个rand变量,而头文件#include 中包含了rand函数的声明,这样就导致了命名冲突,最终编译报错。
#include #include //命名冲突int rand = 0;int main(){printf("%d", rand);return 0;} 2.2 命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
下面代码就展示了如何定义命名空间,关键字 + 命名空间的名字 ,aj 是我CSDN的名字,这里就用他来做我命名空间的名字,而命名空间的名字是可以按照自己的想法自由定义。
namespace aj //我CSDN的名字{int rand = 0;} 命名空间的成员不仅仅可以是内置类型、自定义类型,还可以是函数。
namespace aj //我CSDN的名字{//内置类型int rand = 0;//函数void Swap(int* e1, int* e2){int tmp = *e1;*e1 = *e2;*e2 = tmp;}//自定义类型struct SeqList{int* a;int size;int capacity;};} 命名空间能够嵌套使用
namespace aj //我CSDN的名字{//内置类型int rand = 0;//函数void Swap(int* e1, int* e2){int tmp = *e1;*e1 = *e2;*e2 = tmp;}//自定义类型struct SeqList{int* a;int size;int capacity;};namespace aj1{int rand = 1;int Add(int x1, int x2){return x1 + x2;}}} 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
namespace aj //我CSDN的名字{int i = 0;}namespace aj //我CSDN的名字{double d = 0; }/*namespace aj //我CSDN的名字{int i = 0;double d = 0;}*/ 在这里可以试验出两个相同名称的命名空间编译并不会报错,前面两个命名空间会合并成第三个命名空间。
2.3 命名空间的使用
定义一个命名空间就相当于产生了一个新的作用域,在全局中并不能直接使用命名空间中的成员。
使用命名空间中成员的方法一共有三种:
- 加命名空间名称及作用域限定符 ( :: 作用域限定符)
- 用 using 将命名空间内某个成员引入 ( using + 命名空间名称 :: 成员名)
- 使用 using namespace 加命名空间名称引入
- 加命名空间名称及作用域限定符 ( :: 作用域限定符)
namespace aj //我CSDN的名字{//内置类型int rand = 0;}int main(){printf("%d\n", aj::rand); //命名空间中的randprintf("%p\n", rand); // #inlcude 中 rand 函数地址return 0;}- 用 using 将命名空间内某个成员引入 (using + 命名空间名称 :: 成员名)
在下面的代码中,我使用 (using + 命名空间名称 :: 成员名 )的方法将命名空间中的成员i 引入,那么成员 i 就能够在全局中被使用,而 d 未被引入,使用 d 就会报错。
namespace aj //我CSDN的名字{//内置类型int i = 0;double d = 0.0;}using aj::i;int main(){printf("%d", i);printf("%lf", d);return 0;}注意:如果使用 using + 命名空间名称 :: 成员名导入的成员与函数名相同,会产生名称冲突。
- 使用 using namespace 加命名空间名称引入
namespace aj //我CSDN的名字{//内置类型int i = 0;double d = 0.0;}using namespace aj;int main(){printf("%d", i);printf("%lf", d);return 0;}using namespace 加命名空间名称与普通using作用相同,但前者是对整个命名空间作用,把该命名空间下的所有类、函数、常量等均导入当前作用域。
注意:若将整个命名空间中的所有成员全部导入当前作用域,那么就相当于这个命名空间失效,则有没有这个命名空间都相同,所以说这种方法不是很推荐,推荐前两种方法。
三、C++ 的输入、输出
-
C++中使用cout 标准输出对象和cin 标准输入对象时,必须包含#include 头文件以及按命名空间使用方法使用std。
cout --> console 控制台 + out cout 表示标准输出,它输出到控制台。
cin --> console 控制台 + in cin 表示标准输入,它从键盘接收输入。
#include// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中using namespace std ;int main(){cout int num1 = 0;int num2 = 0;//C语言的输入输出scanf("%d", &num1);printf("%d\n", num1);//C++的输入输出cin num2;cout cout Print();Print(520);Print(1314);return 0;}cout Print();Print(10);Print(10, 20);Print(10 , 20 ,30);return 0;}cout Print(10);Print(10, 20);Print(10, 20, 30);return 0;}cout cout Print(, 20 ,);Print(, , 30);return 0;}}//注意:如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值。typedef struct Stack{int* _a;int _top;int _capacity;}ST;void StackInit(ST* st){st-_a = NULL;st-_capacity = 0;st-_top = -1;}}typedef struct Stack{int* _a;int _top;int _capacity;}ST;// 缺省值为4,默认开四个int大小空间// 若显示传参,那么则开参数个int大小的空间void StackInit(ST* st, int N = 4){st-_a = (int*)malloc(sizeof(int) * N);st-_capacity = N;st-_top = 0;}void StackPush(ST* st, int x){// ...// 入栈操作在栈中有详细讲解,这里省略}};int main(){// 需要入栈5个数据aj::ST st1;aj::StackInit(&st1, 5);for (int i = 0; i
-
- 使用 using namespace 加命名空间名称引入
- 用 using 将命名空间内某个成员引入 (using + 命名空间名称 :: 成员名)