学习了C语言之后,我们可以编写代码向这个世界打招呼。
#include
int main()
{printf("Hello World!\n");return 0;
}
新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,那C++是否也应该向这个美好的世界来声问候呢?

我们来看下C++是如何来实现问候的。
#include
using namespace std;
int main()
{cout << "Hello world!" << endl;return 0;
}
【1】使用cout标准输出(控制台)和cin标准输入(键盘)时,必须包含
Note:
①cout的功能和printf()的功能类似,cin的功能和scanf()的功能类似,但二者的书写格式却不相同。cout需要借助流插入运算符(<<),cin需要借助流提取运算符(>>)。
②cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,它们都包含在包含
头文件 中。③我们不仅要包含
头文件 ,还要展开std标准命名空间。有些同学可能会有疑问,包含
头文件不就好了,为什么还需要std命名空间呢? 这是因为
头文件里面包含有已经定义好的全局变量、函数名和类名,若工程内仅仅包含 头文件,此时全局变量、函数名和类名数目不多,不易出现命名冲突的问题。但是如果很不幸引入了多个C++标准库的头文件和自己编写的头文件,此时这些头文件里的全局变量、函数名和类名非常多,很容易造成命名冲突的现象。这时编译器该匹配哪个呢?只好取决于哪个库文件先被引用到文件中,并且把另外一个完全屏蔽掉。这显然不是一个好的方法。在标准库的产生过程中,这个问题被提了出来。为了解决上面这个问题,C++引入了命名空间的概念,对于C++的标准库而言,其对应的命名空间为std,标准库的组件都在命名空间std中实现,在由用户手动引入到程序中。 ④早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;旧编译器(vc 6.0)中还支持
格式,后续编译器已不支持,因此推荐使用 +std 的方式。// 过时写法,当时还未引入命名空间的概念,现在很多编译器已经不支持了 #include// 正确写法 #includeusing namespace std;
【2】使用C++输入输出更方便,不需要像printf()、scanf()输入输出时那样,需要手动控制格式。C++的输入输出可以自动识别变量类型。
#include
using namespace std;int main()
{const char* str = "hello bit";cout << str << endl; // 自动识别变量类型int i = 1;double d = 1.11;cout << i << d << endl; // 自动识别变量类型// 小数点有多少位,cout就输出多少位cin >> i >> d; // 不需要像C语言一样使用取地址操作符&cout << i << d << endl;return 0;
}
Note:
cin、cout与printf()、scanf()各有所长,cin、cout虽然可以自动识别类型,但是printf()、scanf()在某些场景下使用起来却比cin、cout更方便。
#includeusing namespace std;struct Student {char name[20];int age;//... }; int main() {struct Student s = { "张三",18 };// CPPcout << "姓名:" << s.name << endl;cout << "年龄:" << s.age << endl << endl; // CPP的cout不方便,一项一项写很麻烦// Cprintf("姓名:%s\n年龄:%d\n\n", s.name, s.age); //写结构体时,C语言的printf更方便,仅一行代码搞定return 0; }
std是C++标准库的命名空间,如何展开std使用更合理呢?
我们经常看到一下三种写法:
写法1:使用using namespace 命名空间名称引入
#include
using namespace std;int main()
{cout << "hello world!" << endl;return 0;
}
命名空间全部展开,用起来虽然极其方便,但是隔离彻底失效了。这种方式建议大家慎用。
写法2:使用using将命名空间中成员引入
#include
using std::cout;
using std::endl;int main()
{cout << "hello world" << endl;return 0;
}
该方式可以用于展开std命名空间中常用的成员,还保有较好的隔离效果。
写法3:加命名空间名称及作用域限定符
#include int main()
{std::cout << "hello world" << std::endl;return 0;
}
该方式能够做到最好的命名隔离,但是使用不方便,每次都需要指定域。
Note:
①在日常练习中,建议直接using namespace std即可,这样就很方便。
②using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。虽然这个问题在日常练习中很少出现,但是代码较多、规模大的项目开发中就很容易出现冲突问题。所以建议在项目开发中,使用std::cout这样使用指定命名空间或者using std::cout这样展开常用的库对象/类型等方式。