
🫧个人主页:小年糕是糕手
💫个人专栏:《C++》《数据结构(初阶)》《C/C++刷题集》《C语言》
🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!
目录
[1.2、提高C++ IO效率](#1.2、提高C++ IO效率)
一、C++输入&输出
1.1、详解输入、输出
<iostream>是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。std::cin是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流。std::cout是 ostream 类的对象,它主要面向窄字符的标准输出流。std::endl是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。<<是流插入运算符,>>是流提取运算符。(C 语言还用这两个运算符做位运算左移 / 右移)- 使用 C++ 输入输出更方便,不需要像
printf/scanf输入输出时那样,需要手动指定格式,C++ 的输入输出可以自动识别变量类型 (本质是通过函数重载实现的,这个以后会讲到),其实最重要的是 C++ 的流能更好的支持自定义类型对象的输入输出。- IO 流涉及类和对象,运算符重载、继承等很多面向对象的知识,这些知识我们还没有讲解,所以这里我们只能简单认识一下 C++ IO 流的用法,后面我们会有专门的一个章节来细节 IO 流库。
cout/cin/endl等都属于 C++ 标准库,C++ 标准库都放在一个叫std(standard) 的命名空间中,所以要通过命名空间的使用方式去用他们。- 一般日常练习中我们可以
using namespace std,实际项目开发中不建议using namespace std。
- 这里我们没有包含
<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs 系列编译器是这样的,其他编译器可能会报错。
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
int a = 0;
double b = 0.1;
char c = 'x';
cout << a << " " << b << " " << c << endl;
//我们开头写上using namespace std;就可以省略std::
//std::cout << a << " " << b << " " << c << std::endl;
scanf("%d%lf", &a, &b);
printf("%d %lf\n", a, b);
// 可以⾃动识别变量的类型
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}
现在可以简单记住一下:cin是输入;cout是输出(输入使用>>;输出使用<<)
1.2、提高C++ IO效率
cpp
#include<iostream>
using namespace std;
int main()
{
// 在io需求⽐较⾼的地⽅,如部分⼤量输⼊的竞赛题中,加上以下3⾏代码
// 可以提⾼C++IO效率
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
return 0;
}
二、缺省参数
- 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参,缺省参数分为全缺省和半缺省参数。(有些地方把缺省参数也叫默认参数)
- 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++ 规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
- 带缺省参数的函数调用,C++ 规定必须从左到右依次给实参,不能跳跃给实参。
- 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
下面一点点为大家详解:
首先我们先来简单了解一下缺省
cpp
#include <iostream>
#include <assert.h>
using namespace std;
void Func(int a = 0)//缺省值/默认值
{
cout << a << endl;
}
int main()
{
Func(); // 没有传参时,使⽤参数的默认值
Func(10); // 传参时,使⽤指定的实参(即我们给的参数)
return 0;
}
这里我们按照预期代码的结果应该是0和10,下面运行代码来看看结果:
符合我们的预期,这就是缺省参数,有了这个基础下面我们再来看看全缺省和半缺省:
2.1、全缺省
cpp
#include <iostream>
using namespace std;
// 全缺省
void Func(int a = 10, int b = 20, int c = 30)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func();
Func(1);
Func(1, 2);
Func(1, 2, 3);
return 0;
}
我们先不看代码直接运行看看结果:
解释:
调用第一次我们没有传入任何值所以就是直接打印默认的值(缺省值);第二次我们传入了一个1,按照规则我们从左向右传值,所以a为1,b和c依旧是默认的缺省值;第三次我们传入一个1和2,按照规则我们从左向右传值,所以a为1,b为2,c为默认的缺省值;第四次我们传入了1,2,3这三个值,按照规则我们从左向右传值,所以a为1,b为2,c为3.
2.2、半缺省
相信大家对全缺省应该是非常了解了,接下来我们来看半缺省就会发现,他和全缺省一样简单!
cpp
#include<iostream>
using namespace std;
// 半缺省
void Func(int a, int b = 10, int c = 20)
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl << endl;
}
int main()
{
Func(1);
Func(1, 2);
Func(1, 2, 3);
return 0;
}
我们依旧根据运行结果来学习:
解释:
这里我们依旧根据规则,C++ 规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值,这里需要注意我们需要进行传参不能像全缺省一样不传参数:当我们传入1时,从左向右依次赋值,所以a是1,其他还是使用缺省值;当我们传入1和2时,从左向右依次赋值,所以a是1,b是2,c依旧使用缺省值;当我们传入1,2,3时,从左向右依次赋值,所以a是1,b是2,c是3.
2.3、缺省参数不能声明和定义同时给
原因:
如果声明和定义中同时指定缺省参数,编译器会无法确定该使用哪个缺省值,导致编译错误。
cpp
// test.h
void func(int a = 10, int b = 20); // 声明时给缺省值
// test.cpp
void func(int a, int b) { // 定义时无需重复缺省值
// 函数实现
}

此时编译器会提示 "重定义默认参数" 的错误。这一规则的核心是保证缺省参数的唯一性,避免歧义。