【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); //命名空间中的rand printf("%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 + 命名空间名称 :: 成员名)