一、什么是C++
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式
等。
二、C++关键字(C++98)
![](https://i-blog.csdnimg.cn/blog_migrate/73d13104bd7a9a2efefa85dcefbc9298.png)
我们目前只了解有多少关键字,具体使用方法以后会慢慢了解。
三、命名空间
1.为何要引入命名空间
我们先给出一个代码来认识为何需要命名空间:
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main() {
printf("%d", rand);
return 0;
}
运行结果:
![](https://i-blog.csdnimg.cn/blog_migrate/d9c67593a70d5f2d6a6b0e76aab57057.png)
我们发现编译器提示我们rand重定义。可是我们只定义了一个参数rand,这是为什么呢?
因为在头文件stdlib.h中拥有获取随机数的函数rand(),与参数rand命名冲突。所以C++为了解决这个问题引入关键字namespace。
2.命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。
namespace lht {
int rand = 10;
int add(int left, int right)
{
return left + right;
}
struct Node {
struct Node* next;
int a;
int b;
};
}
namespace thl {
int rand = 20;
int sub(int left, int right)
{
return left - right;
}
struct Node {
struct Node* next;
int c;
int d;
};
}
不同命名空间内属于不同作用域,所以不同作用域内可以定义相同名字的变量。
在一个工程内,命名空间也可以嵌套使用,编译器会将他们合并成同一个命名空间
namespace N1 {
int rand = 10;
int add(int left, int right)
{
return left + right;
}
}
namespace N1 {
int sub(int left, int right)
{
return left - right;
}
}
namespace N1 {
int mul(int left, int right)
{
return left * right;
}
}
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
3.命名空间的使用
#include<iostream>
namespace lht {
int a = 0; //命名空间中的a变量
int b = 1;
int add(int left, int right)
{
return left + right;
}
}
int a = 999; //全局变量a
int main() {
int a = 10; //局部变量a
printf("%d", a);
return 0;
}
我们不难知道,在同时拥有局部变量和全局变量的情况下,会使用离自己近的变量(就近原则)。
![](https://i-blog.csdnimg.cn/blog_migrate/9329c96df42c8996b64ccc453787a59e.png)
为了使用其他作用域的变量我们可以加入作用域限定符::来使用其他变量。
int main() {
int a = 10;
printf("a=%d", ::a);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/e2b09ec028fd88b6603af54539a892e5.png)
在变量前加入作用域限定符::就可以使用全局变量
int main() {
int a = 10;
printf("a=%d", lht::a);
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/4edafd337bf6bede9a3eed1f78a889fe.png)
在变量前加入命名空间名称+作用域限定符就可以使用命名空间内的变量
但当我们这样使用命名空间数据时
int main() {
int a = 10;
printf("a=%d", lht::a);
printf("a=%d", lht::a);
printf("a=%d", lht::a);
printf("a=%d", lht::a);
printf("a=%d", lht::a);
return 0;
}
我们发现使用起来十分麻烦十分不友好。c++还提供了使用using 将命名空间某个成员引入
![](https://i-blog.csdnimg.cn/blog_migrate/28e196278fbb1820cce53ff5ddf69bea.png)
我们也可以将命名空间直接展开使用他的全部成员
![](https://i-blog.csdnimg.cn/blog_migrate/919a5fe2b19f4b04cd51af0ca3f973a1.png)
这几种方式都可以使用命名空间成员。
C++输入&输出
C++第一个程序
#include<iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
return 0;
}
这里std就是C++的标准库的命名空间C++标准库的定义都在std中。
说明:
使用cout(标准输出对象)和cin(标准输入对象)时,要包含头文件<iostream>,以及命名空间std。
endl是C++中的特使符合,代表换行输出,也包括在<iostream>中。
使用C++输入输出更方便,不用像C那样控制数据格式。
#include<iostream>
using namespace std;
int main()
{
int a;
double b;
char c;
cin >> a >> b >> c;
cout << a<<" " << b <<" " << c;
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/f14251994ae3060724c99af6f1c6f46f.png)
std使用惯例:
std是C++标准库的命名空间,如何展开std使用更合理呢?
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对
象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +
using std::cout展开常用的库对象/类型等方式。
C++的初步学习,如有纰漏,还望不吝赐教。