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


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