【无标题】

这里写目录标题

    • I/O控制
      • 使用控制符
      • 控制浮点数值显示
      • 设置值的输出宽度
      • 输出八进制数和十六进制数⭐
        • 例题
      • 设置填充字符
      • 左右对齐输出
      • showpoint强制显示小数位,showpos强制显示正负。
      • 成员函数 ostream put(char)
    • 作用域区分符 ::
    • 函数模板
    • 函数的重载

I/O控制

使用控制符

控制符(manipulators)可以对I/O流的格式进行控制。控制符是在头文件iomanip中定义的对象。可以直接将控制符插入流中。常用控制符如表2-4所示
【无标题】_第1张图片

控制浮点数值显示

【无标题】_第2张图片
第8行输出用scientific来表示指数表示的输出形式。其有效位数沿用上次的设置值8
小数位数截短显示时,进行四舍五入处理

#include 
#include

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要取消,取消后延用之前的精度情况

设置值的输出宽度

【无标题】_第3张图片

输出八进制数和十六进制数⭐

【无标题】_第4张图片
uppercase可以控制十六进制数大写输出。例如,在上例中对十六进制数进行大写控制
在这里插入图片描述

要输出不同进制的数值,需要先unsetf取消当前进制,setf设置当前进制
如果忘记取消当前进制,即使设置了,也不起作用,但是,经过测试,当需要从别的进值转化为十进制格式时,不需要unsetf别的进制,也可以输出正确的十进制格式
其实就是,如果忘记取消当前进制,默认的输出格式是十进制,而不是上次设置的进制格式,而后再进行 取消设置的操作,输出的都是十进制

#include 
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;
}

【无标题】_第5张图片

例题

#include 
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;
}
程序运行后的输出结果是()

【无标题】_第6张图片

设置填充字符

【无标题】_第7张图片

左右对齐输出

cout<<left<<setw(5)<<1
		  <<setw(5)<<2
		  <<setw(5)<<3<<endl;
#include 
#include
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强制显示正负。

#include 
#include
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)

功能: 输出一个字符

#include 
#include

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

在这里插入图片描述

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

可用于在类之后定义成员函数
【无标题】_第8张图片

函数模板

#include 
#include 

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 函数重载碰到函数默认参数

同名的函数,只要它们的形参列表不同

函数名+形参列表 构成了函数的签名,与返回类型无关,不能以返回类型区分函数

//#include 
#include 
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;
}

你可能感兴趣的:(c++)