C++函数必备简单知识

简介: C++函数必备简单知识

 

1、函数的定义与声明

(1)定义

int add(int a,int b)
{
int c = a+b;
return c;
}

明确了函数接受什么参数,返回什么值,具体进行什么操作(实现)

(2)声明

int add(int a,int b);

明确了函数接受什么参数和返回什么值(比如上面的int指明返回值类型)

2、指针传参

实质就是指针的值传参

#include <iostream>
using namespace std;
void swap(int* pa, int* pb) 
{
  int temp = *pa;
  *pa = *pb;
  *pb = temp;
}
int main()
{
  int m = 10, n = 20;
  int* pm = &m, * pn = &n;
  swap(pm, pn);
  cout << m << endl << n;
}

指针的值是地址,实际上就是pm和pn对pa和pb的值传参

可以看到m和n的值已被交换

3、引用

特指左值引用,即给一个已经有名字的变量起别名,不能存在空引用。

#include <iostream>
using namespace std;
int main()
{
  int a = 10;
  int &b = a, &c = b;
  cout << b << endl; //b是a的一个引用(别名),输出b就相当于输出a的值
  c++;  //c是a的一个引用(别名),c自增就是a自增
  cout << a;
}

可以理解为变量b和c的类型为int & ,叫做整形引用  

输出结果如下:

 

4、函数的引用传参

即形参就是实参的一个别名

#include <iostream>
using namespace std;
void swap(int &a, int &b) 
{
  int temp = a;
  a = b;
  b = temp;
}
int main()
{
  int m = 10, n = 20;
  swap(m, n);
  cout << m << endl<<n;
}

同样实现了m和n的交换,且代码更简洁

5、函数重载 overlord

多个函数名字相同,参数列表(数量、类型)不同

(1)参数数量不同

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

根据输出我们可以看出,尽管函数名都为add,但编译器会根据实参的数量自动匹配调用哪个函数

(2)参数类型不同

#include <iostream>
#include <string>
using namespace std;
int myadd(int a, int b)
{
  return a + b;
}
string myadd(int a,string b)
{
  return to_string(a) + b;
}
int main()
{
  cout << myadd(123, 456) << endl;
  cout << myadd(123, "abc");
}

同样,编译器根据实参类型自动匹配需要调用的函数

这里说明一下:

C++中 的 "to_ string " 函数 用于将数字转换为字符串

要使用这个函数只需 #include <string>

6、避免overlord歧义

不允许仅有返回值不同的函数重载,重载是针对参数列表的。

比如:

#include <iostream>
#include <string>
using namespace std;
int my(int a, int b)
{
  return a + b;
}
string my(int a,int b)
{
  return to_string(a) + to_string(b);
}
int main()
{
  cout << my(123, 456) << endl;
  cout << my(123, 456);
}

可以看到编译器报错了,这样是无法重载的!

overlord与返回值无关,只要满足

声明时:名字相同;参数列表不同

调用时:不产生匹配歧义

7、内联函数inline

首先要明确一点,inline只是建议,

并不是写了inline关键字就一定会被内联,要看编译器是否采纳;

其次,内联这个动作发生在编译时,是为了提升运行时的效率。

8、其他总结

(1)默认参数应放在形参列表最后面,设置参数默认值时应从右向左

比如:

int func(int a,int b=2)

而 int func(int b=2,int a)则是不对的

(2)除函数形参外,其他引用定义时必须赋初始值

类型 & 变量名:定义一个该类型的引用

& 变量:对变量取地址,得到一个指针

(3)函数重载目的

方便调用方编写代码,提高可读性。

(4)函数体语句较多时不适合声明为内联函数

用函数体语句多少来衡量函数功能的简单与复杂,一般是将功能简单的函数声明为内联函数

目录
相关文章
|
29天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
45 6
|
1月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
23 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
159 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
30 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
41 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
2月前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
22 3
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
34 6