目录
标准控制台框架
输入输出对象
命名空间
标准控制台框架
-
头文件
-
#include <iostream>
- 告诉编译器我们要使用iostream库
- 尖括号中的名字指定了某个头文件(header)
-
-
入口函数
- int main(void)
-
返回
- return 0;
-
输出语句
-
std::cout << "Hello 0xCC" << std::endl;
- <<输出运算符
- 运算符左侧为ostream对象
- 运算符右侧为输出内容
- 上述代码等价于std::cout << "Hello 0xCC"; std::cout << std::endl;
- std::endl效果为换行符并且刷新缓冲区
-
-
输入语句
-
std::cin >> a;
- >>输入运算符
- 运算符左侧为istream对象
- 运算符右侧为输入数据
-
-
注释
- / 单行注释 /
- /*多行注释*/
输入输出对象
-
C++语言并未定义任何输入输出(IO)语句,取而代之,包含了一个全面的标准库(standard library)来提供IO机制
-
iostream 库包含两个基础类型istream 和ostream,分别表示输入流和输出流
-
标准输入(standard input) - cin(istrean)对象
-
标准输出(standard output) - cout(ostrean)对象
-
标准错误(standard error) - cerr(警告信息)/clog(运行信息)(ostrean)对象
-
cerr、clog 和 cout 都是C++中用于输出信息的流对象,它们有一些区别,主要涉及缓冲行为、目标设备和使用场景:
-
缓冲行为:
- cerr 和 clog 是非缓冲流对象,输出会立即被发送到目标设备,不会被缓冲起来。这意味着它们的输出是即时的,不受缓冲区满或程序结束的影响。
- cout 是缓冲流对象,它的输出会被缓冲起来,直到缓冲区满或程序结束时才发送到目标设备。这可以提高输出效率,但也可能导致输出在一些情况下不立即显示。
-
目标设备:
- cerr 的默认目标设备是标准错误输出(通常是屏幕)。它主要用于输出错误和警告信息,因此不会被重定向到其他设备或文件。
- clog 的默认目标设备也是标准错误输出(通常是屏幕)。它主要用于输出运行时信息、调试信息或其他日志信息,也可以被重定向到其他设备或文件。
- cout 的默认目标设备是标准输出(通常是屏幕),但它可以通过重定向将输出定向到其他设备或文件。
-
使用场景:
- cerr 通常用于输出错误和警告信息,它的输出是非缓冲的,以便尽快显示错误信息,不受缓冲区满或程序结束的影响。
- clog 通常用于输出运行时信息、调试信息或其他日志信息,它的输出是缓冲的,以提高输出效率,但可能不会立即显示。
- cout 是最常用的输出流对象,用于一般的标准输出,它的输出是缓冲的,可以在合适的时机进行刷新。
总结:
- cerr 用于输出错误和警告信息,非缓冲。
- clog 用于输出运行时信息、调试信息或其他日志信息,缓冲。
- cout 用于一般的标准输出,缓冲。
在实际使用中,根据需要选择适当的输出流对象,以满足不同类型的输出要求。
#include <iostream> int main() { std::cout; //std::ostream; std::cerr; //std::ostream; std::clog; //std::ostream; std::cin; //std::istream; std::cout << "cout" << std::endl; std::cerr << "cerr" << std::endl; std::clog << "clog" << std::endl; return 0; }
-
命名空间
-
基本概念
命名空间是 C++ 中用于组织和管理名称的一种机制。它可以将全局作用域分割成不同的区域,每个区域可以包含变量、函数、类和其他命名实体。命名空间提供了一种避免名称冲突的方式,使得我们可以在程序中使用相同名称的实体而不会发生冲突。注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
-
命名空间的定义方法
使用 namespace 关键字定义命名空间,语法如下:
#include <iostream> namespace CC_STD { int HP; //内部声明 void Fun(int add); } //外部定义 void CC_STD::Fun(int add) { CC_STD::HP += add; } int main() { CC_STD::HP = 1; CC_STD::Fun(100); return 0; }
-
命名空间的使用
使用 using 声明或限定符访问命名空间中的成员。
#include <iostream> using namespace std; int main() { cout << "0xCC" << endl; return 0; }
使用 using 声明可以将命名空间中的一个或多个成员引入当前作用域,使其可直接使用,语法如下:
#include <iostream> void cout() { } int main() { using std::cout; using std::endl; cout << "0xCC" << endl; std::string; return 0; }
-
嵌套命名空间
可以在一个命名空间中定义另一个命名空间,这称为嵌套命名空间。嵌套命名空间可以进一步组织和管理命名空间中的实体。
namespace outer_namespace { namespace inner_namespace { // 嵌套命名空间中的声明和定义 } }
#include <iostream> namespace CC_TOOLS { int nVer; namespace CC_IO { int nOutput; void Print(); } } void CC_TOOLS::CC_IO::Print() { std::cout << nOutput << std::endl; } int main() { CC_TOOLS::CC_IO::nOutput = 123; CC_TOOLS::CC_IO::Print(); return 0; }
-
匿名命名空间
匿名命名空间是一个特殊的命名空间,其中的实体在当前文件中具有静态生命周期,并且对其他文件不可见。它可以用于定义在当前文件中具有本地作用域的实体。
-
- 作用范围限定:匿名命名空间中定义的变量、函数或类的作用范围仅限于当前文件。其他文件无法直接访问匿名命名空间中的成员。
- 避免命名冲突:匿名命名空间可以用于避免与其他文件中的定义发生命名冲突。相同名称的成员在不同的匿名命名空间中是独立的,不会相互冲突。
- 匿名命名空间中的成员具有内部链接(internal linkage)的属性,也就是说它们只在当前文件内可见,不会在其他文件中引用到。
namespace { // 匿名命名空间中的声明和定义 }
#include <iostream> //匿名命名空间 namespace { int a = 0; void Print() { std::cout << a << std::endl; } } int main() { a = 1; Print(); return 0; }
-
-
命名空间的别名
可以使用 namespace 关键字为命名空间定义别名,方便使用和引用。
namespace alias_name = namespace_name;
#include <iostream> namespace CC_STD { int a; } int main() { //typedef //using //namespace newname = oldname; namespace CC = CC_STD; CC::a = 1; CC_STD::a = 2; return 0; }
-
命名空间的合并
- 合并在同一个作用域下:命名空间合并只在同一个作用域下生效。
- 合并相同名称的命名空间:只有具有相同名称的命名空间才能进行合并。
- 合并后成员的可见性:合并后,具有相同名称的命名空间中的成员在合并的作用域内可见。
//main.cpp #include <iostream> #include "Header.hpp" namespace CC_TOOLS { int nVer; int nKey; namespace CC_IO { int nInput; int nOutput; } } int main() { return 0; } //Header.hpp #pragma once namespace CC_TOOLS { int nNum; }