Android C++系列:函数知识知多少

简介: 函数可以理解为功能的封装,很基础的功能单元,但是因为它虽然看似简单,但是里面涉及了不少知识点和技巧,我们花一篇文章来整理。

image.png


1. 背景


函数可以理解为功能的封装,很基础的功能单元,但是因为它虽然看似简单,但是里面涉及了不少知识点和技巧,我们花一篇文章来整理。


2. 函数定义


函数有以下几部分定义:


  • 返回类型
  • 函数名称
  • 形参列表
  • 函数体


函数调用的形式是函数名(),函数调用过程涉及到控制权转移。


函数体其实是一个语句块,语句块会涉及到作用域的问题,在函数方法体内定义的变量都是局部变量,局部变量会在函数执行完后被销毁,所以我们不给函数返回局部变量。


在函数体内定义的static类型对象称为局部静态对象,局部静态对象一旦定义和初始化,会直到程序终止时才会被销毁,最常用的场景是我们统一函数调用次数,可以在函数体内定义一个static局部静态对象,然后每调用一次累加一次。


3. 实参与形参


实参是形参的初始值,实参的类型必须与对应的形参匹配。


函数的形参列表可以为空,也可以有多个值,甚至新版本还为我们提供了可变参数。


只存在于块执行期间的对象称为自动对象,形参就是一种自动对象,在函数开始时为形参申请存储空间,函数终止,形参也会被销毁。实参会初始化形参对应的自动对象。


我们每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化。形参初始化过程和变量初始化一个道理。

实参初始化形参分两种:


  • 引用传递
  • 值传递(拷贝)


有种情况是形参是指针,当指针拷贝时,拷贝的是指针的值,拷贝完后,两个指针是不同的指针。但是由于它们指向同一块地方,所以可以通过指针修改它指向对象的值。


最佳实践:


  • 我们要尽量使用引用避免拷贝,特别是特别大的类类型对象或者容器时,拷贝会影响效率。
  • 当函数无须修改引用形参的值时,我们尽量使用常量引用。


3.1 const形参


我们知道C++中,允许我们定义不同形参列表相同名字的函数,不同形参指形参类型或者形参数量。但是如果只是一个函数除了const修饰外,其他形参都相同,那么这两个函数算同一个函数。为什么呢?因为类似于变量赋值,实参初始化形参时,会忽略顶层const。


4. 函数声明


函数也类似于变量,使用之前必须声明。而且函数只能定义一次,但是可以声明多次。如果函数一直不会被调用到,可以只声明不定义。声明和定义的唯一区别就是声明不需要函数体,也不需要形参名字,但是为了见名知意,我们声明时也尽量加上形参名。


我们一般在头文件中声明函数,在源文件中提供定义。


与C语言类似,C++也是分离式编译,分离式编译允许我们把程序分割到几个文件中,每个文件独立编译。


5. 总结


本文介绍了C++函数的基础知识,大部分跟C语言很类似。本文主要介绍了基础的实参形参、函数声明相关的概念和知识。

目录
相关文章
|
5月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
156 0
|
8月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
474 6
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
492 6
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
131 3
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
291 0
C++ 多线程之线程管理函数
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
110 3
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
2343 1
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
175 1
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
207 0
C++入门6——模板(泛型编程、函数模板、类模板)

热门文章

最新文章

下一篇
oss云网关配置