【C++】C++入门 -- 输入&输出、缺省参数

🫧个人主页:小年糕是糕手

💫个人专栏:《C++》《数据结构(初阶)》《C/C++刷题集》《C语言》

🎨你不能左右天气,但你可以改变心情;你不能改变过去,但你可以决定未来!



目录

一、C++输入&输出

1.1、详解输入、输出

[1.2、提高C++ IO效率](#1.2、提高C++ IO效率)

二、缺省参数

2.1、全缺省

2.2、半缺省

2.3、缺省参数不能声明和定义同时给


一、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>,也可以使用printfscanf,在包含<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) { // 定义时无需重复缺省值
    // 函数实现
}

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

相关推荐
q***92511 小时前
PHP搭建开发环境(Windows系统)
开发语言·windows·php
Chrison_mu1 小时前
Android项目背景动效-Kotlin
android·开发语言·kotlin
啃火龙果的兔子1 小时前
如何控制kotlin项目back的时候,只回退webview的路由
开发语言·kotlin·harmonyos
情怀姑娘1 小时前
面试题---------------场景+算法
java·算法·mybatis
chbmvdd1 小时前
week5题解
数据结构·c++·算法
用户12039112947261 小时前
面试官最爱问的字符串反转:7种JavaScript实现方法详解
算法·面试
vir022 小时前
小齐的技能团队(dp)
数据结构·c++·算法·图论
拼好饭和她皆失2 小时前
C#学习入门
开发语言·学习·c#
分布式存储与RustFS2 小时前
MinIO 不再“开放”,RustFS 能否成为更优选择?
开发语言·安全·安全架构·企业存储·rustfs