lesson0-C++入门 2

简介: lesson0-C++入门

#5. 函数重载

C语言中,假设我们有一个函数,叫做

int Add(int a,int b),这是一个加法函数,返回值为int类型,当我们想做double类型的两个数相加时,那么就要再写一个函数,并且重新起一个名字,不管是叫Add_double也好,还是叫什么,如果我们有多个加法函数,那么要起多少个名字?总之是给我们带来了不便,我们就想,能不能不改名字,还能找到这样的函数,C语言不可以,于是C++有了函数重载

1、参数类型不同

#include <iostream>
using namespace std;
int Add(int a, int b)
{
  return a + b;
}
double Add(double a, double b)
{
  return a + b;
}
int main()
{
  cout << Add(1314.0, 0.0);
  cout << Add(500, 20) << endl;
  return 0;
}

2、参数个数不同

#include <iostream>
using namespace std;
void f()
{
  cout << "我没有参数" << endl;
}
void f(int a)
{
  cout << "哈哈,我有参数:" << a << endl;
}
int main()
{
  f();
  f(6);
  return 0;
}

3、参数类型顺序不同

#include <iostream>
using namespace std;
int Add(int a, int b)
{
  return a + b;
}
int Add(int a, int b, int c)
{
  return a + b + c;
}
int main()
{
  cout << "两个参数:>" << Add(1, 2) << endl;
  cout << "三个参数:>" << Add(1, 2, 3) << endl;
  return 0;
}

#6. 引用

引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空 间,它和它引用的变量共用同一块内存空间

类型& 引用变量名(对象名) = 引用实体

int main()
{
  int a = 6;
  int& b = a;
  cout << "a地址> " << &a << " b地址> " << &b << endl;
  return 0;
}

所以b就是a的别名,好比你的大名和小名,不管叫那个都是你。

void Swap(int* a, int* b)
{
  int temp = *a;
  *a = *b;
  *b = temp;
}
int main()
{
  int a = 1;
  int b = 2;
  Swap(&a, &b);
  cout << "a = " << a  <<  " b = " << b << endl;
  return 0;
}

e515e13c68dc48a085f7f7763accecf8.png

void Swap(int& a, int& b)
{
  int temp = a;
  a = b;
  b = temp;
}
int main()
{
  int a = 1;
  int b = 2;
  Swap(a, b);
  cout << "a = " << a  <<  " b = " << b << endl;
  return 0;
}

引用特性

1. 引用在定义时必须初始化

2. 一个变量可以有多个引用

3. 引用一旦引用一个实体,再不能引用其他实体

int main()
{
  int a = 0;
  int& b = a;
  int& c = a;
  int& d = c;
  cout << a << b << c << d << endl;
  return 0;
}

8b106d4be8d04ba08d351515d809fb8e.png

int main()
{
  int a = 0;
  int b = 1;
  int& c = a;
  c = b;
  cout << c << endl;
  return 0;
}

0b03abd6f6b64dfa91964a277ad437b7.png

int main()
{
  int a = 0;
  int b = 1;
  int& c = a;
  c = b;
  cout << c << endl;
  cout << "&a = " << &a << "\n&c = " << &c << "\n&b = " << &b << endl;
  return 0;
}

常引用

const int a = 0;
const int& c = a;
const int& e = 10;
//这是OK的
const double& d = a;

至于上面的const限定的为什么可以,我们先来看代码。

int main()
{
  int a = 9;
  double c = a;
  return 0;
}

这里为什么可以呢?

在强制类型转换时,会生成一个临时变量,将临时变量的值强制转换后在赋值。

使用场景

1. 做参数

我们上面的交换函数就是。

2.做返回值

int& Add(int a, int b)
{
  static int c = a + b;
  return c;
}
int main()
{
  int& a = Add(3, 5);
  cout << a << endl;
  a = 98;
  a = Add(a, 2);
  cout << a << endl;
  return 0;
}

怎么会是98呢?不应该是100吗?

注意:static 修饰的变量只会初始化一次,再次调用时跳过初始化语句。

int& Add(int a, int b)
{
  static int c;
  c = a + b;
  return c;
}
int main()
{
  int& a = Add(3, 5);
  cout << a << endl;
  a = 98;
  a = Add(a, 2);
  cout << a << endl;
  return 0;
}

那么问题是,我直接返回值不好吗,为什么要引用返回呢?

1.以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效 率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低.

引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

int main()
{
  int a = 10;
  int& ra = a;
  cout << "&a = " << &a << endl;
  cout << "&ra = " << &ra << endl;
  return 0;
}

def9fdc6570b41ed88f3889f56ed8b24.png


目录
相关文章
|
9月前
|
存储 安全 编译器
c++入门
c++作为面向对象的语言与c的简单区别:c语言作为面向过程的语言还是跟c++有很大的区别的,比如说一个简单的五子棋的实现对于c语言面向过程的设计思路是首先分析解决这个问题的步骤:(1)开始游戏(2)黑子先走(3)绘制画面(4)判断输赢(5)轮到白子(6)绘制画面(7)判断输赢(8)返回步骤(2) (9)输出最后结果。但对于c++就不一样了,在下五子棋的例子中,用面向对象的方法来解决的话,首先将整个五子棋游戏分为三个对象:(1)黑白双方,这两方的行为是一样的。(2)棋盘系统,负责绘制画面。
132 0
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
12月前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
编译器 C++
C++入门12——详解多态1
C++入门12——详解多态1
181 2
C++入门12——详解多态1
|
C++
C++入门13——详解多态2
C++入门13——详解多态2
247 1
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
154 0
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
217 0
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
编译器 Linux C语言
【C++入门(上)】—— 我与C++的不解之缘(一)
【C++入门(上)】—— 我与C++的不解之缘(一)