C/C++ - 编程语法特性

目录

标准控制台框架

输入输出对象

命名空间


标准控制台框架

  • 头文件

    • ​#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++中用于输出信息的流对象,它们有一些区别,主要涉及缓冲行为、目标设备和使用场景:

    1. 缓冲行为:

      • ​cerr​​ 和 clog​​ 是非缓冲流对象,输出会立即被发送到目标设备,不会被缓冲起来。这意味着它们的输出是即时的,不受缓冲区满或程序结束的影响。
      • ​cout​​ 是缓冲流对象,它的输出会被缓冲起来,直到缓冲区满或程序结束时才发送到目标设备。这可以提高输出效率,但也可能导致输出在一些情况下不立即显示。
    2. 目标设备:

      • ​cerr​​ 的默认目标设备是标准错误输出(通常是屏幕)。它主要用于输出错误和警告信息,因此不会被重定向到其他设备或文件。
      • ​clog​​ 的默认目标设备也是标准错误输出(通常是屏幕)。它主要用于输出运行时信息、调试信息或其他日志信息,也可以被重定向到其他设备或文件。
      • ​cout​​ 的默认目标设备是标准输出(通常是屏幕),但它可以通过重定向将输出定向到其他设备或文件。
    3. 使用场景:

      • ​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;
    }
    

命名空间

  1. 基本概念

    命名空间是 C++ 中用于组织和管理名称的一种机制。它可以将全局作用域分割成不同的区域,每个区域可以包含变量、函数、类和其他命名实体。命名空间提供了一种避免名称冲突的方式,使得我们可以在程序中使用相同名称的实体而不会发生冲突。​注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中​​

  1. 命名空间的定义方法

    使用 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;
    }
    
  1. 命名空间的使用

    使用 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;
    }
    
  1. 嵌套命名空间

    可以在一个命名空间中定义另一个命名空间,这称为嵌套命名空间。嵌套命名空间可以进一步组织和管理命名空间中的实体。

    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;
    }
    
  1. 匿名命名空间

    匿名命名空间是一个特殊的命名空间,其中的实体在当前文件中具有静态生命周期,并且对其他文件不可见。它可以用于定义在当前文件中具有本地作用域的实体。

      1. 作用范围限定:匿名命名空间中定义的变量、函数或类的作用范围仅限于当前文件。其他文件无法直接访问匿名命名空间中的成员。
      2. 避免命名冲突:匿名命名空间可以用于避免与其他文件中的定义发生命名冲突。相同名称的成员在不同的匿名命名空间中是独立的,不会相互冲突。
      3. 匿名命名空间中的成员具有内部链接(internal linkage)的属性,也就是说它们只在当前文件内可见,不会在其他文件中引用到。
    namespace 
    {
        // 匿名命名空间中的声明和定义
    }
    
    #include <iostream>
    
    //匿名命名空间
    namespace 
    {
    	int a = 0;
    	void Print()
    	{
    		std::cout << a << std::endl;
    	}
    }
    
    
    
    int main()
    {
    	a = 1;
    	Print();
    
    	return 0;
    }
    
  1. 命名空间的别名

    可以使用 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;
    }
    
  1. 命名空间的合并

    1. 合并在同一个作用域下:命名空间合并只在同一个作用域下生效。
    2. 合并相同名称的命名空间:只有具有相同名称的命名空间才能进行合并。
    3. 合并后成员的可见性:合并后,具有相同名称的命名空间中的成员在合并的作用域内可见。
    //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;
    }
    
  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值