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