这里写目录标题
I/O控制
使用控制符
用控制符 (manipulators)可以对I/O流的格式进行控制。控制符是在头文件iomanip 中定义的对象。可以直接将控制符插入流中。常用控制符如表2-4所示
控制浮点数值显示
第8行输出用scientific来表示指数表示的输出形式。其有效位数沿用上次的设置值8 。
小数位数截短显示时,进行四舍五入处理
cpp
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
double a = 123.45678913;
cout << a << endl;
// cout << setiosflags(ios::scientific) << a << endl;
// cout << resetiosflags(ios::scientific);
cout << setiosflags(ios::fixed) << a << endl;
cout << setprecision(2) << setiosflags(ios::fixed) << a << endl;
cout << setprecision(12) << setiosflags(ios::fixed) << a << endl;
system("pause");;
return 0;
}
scientific设置浮点数以科学计数法形式输出,fixed使此时的精度域表示小数位数,原本的精度域是包括整数与小数一起的
最原始情况,6位有效数字
fix之后,默认小数点后6位
scientific要取消,取消后延用之前的精度情况
设置值的输出宽度
输出八进制数和十六进制数⭐
用uppercase 可以控制十六进制数大写输出 。例如,在上例中对十六进制数进行大写控制
要输出不同进制的数值,需要先unsetf取消当前进制,setf设置当前进制
如果忘记取消当前进制,即使设置了,也不起作用,但是,经过测试,当需要从别的进值转化为十进制格式时,不需要unsetf别的进制,也可以输出正确的十进制格式
其实就是,如果忘记取消当前进制,默认的输出格式是十进制,而不是上次设置的进制格式,而后再进行 取消设置的操作,输出的都是十进制
cpp
#include <iostream>
using namespace std;
int main()
{
int a = 0x12345678;
cout.unsetf(ios::dec);
cout.setf(ios::hex);
cout << "十六机制: " << a << endl;
cout.unsetf(ios::hex);
cout.setf(ios::oct);
cout << "八机制: " << a << endl;
cout.unsetf(ios::oct);
cout.setf(ios::dec);
cout << "十机制: " << a << endl;
cout.unsetf(ios::dec);
cout.setf(ios::hex);
cout << "十六机制: " << a << endl;
// cout.unsetf(ios::oct);
cout.setf(ios::dec);
cout << "十机制: " << a << endl;
// cout.unsetf(ios::hex);
cout.setf(ios::oct);
cout << "八机制: " << a << endl;
system("pause");
return 0;
}
例题
cpp
#include <iostream>
using namespace std;
int main() {
int i = 100;
cout.unsetf(ios::dec);
cout.setf(ios::hex);
cout << i << "\t";
cout << i << "\t";
cout.setf(ios::dec);
cout << i << "\t";
return 0;
}
程序运行后的输出结果是()
设置填充字符
左右对齐输出
cpp
cout<<left<<setw(5)<<1
<<setw(5)<<2
<<setw(5)<<3<<endl;
cpp
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
int a = 123;
cout<<setiosflags(ios::left)<<setw(5)<<1
<<setw(5)<<2
<<setw(5)<<3<<endl;
cout<<left<<setw(5)<<1
<<setw(5)<<2
<<setw(5)<<3<<endl;
cout << setiosflags(ios::left) << setfill('*') << setw(6) << a << "---" << endl;
cout << setiosflags(ios::right) << setfill('*') << setw(5) << a << "---" << endl;
system("pause");
return 0;
}
showpoint强制显示小数位,showpos强制显示正负。
cpp
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
double a = 10 / 5;
double b = 26.0 / 7;
cout << a << endl;
cout << showpoint << a << endl;
cout << setiosflags(ios::showpoint) << a << endl;
cout << b << endl;
cout << showpos << b << endl;
cout << setiosflags(ios::showpos) << b << endl;
system("pause");
return 0;
}
setiosflags(ios::showpoint) 等价 showpoint
setiosflags(ios::left) 等价 left
成员函数 ostream put(char)
功能: 输出一个字符
cpp
#include <iostream>
#include<iomanip>
using namespace std;
int main()
{
char buf[] = "hello world";
for (int i = sizeof(buf) / sizeof(char) - 2; i >= 0; i--)
cout.put(*(buf + i));
cout.put('\n');
system("pause");;
return 0;
}
cpp
cout.flush()//刷新缓冲区
cout.put()//向缓冲区写一个字符
cout.write()//向缓冲区写字符串
cout.width()//设置输出长度
cout.fill()
cout.setf(标记)//设置输出格式
cout.unsetf(标记)//卸载输出格式
作用域区分符 ::
∷叫作用域区分符 ,指明一个函数属于哪个类或一个数据属于哪个
类。∷可以不跟类名,表示全局数据或全局函数(即非成员函数)
std是一个命名空间(namespace),'::'是作用域运算符,cout是std空间中的一个函数名。使用cout时,必须有使用std命名空间的说明,有两种说明方式。
方式一:每次使用时对cout说明:
std::cout << "Input two numbers:";
方式二:在主函数前说明一下,后面就可以直接使用cout:
using namespace std;
cout << "Input two numbers:";
原文链接:https://blog.csdn.net/qq_28117589/article/details/122188221
可用于在类之后定义成员函数
函数模板
cpp
#include <iostream>
#include <string>
using namespace std;
template<typename T>
T add(T x, T y)
{
return x + y;
}
int main()
{
cout << add(5, 3) << endl; //自动推断类型
cout << add<double>(5, 7.8) << endl; //歧义性
cout << add<string>("hello", " world") << endl;
}
函数的重载
作用:函数名可以相同,提高复用性
函数重载满足条件:
同一个作用域下
函数名称相同
函数参数类型不同 或者 个数不同 或者 顺序不同
注意:
1、函数的返回值不可以作为函数重载的条件
原因就是:编译器在编译时,不会去判断函数的返回类型!也就是说你返回类型虽然不同,但是只有函数调用以后,编译器才去验证返回类型。
2、函数重载遇上引用
2.1 引用做为重载条件
2.2 函数重载碰到函数默认参数
同名的函数,只要它们的形参列表不同
函数名+形参列表 构成了函数的签名,与返回类型无关,不能以返回类型区分函数
cpp
//#include <bits/stdc++.h>
#include <iostream>
using namespace std;
//函数重载的注意事项
//1、引用作为函数参数
void func(int &a)
{
cout << "函数function(int a)的调用" << endl;
}
void func(const int& a)
{
cout << "函数function(const int a)的调用" << endl;
}
//2、函数重载碰到默认参数
void test(int a)
{
cout << "函数test(int a)的调用" << endl;
}
void test(int a,int b=10)
{
cout << "函数test(int a,int b=10)的调用" << endl;
}
int main()
{
int a = 10;
func(a);//实际参数a变量可读可写,传入函数后走可读可写的函数
func(10);//实际参数10是常量 若走int &a=10;不合法,引用无效;但能走const int &a=10;
test(10, 20);
test(10);//错误,两个函数都能被调用。ambiguous出现二义性
// system("pause");
return 0;
}