【落羽的落羽 C++】C++入门基础:输入与输出,缺省参数,函数重载
文章目录
- 一、C++的输入与输出
- 二、函数的缺省参数
- 三、函数重载
一、C++的输入与输出
这一部分知识涉及到后面C++的类和对象的概念,这里我们只能简单理解:
<iostream>
是Input Output Stream的缩写,是标准的输入输出流库,定义了标准的输入、输出对象。std::cin
是istream类的对象,主要面对窄字符的标准输入流。std::cout
是ostream类的对象,主要面对窄字符的标准输出流。std::endl
是一个函数,流输入输出时,相当于插入一个换行字符(\n),刷新缓冲区。<<
是流插入运算符,>>
是流提取运算符(同时也是运算左移/右移)。- 使用C++进行输入输出时,不需要像printf和scanf那样手动指定格式,C++的输入输出可以自己识别变量类型(本质是通过函数重载实现的)。C++的流能更好地支持自定义类型对象的输入输出。
- cout、cin、endl等都属于C++标准库,C++标准库都放在一个叫std的命名空间中,所以我们要通过命名空间的使用方式去使用它们。一般的练习中我们可以直接
using namespace std;
实际项目开发中不建议。 - 下面我们没有包含头文件stdio也可以使用printf和scanf,因为它们在iostream中间接包含了。VS系列编译器是这样的,其他编译器可能不支持会报错。
直接来看一般使用实例:
#include<iostream>
using namespace std;
int main()
{
int a = 1;
char c = 'B';
cout << "一、" << a + 2 << " " << c << endl;//endl会自己换行
//或:
std::cout << "一、" << a + 2 << " " << c << std::endl;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a, b;
char c;
//能自动识别变量类型
cin >> a;
cin >> b;
cin >> c;
//cin >> a >> b >> c;等效
cout << a << ' ' << b << ' ' << c << endl;
return 0;
}
现在能看懂理解就好,之后我们会深入学习C++的类和对象。
二、函数的缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果我们没有给函数传实参,则函数的形参直接采用这个缺省值,有实参则优先采用实参值。缺省参数分为全缺省和半缺省(有些地方也把缺省参数叫做默认参数)。但是,当函数的声明和定义不再一个文件中时,缺省参数值就不能在声明和定义中同时出现了,规定必须在函数声明中给定缺省值。
比如:
//head.h中:
#include<iostream>
using namespace std;
int Add(int x = 10, int y = 20); //10和20就是缺省值
//head.cpp中:
#include"head.h"
int Add(int x, int y)
{
return x + y;
}
//test.cpp中:
#include"head.h"
int main()
{
int a = Add(); //没有给函数Add传实参,则Add的形参值采用缺省值10、20
cout << a <<endl; //a的值应为30
return 0;
}
缺省参数分为全缺省和半缺省:
全缺省就是所有形参都给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续给缺省值,不能间隔跳跃或从左到右给缺省值。
例如:
void Fun1(int a = 1, int b = 2, char c = 'A');
是全缺省
void Fun2(int a, int b = 2, char c = 'A');
或void Fun3(int a, int b, char c = 'A');
是半缺省
void Fun4(int a = 1, int b = 2, char c);
或void Fun5(int a, int b = 2, char c);
是错误的
而带缺省参数的函数的调用时,C++规定必须从左到右依次给实参,不能跳跃给实参。
例如:
声明定义好上面的Fun1后,
调用时我们可以不传实参Fun1();
,函数内部三个形参就用它们的缺省值;
也可以只传一个参数如Fun1(6);
,这意味着函数内部变量a的值采用6,b和c仍采用缺省值;
也可以传两个参数如Fun1(6, 8);
,函数内部变量a的值采用6,b的值采用8,c采用缺省值"A";也可以传三个参数如Fun1(6, 8, 'P');
,三个变量就采用传的三个值;
如果你尝试了Fun1('B');
,会发现a的值变成了66(B的ASCII值),b和c仍采用缺省值。这就是因为给实参是从左往右依次的。
看看实例:
//head.h中:
void Fun1(int a = 1, int b = 2, char c = 'A');
//head.cpp中:
void Fun1(int a, int b, char c)
{
//打印abc
cout << a << ' ' << b << ' ' << c << endl;
}
//test.cpp中:
Fun1();
Fun1(6);
Fun1(6, 8);
Fun1(6, 8, 'P');
Fun1('B');
结果符合我们的预期
三、函数重载
C语言是不支持在同一域中出现同名函数。C++支持在同一作用域中出现同名函数,但要求这些同名函数的形参不同:可以是形参类型不同,也可以是形参个数不同,也可以是形参类型顺序不同,亦或三者兼有。这样C++的函数调用就表现出了多态行为,使用更加灵活。这样的同名函数就叫构成了函数重载。
但是!同名函数的返回类型不同并不是区别它们的依据。如果同名函数的返回类型不同,即使它们的形参不同,也会编译报错。
而在调用同名函数时,使用者的传参一定要符合某一个函数的形参定义,C++会根据你的实参判断调用哪个函数的。
//形参类型不同的同名函数:
int Add(int x, int y);
double Add(double x, double y);
//形参个数不同的同名函数:
void Fun(int a);
void Fun(int a, int b);
//形参顺序不同的同名函数:
void Fun1(int a, char c);
void Fun1(char c, int a);
//三者兼有(其实就是形参压根完全不一样):
void Fun2(int a, char c, int* b);
void Fun2(struct ListNode* d, double e);
//这两个同名函数不能构成函数重载:
//void Fun3(int a);
//int Fun3(int a);
但是,还存在一种特殊情况:当同名函数中一个函数又有了缺省参数,如
void Fun();
void Fun(int a = 2);
假如调用Fun()
,既可以理解成不传参调用第一个Fun函数,也可以理解成不传参调用第二个Fun函数,a采用缺省值2。因此存在歧义,编译器也不理解到底调用哪个函数,就会报错:
本篇完,感谢阅读