【C++初阶】第一站:C++入门基础(上) -- 良心详解-1
https://developer.aliyun.com/article/1456953
C++输入&输出
C语言的输入、输出函数分别是scanf、printf等,那么C++是怎么输入输出的呢?
首先来讲一下头文件的展开:
#include<iostream> // 记忆方式:input + output + 流
头文件的展开意思是,把以下在iostream库里面的代码都复制到Test.cpp这个源文件下。
作用:
在使用cout和cin之前,通常需要引用头文件<iostream>来包含所需的定义和声明。这是因为cout和cin是iostream库中的对象,而<iostream>头文件包含了这些对象的定义。 如果在代码中没有引用<iostream>头文件,编译器可能无法找到cout和cin的定义,从而导致编译错误。因此,为了正确地使用cout和cin,通常需要在代码中引用<iostream>头文件。
接着来讲一下std的展开:
using namespace std;//展开是为了给使用者授权,也就是说把 '墙拆开'
是一个C++中的指令,它的作用是将标准命名空间 std 中的所有名称引入当前的命名空间,以便在代码中直接使用这些名称,而无需在前面加上 std:: 的前缀。 C++的标准库(包括iostream、string、vector等)中的定义都位于 std 命名空间中。当我们使用标准库中的函数、类或对象时,通常需要在前面加上 std:: 前缀来指明它们来自于 std 命名空间 使用 std::cout 和 std::cin 来访问标准输出和标准输入对象
然而,为了简化代码并提高可读性,可以使用 using namespace std 指令将 std 命名空间中的名称引入当前命名空间。这样,在代码中就可以直接使用 cout 和 cin,而无需每次都加上 std:: 前缀。
但也存在一些潜在的问题。由于引入了整个 std 命名空间,可能会导致命名冲突问题,特别是在大型项目中或与其他库/代码一起使用时。因此,在头文件中通常不建议使用 using namespace std;以避免可能的命名冲突。在源文件中使用时,可以根据个人偏好和代码的规模来决定是否使用该指令
说明:
1.使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含< iostream >头文件 以及按命名空间使用方法使用std。 2.cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。 3.<<是流插入运算符,>>是流提取运算符。 4.使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动控制格式。 C++的输入输出可以自动识别变量类型。 5.实际上cout和cin分别是ostream和istream类型的对象,>>和<<也涉及运算符重载等知识, 这些知识我们我们后续才会学习,所以我们这里只是简单学习他们的使用。后面我们还有有 一个章节更深入的学习IO流用法及原理
注意 :早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,
规定C++头文件不带.h ;旧编译器(vc 6.0)中还支持<iostream.h>格式,后续编译器已不支持,因
此推荐使用<iostream>+std的方式。
图解:
代码实现:
#include <iostream> using namespace std; int main() { int a; double b; char c; int i; int j; // 可以自动识别变量的类型 cout << "输入:"; cin >> a; cin >> b >> c; cout << "输出:"<<endl; cout << a << endl; cout << b << " " << c << endl ; cout << "打印地址:" << endl; cout << &i << endl; cout << &j << endl; return 0; }
缺省参数
缺省参数概念
缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
#include<iostream> using namespace std; void Func(int a =1) { cout << a << endl; } int main() { Func(2);// 传参时,使用指定的实参 Func();// 没有传参时,使用参数的默认值(a = 1) return 0; }
执行:
4.2 缺省参数分类
全缺省参数
显示传参,传参从左往右传
void Func(int a = 10 , int b = 10,int c=10) { 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; }
代码执行:
半缺省参数
1. 半缺省参数必须从右往左依次来给出,不能间隔着给
// 半缺省 -- 必须从右往左,给缺省值 #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(100, 200, 300); return 0; }
代码执行:
2. 缺省参数不能在函数声明和定义中同时出现
//a.h #pragma once void Func(int a = 10); //Test.cpp #include<iostream> using namespace std; #include"a.h" void Func(int a = 20) { cout << "a=" << a << endl; } int main() { Func(); return 0; }
执行:
如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该 用那个缺省值。
3. 缺省值必须是常量或者全局变量 4. C语言不支持(编译器不支持)
半缺省参数的应用
函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。 比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了。
函数重载概念
函数重载:是函数的一种特殊情况,C++允许在 同一作用域中声明几个功能类似 的同名函数,这些同名函数的 形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
C语言不允许同名函数,CPP可以,但是要求构成函数重载
1、参数类型不同(函数名相同)
//函数名相同,参数不同 #include<iostream> using namespace std; int Add(int left, int right) { cout << "int Add(int left, int right)" << endl; return left + right; } double Add(double left, double right) { cout << "double Add(double left,double right)" << endl; return left + right; } int main() { cout << Add(1, 2) << endl; cout << Add(1.2, 2.2) << endl; }
代码执行:
2、参数个数不同
void f() { cout << "f()" << endl; } void f(int a) { cout << "f(int a)" << endl; } int main() { f(); f(10); return 0; }
代码执行:
3.参数类型顺序不同
注意这个顺序不是形参的名字的顺序,是数据类型的顺序
#include<iostream> using namespace std; void f(int a, char b) { cout << "f(int a,char b)" << endl; } void f(char a, int b)//对应上面那个func { cout << "f(char a, int a)" << endl; } int main() { f(10, 'a'); f('a', 10); return 0; }
代码执行:
cout与cin等关键字自动识别类型的本质--函数重载
代码实现:
int main() { int i = 1, j = 2; double k = 1.11, l = 2.2; cout << i<<endl; cout << k; }
执行:
不构成函数重载:
1.返回值不同不能构成函数重载
2.不同的命名空间域内
3.函数缺省的函数重载
改正:
代码实现:
void func(int a) { cout << "void func(int a)" << endl; } void func(int a, int b = 1) { cout << "void func(int a,int b)" << endl; } int main() { func(1,2);//那就是调用上边两个参数的那个函数 //调用存在歧义,不知道调用哪个 //func(1); return 0; }