C++类细节梳理之命名空间与io流和引用

命名空间

c++可以通过命名空间在大项目中避免名字冲突,在不同命名空间的名字可以相同,“::”是作用域解析运算符

用来命名空间:namespace 命名空间名{声明序列}

使用该命名空间:using namespace 命名空间名

从using指令之后到指令出现的作用域结尾为止,都在此命名空间内

更常用的是直接指定使用命名空间:命名空间名::成员名

#include <iostream> 
using namespace std;

int num = 100;
namespace NS_1{
	int num = 100;
} 
namespace NS_2{
	int num = 100;
} 
void Handle(int x, int y, int z)
{
    cin >> x >> y >> z;
    num += x;
    NS_1::num -= y;
    NS_2::num %= z;
}

int main()
{
    int x,y,z;
    cin >> x >> y >> z;
    Handle(x, y, z);
    cout << num << ' ' << NS_1::num << ' ' << NS_2::num << endl;
    return 0;
}

因为使用了using namespace std,对于std中的全局变量num不需要加空间名,在NS_1和NS_2中的num则需要加上空间名

输入/输出操作符

<iostream>定义了一些无参的操作符

  • endl,输出‘/n’并冲洗输出流
  • dec,hex,oct更改用于整数输入/输出的进制,dec表示十进制,hex表示十六进制,oct表示八进制。(虽然bin表示二进制,但是bin并不能更改输入输出为二进制)
  • left,right设置为左对齐,右对齐
  • fixed,scientific,更改浮点i/o的格式化,fixed消除科学计数法格式,scientific设置为科学计数法格式
  • showpoint,noshowpoint,控制浮点数是否始终包含小数点
  • showpos,noshowpos,启用或禁用非负数输出中的正号 '+' 的显示,在输入上无效果。
  • ……

<iomanip>定义了一些有参的操作符数

  • setw(n),更改下个输入/输出域的宽度为n
  • setprecision(n),更改浮点精度(保留几位小数)

代码示例:

#include <iomanip>
#include <iostream>

using namespace std;

int main() {
  int x;
  double y;
  // 1. 固定4位小数
  while (cin >> y) {
    if (y == 0) {
      cout << endl;
      break;
    } else {
      cout << fixed << setprecision(4) << y << " ";
//注意此处要fixed,不然会舍去后面的0(3.120 -> 3.12)
    }
  }
  // 2. 科学计数法
  while (cin >> y) {
    if (y == 0) {
      cout << endl;
      break;
    } else {
      cout << scientific << setprecision(3) << y << " ";
    }
  }
  // 3. 八进制
  while (cin >> x) {
    if (x == 0) {
      cout << endl;
      break;
    } else {
      cout << oct << x << " ";
    }
  }
  // 4. 十六进制
  while (cin >> x) {
    if (x == 0) {
      cout << endl;
      break;
    } else {
      cout << hex << x << " ";
    }
  }
  // 5. 左对齐
  for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 5; j++) {
      cin >> x;
      cout << setw(6) << left << dec << x << " ";
    }
    cout << endl;
  }
  return 0;
}

 如果要让输出时不会自动舍去无效数位,则不能使用科学计数法,而是要使用fixed消除科学计数格式

值得一提的是,对于输出流,当你规定输出的样式后,当再次输出时也会按照上次的规定来输出而不会返回默认输出模式

cout << oct << x << " ";//八进制
cout << y << " ";//仍是八进制

对于进制、小数位数、是否科学计数法的顺序并没有明确要求,只要这些规定出现在要输出的对象x前面就可以啦

引用

引用是对象或函数的别名

函数的返回值也可以使用引用,如果不使用引用,则会为函数中的本体创建一个临时变量,然后返回这个临时变量,如果使用引用,则不会创建临时变量,而是直接返回本体

当返回一个引用时要注意被引用的对象不能超出作用域,所以返回局部变量是不合法的,这时要将该局部变量变为静态变量,或者把变量拿到函数外

double &f(double x){
    static double y;//没有static则不合法
    y = x;
    return y;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值