在之前的学习中,我们已经掌握了 C 语言和数据结构初阶,对编程语言有了初步的认识与见解。如今迈入 C++ 的大门,相信不少同学都满怀热情与好奇。不过,要想真正写出C++程序,并对其有一个清晰的认识与理解,我们还需要先补充一些前置知识。
C++ 的命名空间
C++ 环境是兼容 C 语言的。
在 C 语言中,我们命名一个变量如果和库函数中函数名重复,就会引发重定义错误,比如 rand,当我们没有引入头文件 <stdlib.h> 的时候,编译是通过的。
但当我们引入该头文件 <stdlib.h> 时,就会出现重定义问题,该头文件中包含一个 rand 函数,编译器不清楚 rand 究竟是该函数名还是我们自己定义的变量 rand。g)
但当我们引入该头文件<stdlib.h>时,就会出现重定义问题,该头文件中包含一个rand函数,编译器不清楚rand究竟是该函数名还是我们自己定义的变量rand。
为了解决这种命名冲突,C++ 中引入了关键字 namespace。dnimg.cn/direct/88c567d9f需要用到关键字 namespace,使用方法为 namespace + 命名空间名 + { };中大括号中可以定义类型、变量、函数。# namespace的定义
- 定义命名空间,需要用到关键字namespace,使用方法为namespace+命名空间名+ { }; 大括号中可以定义类型,变量,函数。
cpp
namespace a
{
int rand = 0;
};
a就是该命名空需要我们使用作用域解析运算符 :: ,让编译器去该作用域内去查找。,通常编译器会先去局部域里找变量名字,找不到再去全局域里面查找,并不会主动地去命名空间域里查找,需要我们使用作用域解析运算符'::' ,让编译器去该作用域内去查找。

-
这就是命名空间域的用法,它一般是为了解决全局域 的命在项目工程中的不同文件中可以定义名字相同的 namespace,但在同一项目下同名 namespace 会被展开成同一个 namespace,所以不同文件中的同名 namespace 下不能定义同名变量 ,会有命名冲突问题。7b比如说我在 main.h 头文件中定义了命名空间 namespace a,object.h 中也定义了命名空间 namespace a,然后在源文件 main.cpp 中包含了这两个头文件: namespace b
{
int rand = 1;
};
namespace c
{
int rand = 2;
};
};
- 在项目工程中的不同文件中可以定义名字相同的namespace,但在同一项目下同名namespace会被展开成同一个namespace,所以不同文件中的同名namespace下不能定义同名变量,会有命名冲突问题。
比如说我在main.h头文件中定义了命名空间namespace a,object.h中也定义了命名空间namespace a,然后在源文件main.cpp中包含了这两个头文件:


我们重复定义了rand,报错了。命名空间的使用
C++定义的标准库都放在一个叫std的命名空间里面。
我们上面说到,编译器通常只会去局部域和全局域里面去查找对象名,所以需要我们指定命名空间域去访问(推荐)。如果命名空间中的某个成员频繁被访问而且不会产生冲突,我们通常会用using把这个成员展开到全局域中。cppnamespace st { int a=3,b=4; }; //将st中的成员a展开到全局域中 using st::a; int main() { //不需要我们用::来指定访问,编译器可以找到 printf("%d\n",a); return 0; }
一般不建议将一个命名空间全部展开,不然会很危险,但是为了方便,日常练习中可以全展开。
cpp
//将标准库全展开
using namesapace std;
C++的输入&输出
-
< iostream >是Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
-
std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流。
-
std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。
-
std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。
-
<<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
-
使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型,其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。
-
cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。
-
一般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。
-
在vs系列编译器中,我们没有包含<stdio.h>,也可以使用printf和scanf,在包含< iostream >间接包含了。其他编译器可能会报错。
我们来上手使用一下。
先包含头文件< iostream >,然后using namespace std将标准库展开(练习)。
使用cin、cout方法如下:
cpp
#include<iostre# 第一个 C++ 程序
纪念一下第一个 C++ 程序。
int ma#include <iostream>
using namespace std; >> a >> b;
cout << a << ' '<< b<< endl;
return 0;
}
简单来说,cin 是流提取符,作用相当于scanf,cout是流插入符,作用相当于pirntf,endl效果相当于'\n',但是它会刷新缓冲区。
cin/cout和scanf/printf相比的好处在于,它们都可以自动识别对象类型(int、double、字符串),不需要使用占位符,支持单行或者多行输入。

第一个C++程序
纪念一下第一个C++程序。
cpp
#include<iostream>
using namespace std;
int main()
{
cout << "hello world!" << endl;
return 0;
}