【C++初阶】第一站:C++入门基础(上) -- 良心详解-2

简介: 【C++初阶】第一站:C++入门基础(上) -- 良心详解-2

【C++初阶】第一站:C++入门基础(上) -- 良心详解-1

https://developer.aliyun.com/article/1456953


C++输入&输出

       C语言的输入、输出函数分别是scanf、printf等,那么C++是怎么输入输出的呢?


首先来讲一下头文件的展开:


#include<iostream>  // 记忆方式:input + output + 流


       头文件的展开意思是,把以下在iostream库里面的代码都复制到Test.cpp这个源文件下。

22cebe82e0bf49618651ce051d13279b.png



作用:


 

在使用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 来访问标准输出和标准输入对象

0aacde93cf38464ab16e17c2aae346ce.png


     

然而,为了简化代码并提高可读性,可以使用 using namespace std 指令将 std 命名空间中的名称引入当前命名空间。这样,在代码中就可以直接使用 cout 和 cin,而无需每次都加上 std:: 前缀。

fb065199ee6149efb3af2aa4860290c2.png


     

但也存在一些潜在的问题。由于引入了整个 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的方式。

图解:

0200efeaeef14621b9f68597b4534056.png


代码实现:


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

执行:



c1c7ec3635f849e1abe73bae4e94b2e3.png

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

代码执行:


d9377ec24ce441958c714ec0a505ae37.png


半缺省参数

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

代码执行:


3044506152724dccb5b058c268f9ac3d.png


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语言不支持(编译器不支持)

半缺省参数的应用


88dfdc8f975f43258778f43e7a2d4f3e.png

函数重载

   

自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
        比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了。

函数重载概念

     

函数重载:是函数的一种特殊情况,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;
}

代码执行:


69aad36e6f7a471a98c491582b65b111.png


2、参数个数不同

void f()
{
 cout << "f()" << endl;
}
void f(int a)
{
 cout << "f(int a)" << endl;
}
int main()
{
  f();
  f(10);
 return 0;
}


代码执行:


b0f5b2d8edc24deb893f53488aa1b0c9.png


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


代码执行:


d6154051897f41cbb0b103bfa662aaf4.png


cout与cin等关键字自动识别类型的本质--函数重载


代码实现:


int main()
{
  int i = 1, j = 2;
  double k = 1.11, l = 2.2;
  cout << i<<endl;
  cout << k;
}

执行:


035cd0d08df44b7295ec944ffc179d29.png


不构成函数重载:

1.返回值不同不能构成函数重载

72c66033935d4675a69352c67973abae.png


2.不同的命名空间域内


e42cfa362dba4c919f8fae431fcf4e4f.png

3.函数缺省的函数重载

1544bb5fe2af4e85bbfb95588931d842.png


改正:

6674ed12b93e42eaa732fed7aece339f.png


代码实现:


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


相关文章
|
17天前
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
30 2
C++入门12——详解多态1
|
17天前
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
45 1
|
6天前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
13 0
|
6天前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
12 0
|
15天前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
15天前
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)
|
17天前
|
编译器 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
C++入门11——详解C++继承(菱形继承与虚拟继承)-2
26 0
|
17天前
|
程序员 C++
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
C++入门11——详解C++继承(菱形继承与虚拟继承)-1
30 0
|
17天前
|
存储 算法 C++
C++入门10——stack与queue的使用
C++入门10——stack与queue的使用
35 0
|
17天前
|
存储 C++ 容器
C++入门9——list的使用
C++入门9——list的使用
17 0