目录
C++是什么
C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现,最初它被称作“C with Classes”(包含类的C语言)。它是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格.
C++是C语言的继承,进一步扩充和完善了C语言,成为一种面向对象的程序设计语言。
C++历史背景
1979年,贝尔实验室的本贾尼等人试图分析unix内核的时候,试图将内核模块化于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为C with classes。
随着社会的发展,C++发展出了许多版本,如下图,其中C++98和C++11是目前用的比较多的版本。
C++关键字
关键字不需要刻意去记,后面用的多了就熟能生巧了。
命名空间
我们知道在C中,同一个作用域里不能有两个相同的变量,局部变量、全局变量都是如此。C++之父为了解决这个问题,创建了命名空间这个概念。命名空间简单来说也是一个作用域,和局部、全局作用域相同,命名空间里也能定义变量、函数、类型,不过想要用它里面的内容需要特殊一些手段。
命名空间定义以及namespace关键字
当我们想定义一个命名空间时,需要使用namespace关键字。
//namespace后加命名空间的名字,然后加一对{}即为命名空间
namespace xxx {
//命名空间中可以定义类型、变量、函数
typedef int datatype;
int i;
int add(int a, int b) {
return a + b;
}
}
命名空间一些性质
1.可嵌套
namespace xxxx {
namespace xxx {
//命名空间中可以定义类型、变量、函数
typedef int datatype;
int i;
int add(int a, int b) {
return a + b;
}
}
}
2.自动组合
namespace xxx {
//命名空间中可以定义类型、变量、函数
typedef int datatype;
int i;
int add(int a, int b) {
return a + b;
}
}
namespace xxx {
double b;
}
当我们定义两个同名的命名空间时,它们会合二为一,上图的效果其实和下图一样
namespace xxx {
//命名空间中可以定义类型、变量、函数
typedef int datatype;
int i;
int add(int a, int b) {
return a + b;
}
double b;
}
命名空间使用
在说命名空间的使用前想让大家思考一下下面程序
namespace tmp {
typedef int datatype;
int scanf=1;
int add(int a, int b) {
return a + b;
}
}
int main() {
printf("%d\n",scanf);//1599934624
printf("%p\n", scanf);//00007FF65F5D10A0
return 0;
}
为什么结果和我们想象的不一样呢?还记得我前面有说在使用命名空间里的内容是需要一些特殊手段吗 ?接下来介绍三种命名空间的使用方法
1.命名空间名+作用域限定符
作用域限定符::,当一个变量前加作用域限定符时若左边什么都没加,则默认是访问全局变量。如:printf("%d",::a);//打印全局变量a。
命名空间名+作用域限定符,当作用域限定符前加命名空间名时,就是访问命名空间中的内容。
知道了如何访问命名空间中的内容,可是新的问题出现了。 如果我要多次访问命名空间中的某个内容,难道每次都要加一个像tmp::的前缀?这样的话有点麻烦,于是下面这种方法能避免这种情况。
2.using namespace 命名空间名
讲方法前先说明在一个程序中变量访问作用域的顺序:->局部域->全局域->命名空间域(如果有命名空间被展开)。使用using namesapce 命名空间名之后,所使用的命名空间就会被展开,这时变量的访问域就多了一个。那么上面的问题就可以这样解决。
但是这种方法也有弊端,若有一个全局变量和它同名则会有不明确的情况。
3.using namespace 命名空间名::变量名
using namespace 命名空间名::变量名能够直接引入命名空间里的变量
C++的输入和输出
C++输入使用cin,输出使用cout
//C++输入输出头文件
#include<iostream>
//std标准命名空间
using namespace std;
int main() {
int num = 0;
//输入格式,不需要数据类型格式
cin >> num;
//输出格式,不需要数据类型格式,endl为换行
cout << num<<endl;
printf("%d\n",num);
return 0;
}
如果输出时有精度控制,推荐使用printf,cout想要控制精度相对比较麻烦
缺省函数
缺省函数是当调用时,若没有传入参数,则参数会等于默认值,若有传入则等于传入值
半缺省函数
半缺省函数里有默认参数,有传入参数,默认参数的顺序需从后往前
全缺省函数
函数中的参数全为默认参数
最后,缺省参数的默认参数不能在声明和定义时同时出现,否则编译器无法确认该取何值。缺省值得是常量或全局变量。