C++比C多的一些特性

命名空间

贴一个ai写的,太多了😉

C++中的命名空间(Namespace)是一种机制,用于组织代码元素(如变量、函数、类等),以避免名称冲突并提供一种控制作用域的方式。命名空间帮助开发者在大型项目或使用外部库时,能够有效地管理标识符的可见性和访问权限。以下是关于C++命名空间的一些关键点:

为什么需要命名空间?

  1. 解决命名冲突:当不同的库或者程序的不同部分使用相同的名称时,命名空间可以用来区分这些同名的标识符。例如,你可能在自己的代码中定义了一个叫做log的函数,同时又想使用标准库中的std::log数学函数,这时命名空间就显得尤为重要。
  2. 组织代码:命名空间有助于将相关的代码元素组织在一起,提高代码的可读性和可维护性。比如,所有与输入输出相关的函数和类都在std::iostream命名空间中。

如何定义和使用命名空间?

  1. 定义命名空间:使用namespace关键字后跟命名空间的名称,并以一对花括号 {} 包裹其中的成员。例如:

    namespace MyNamespace {
    int value = 10;
    void myFunction() {
    // ...
    }
    }
  2. 使用命名空间成员:有两种主要方式访问命名空间内的成员:

    • **作用域解析运算符 ::**:在标识符前加上命名空间名称和作用域解析运算符。例如,MyNamespace::valueMyNamespace::myFunction()
    • using 指令:
      • using声明:可以在局部作用域内引入特定的命名空间成员,如 using MyNamespace::myFunction; 之后可以直接调用 myFunction()
      • using指令using namespace MyNamespace; 这会在当前作用域中展开命名空间,之后可以直接使用命名空间内的所有成员,但需谨慎使用,因为它可能导致名称冲突。
  3. 命名空间嵌套:命名空间可以嵌套定义,形成层次结构,进一步细化代码的组织。

  4. 匿名命名空间:在文件范围内定义的匿名命名空间中的标识符具有文件范围内的唯一性,相当于静态作用域,不会与其他文件中的同名标识符冲突。

注意事项:

  • 尽管using namespace std;可以让代码看起来更简洁,但在较大的项目中,直接展开整个命名空间可能会导致名称冲突,推荐只导入具体需要的标识符。
  • 当项目规模扩大或涉及多库集成时,良好的命名空间管理策略对于维护代码的清晰度和可维护性至关重要。

命名空间是C++语言中一个非常重要的特性,正确使用它可以有效提升代码的质量和可维护性。

控制程序流程

for循环的单个数据遍历

for(auto num:nums){
//此处auto会自动判断num的类型
//num为nums的一个数据,往后遍历。
}

输入输出

cout cin的基本输入输出

与C不同,Cpp有独特的输入输出方式,更简洁方便(但是在特别大的数据量下会更更加耗时)

#include<iostream>
int num = 0;
string str;

cin >> num >> str;//程序会读取一个int,然后读取一个字符串
cout << num << str;//会直接输出一个num和str

/*相当于c语言中的*/
scanf("%d %s",&num,&str);//C语言中的语法仍然适配Cpp
printf("%d %s",num,str);

输出不同进制

十进制输出:

默认情况下,std::cout以十进制形式输出数值。

int num = 100;
std::cout << "十进制: " << num << std::endl;

十六进制输出:

使用std::hex控制符来改变输出格式为十六进制。注意,在输出后应使用std::dec恢复到十进制输出模式,除非你需要连续输出多个十六进制数。

std::cout << "十六进制: " << std::hex << num << std::endl;

八进制输出:

使用std::oct控制符来改变输出格式为八进制。

std::cout << "八进制: " << std::oct << num << std::endl;

二进制输出:

C++标准库没有直接的控制符用于二进制输出,但可以使用std::bitset来实现。

std::bitset<8> binary(num); // 假设num是一个字节大小的整数
std::cout << "二进制: " << binary << std::endl;

控制符的使用

  • 上述的std::hexstd::octstd::dec都是操纵符,它们改变了std::cout的后续输出格式,直到下一个相应的操纵符出现或作用域结束。
  • 使用完特定进制输出后,最好使用std::dec恢复到十进制输出模式,以避免影响后续的输出。

控制输出长度

自动补空

使用std::setw来设定输出的宽度,std::setfill来指定填充字符。例如,让输出的int型数据始终占据5个字符宽,不足的部分用空格填充:

#include <iostream>
#include <iomanip>

int main() {
int num = 42;
std::cout << std::setw(5) << std::setfill(' ') << num << std::endl; // 输出 " 42"
//如果去掉setfill(' '),默认也是补空
return 0;
}

自动补零

只需将std::setfill的参数改为'0'

#include <iostream>
#include <iomanip>

int main() {
int num = 42;
std::cout << std::setw(5) << std::setfill('0') << num << std::endl; // 输出 "00042"
return 0;
}

整数、浮点数对齐

  1. setw: 设置输出的宽度。
  2. setfill: 设置填充字符。
  3. right, left, internal: 分别表示右对齐、左对齐和内部对齐(数字前填充)。

示例代码:

#include <iostream>
#include <iomanip>

int main() {
int a = 123;
double b = 4567.89;

std::cout << std::setw(10) << std::setfill(' ') << std::right << a << std::endl; // 右对齐,宽度10,空格填充
std::cout << std::setw(10) << std::setfill('0') << std::left << b << std::endl; // 左对齐,宽度10,0填充
std::cout << std::setw(10) << std::setfill('.') << std::internal << b << std::endl; // 内部对齐,宽度10,.填充,这里实际上无效因为'.'不适合用于数字内部填充
/*
输出结果
123
4567.89000
...4567.89
*/
return 0;
}