C++ 从零基础到入门(3)—— 函数基础知识

这篇具有很好参考价值的文章主要介绍了C++ 从零基础到入门(3)—— 函数基础知识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、函数简介

1、函数的作用和目的

2、函数的基本概念

二、函数定义与声明

1、函数定义的语法和结构

2、函数原型

三、参数传递

1、值传递

2、引用传递

3、指针传递

4、参数传递的选择

5.引用传递与指针传递的区别

四、返回值

1、返回类型

2、返回语句


一、函数简介

1、函数的作用和目的

在 C++ 中,函数的主要作用和目的有以下几点:

  1)模块化:函数使得我们可以将大型、复杂的程序拆分为更小、更易处理的模块。这些模块就是函数,它们实现了程序的各个子任务。通过将复杂问题拆分成较小的、独立的部分,我们可以更有效地组织和维护代码。

  2)提高代码的可读性:良好的函数命名能够清楚地表达函数的目的和功能。这样,在阅读代码时,我们可以从函数名快速理解代码的作用,而不必详细了解函数内部的实现细节。良好组织的代码使得阅读和理解程序更为容易。

  3)代码重用:函数为代码提供了重用性。将特定功能封装到函数中,可以在不同部分的程序多次调用该函数。这有助于减少代码冗余,使代码更容易维护。如果需要修改某个功能,只需要修改该函数的实现,而无需修改多处重复的代码。

  4)隔离代码:通过在函数中封装特定的功能,可以将实现细节与其他代码隔离开,有利于排查错误和调试程序。函数中的局部变量和参数域可以确保函数的输入和输出在函数的调用之间是独立的,这有助于减少程序中的相互依赖和潜在的错误。

  5)调试和测试:与大的、复杂的代码块相比,独立的函数更容易调试和测试。我们可以针对特定功能编写测试用例,验证函数是否正确实现了预期的功能。

  通过充分利用函数的这些优势,我们可以编写出更简洁、易读、高效且可维护的代码。函数是编程中的基本构建块,熟练掌握函数的作用和目的是成为一名高效的程序员的关键。

2、函数的基本概念

  函数具有以下基本概念:

  1)函数名:每个函数都有一个唯一的标识符,称为函数名。通过函数名进行函数调用以执行其功能。

  2)参数列表:参数列表是用于向函数发送输入的一组变量。这些变量称为形式参数。参数列表可以为空,表示函数无需输入。形式参数可以是任意数据类型,并在调用时与实际参数关联。

  3)返回类型:函数可以返回一个值,称为返回值。返回类型指定了该值的数据类型。如果没有返回值,使用关键字 void 表示。

  4)函数体:函数体是用花括号 {} 包围的一组 C++ 语句,用于描述函数如何完成任务。函数体包括定义局部变量、执行计算以及返回结果等操作。

  5)调用:要执行函数中的代码,需要在程序的某个地方调用该函数。函数调用包括函数名和一组实际参数(如果有的话)。

  函数既可以作为程序的基本构造块(如求和、搜索、排序等),也可以用于定义更复杂的功能(如在面向对象编程中表示对象的行为)。掌握函数的基本概念可以帮助您更好地理解和应用 C++ 函数,从而使您的代码更具组织性和可重用性。

二、函数定义与声明

1、函数定义的语法和结构

C++函数定义主要包括四个部分:返回类型、函数名、参数列表和函数体。我们可以通过以下示例来了解它们:

#include <iostream>

using namespace std;

// 函数原型声明
int multiply(int a, int b);

int main()
{
    int x = 4;
    int y = 5;

    int result = multiply(x, y); // 函数调用

    cout << "x * y = " << result << endl;

    return 0;
}

// 函数定义
int multiply(int a, int b)
{
    int product = a * b; // 函数体,执行具体操作

    return product; // 返回值
}

在这个示例中:

返回类型:int 。该类型说明要从函数返回的值的数据类型。

函数名:multiply 。这是一个唯一标识符,用于定义和调用函数。

参数列表:(int a, int b):这里,我们有两个整型参数,分别是a和b。参数列表为空时,我们用void。

函数体:在大括号 {} 中包含的代码块。这部分是实际执行计算和操作的地方,在这里我们计算 a * b 的乘积,并将结果存储在变量 product 中。最后,我们用 return 语句返回这个值。

2、函数原型

函数原型(又称函数声明)是C++中告知编译器函数签名的一种方式。它提供了有关函数的基本信息,包括函数名、返回类型和参数列表。在编译过程中,编译器根据这些信息为函数调用分配内存和生成相应的代码。

下面的例子说明了C++中函数原型的定义:

#include <iostream>

using namespace std;

// 函数原型声明(告知编译器有关subtract函数的信息)
int subtract(int a, int b);

int main()
{
    int x = 10;
    int y = 5;

    int result = subtract(x, y); // 函数调用

    cout << "x - y = " << result << endl;

    return 0;
}

// 函数定义 (具体实现subtract函数)
int subtract(int a, int b)
{
    int difference = a - b; // 函数体,执行具体操作

    return difference; // 返回值
}

上述代码中(在main函数之前)的部分 int subtract(int a, int b); 是函数原型,具有以下信息:

返回类型:int,表示此函数将返回一个整数值。

函数名:subtract,用于标识此函数。

参数列表:(int a, int b) 表示此函数接受两个整数参数 a 和 b。

函数原型有助于确保正确地使用函数,尤其是在大型项目中,这可以提高源代码的模块化和可读性。它使您可以先声明函数,然后在其他地方具体实现它们。

三、参数传递

1、值传递

值传递 是C++中最常见的参数传递方式,以传值方式将实参传递给形参。在这种传递方式中,函数使用实参的副本(值的拷贝),而不是实际变量本身。因此,对形参进行的任何更改都不会影响到实际的实参。

下面的例子说明了值传递:

#include <iostream>

using namespace std;

// 函数原型声明 (使用值传递)
void valuePass(int num);

int main()
{
    int x = 5;

    cout << "Before function call, x = " << x << endl;

    valuePass(x); // 函数调用

    cout << "After function call, x = " << x << endl;

    return 0;
}

// 函数定义 (使用值传递)
void valuePass(int num)
{
    num = num + 10; // 修改形参

    cout << "Inside function, num = " << num << endl;
}

输出结果如下:

Before function call, x = 5

Inside function, num = 15

After function call, x = 5

这个例子展示了,当我们在main函数中调用valuePass(x)时,将 x 变量的值传递给函数 valuePass 中的形参 num。在 valuePass 函数内部,我们对 num 进行了修改,但在函数调用之后,x 的值依然保持不变。这说明函数并未直接修改实参 x 的值,而是对它的一个副本进行修改。这就是值传递的特点。

2、引用传递

在C++中,除了值传递之外,我们还可以使用引用传递来传递函数参数。通过引用传递,函数使用实际参数的引用(别名)而不是其副本。因此,对形参的更改会直接影响实际参数。引用传递提供了一种有效的方法来修改实参的值,同时避免了实参拷贝的开销。

下面的示例展示了引用传递:

#include <iostream>

using namespace std;

// 函数原型声明(使用引用传递)
void referencePass(int &num);

int main()
{
    int x = 5;

    cout << "Before function call, x = " << x << endl;

    referencePass(x); // 函数调用

    cout << "After function call, x = " << x << endl;

    return 0;
}

// 函数定义(使用引用传递)
void referencePass(int &num)
{
    num = num + 10; // 修改形参,实际也修改了实参

    cout << "Inside function, num = " << num << endl;
}

输出结果:

Before function call, x = 5

Inside function, num = 15

After function call, x = 15

在这个例子中,我们通过引用传递实参 x 给 referencePass 函数。在函数内,我们对形参 num进行了修改。当函数返回时,我们可以看到实参数 x 的值也被更改了。这意味着对引用参数的修改直接改变了实际参数的值。这就是引用传递的一个显著特点。

3、指针传递

在C++中,除了值传递和引用传递外,还可以使用指针传递来传递函数参数。通过指针传递,函数接收指向实际参数的指针,因此可以间接地访问和修改实际参数。指针传递避免了实参的拷贝,并允许通过操作指针来修改实参。

以下示例展示了指针传递的用法:

#include <iostream>

using namespace std;

// 函数原型声明(使用指针传递)
void pointerPass(int *num);

int main()
{
    int x = 5;

    cout << "Before function call, x = " << x << endl;

    pointerPass(&x); // 函数调用时传递x的地址

    cout << "After function call, x = " << x << endl;

    return 0;
}


// 函数定义(使用指针传递)
void pointerPass(int *num)
{
    *num = *num + 10; // 通过指针修改实参的值

    cout << "Inside function, *num = " << *num << endl;
}

输出结果:

Before function call, x = 5

Inside function, *num = 15

After function call, x = 15

在这个示例中,我们通过指针传递实参 x 的地址给 pointerPass 函数。在函数内部,我们使用指针 num 存取实参 x 的值并对其进行修改。当函数返回后,我们可以看到实参 x 的值已经发生了改变。这表明通过指针对参数进行的修改可以改变实际参数的值,这是指针传递的一个主要特点。

4、参数传递的选择

在C++中,根据不同的情况,我们可以选择以下三种参数传递方式:值传递、引用传递和指针传递。以下是如何选择合适的参数传递方式的简要说明:

值传递:当你希望保证实参不被修改时,请选择值传递。这通常用于传递基本数据类型(如int、float、char等)和小型自定义数据结构。需要注意的是,由于值传递涉及到拷贝操作,因此在传递大型数据结构时可能会导致性能下降。

pp

int function(int a){...}

引用传递:当您希望修改实参以及避免数据拷贝操作时,请选择引用传递。这通常用于大型数据结构、数组或类对象的传递。为了确保不会意外地修改参数,可使用在参数前加上const 关键字,显式地表示引用参数是只读的。

pp

void function(int &a){...}

void functionWithConst(const string &str){...}

指针传递:指针传递通常用于与现有C代码库互操作或为了向后兼容C风格实践。同样,我们可以借助指针传递实现间接访问和修改实参。当在函数内部使用动态内存分配时,指针传递也是一个合适的选择。在有些情况下,使用指针传递还可以表示可选参数,当指针为nullptr 时,表示参数未被传递。

pp

void function(int *a){...}

void functionWithOptional(int *a=nullptr){...}

5.引用传递与指针传递的区别

  1. 语法:引用传递使用引用符号(&),而指针传递使用指针符号(*)。

  2. 内存操作:引用传递不会创建新的变量副本,而是直接操作原始变量。指针传递则会创建一个指向原始变量的指针,需要通过解引用操作才能访问原始变量。

  3. 空值(null)处理:指针传递可以接受空指针(null),即指针可以指向空的内存地址。而引用传递必须始终指向有效的对象,不能为 null。

  4. 传递方式:引用传递是一种隐式传递方式,函数参数声明时使用引用类型即可。指针传递则需要显式地传递指针作为参数,需要在调用函数时手动取地址或创建指针。

  5. 参数修改:引用传递在函数内部对参数的修改会影响到原始变量,而指针传递需要通过解引用操作才能修改原始变量。

总结来说,引用传递直接操作原始变量,不需要额外的语法和解引用操作,并且不允许为空;而指针传递则需要通过指针符号和解引用操作来操作原始变量,可以为空。选择使用哪种方式取决于具体的需求和编程环境,需要考虑到内存管理、空值处理以及函数参数修改等方面的因素。

四、返回值

1、返回类型

在C++中,函数返回值是通过返回类型来指定的。返回类型是在函数定义和声明中指定的类型,用于告知编译器和其他程序员该函数返回的值的数据类型。C++中的返回类型可以是任意的基本数据类型、用户自定义数据类型、自定义类类型,甚至是指针或引用类型。以下是C++中不同返回类型的简单描述:

1)基本数据类型:一个函数可以返回基本数据类型,如`int`、`float`、`double`、`bool`、`char`等。例如,一个函数可以返回两个整数相加的结果。

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

2)用户自定义数据类型:函数还可以返回结构体、联合体或枚举类型等用户自定义类型。例如,一个函数可以返回两个结构体对象中包含的数据之和。

struct Point {
    int x;
    int y;
};

Point addPoints(const Point& p1, const Point& p2)
{
    Point sum;
    
    sum.x = p1.x + p2.x;
    sum.y = p1.y + p2.y;

    return sum;
}

3)自定义类类型:函数可以返回自定义类类型的对象。例如,一个函数可以返回字符串类的一个实例。

std::string concatenateStrings(const std::string& str1, const std::string& str2) 
{
    return str1 + str2;
}

4)指针类型:如果函数需要返回指针类型的数据,可以使用指针类型作为返回类型。例如,一个函数可能需要返回动态分配的整数数组。

int* createDynamicArray(int size) 
{
    int* arr = new int[size];

    return arr;
}

5)引用类型:当希望函数返回某对象的引用时,可以使用引用类型作为返回类型。这可以避免返回对象时的拷贝成本,但请确保引用的对象在函数返回之后仍然有效,避免返回局部变量的引用。

int& getElement(int *arr, int index)
{
    return arr[index];
}

6)void类型:当一个函数不需要返回任何值时,可以使用void 作为返回类型。此时,函数只执行操作,不返回任何结果,例如打印日志信息。

void printLogMessage(const std::string& msg) 
{
    std::cout << "Log: " << msg << std::endl;
}

对于每个函数,必须指定一个返回类型。在选择返回类型时,请务必确保它与实际返回值匹配,以避免类型不匹配或未定义行为。如果需要返回多个值,则可以使用元组(tuple )或自定义数据结构来组合多个值。

2、返回语句

在C++中,return 语句被用于函数中从函数体返回值并终止函数的执行。当编译器执行到 return 语句时,它会停止当前函数的执行并返回到调用它的代码点。return 语句的使用取决于函数的返回类型,可以有以下几种情况:

1)返回基本数据类型和用户自定义数据类型:当函数返回类型为基本数据类型(如 int,float等)或用户自定义数据类型(如结构体、类对象)时,可以直接在 return 语句后跟上相应类型的值或变量。

int add(int a, int b) 
{
    int result = a + b;

    return result; // 返回整数类型的值
}

std::string getName() 
{
    std::string name = "John Doe";

    return name; // 返回字符串类型的值
}

2)返回指针类型:当函数返回指针类型时,return 语句后应跟着相应类型的指针。

int* getPointer(int &x) 
{
    return &x; // 返回整数类型指针
}

3)返回引用类型:当函数返回引用类型时,return 语句后应跟着相应类型的引用。请注意避免返回局部变量的引用,因为这可能导致未定义行为。

int& getMax(int &a, int &b) 
{
    return (a > b) ? a : b; // 返回整数类型引用
}

4)返回void类型:对于返回类型为void的函数,可以使用return;语句提前终止函数执行。在这种情况下,不能在return语句后跟任何值。如果函数执行到末尾仍未遇到return语句,在大多数编译器下,会自动插入一个return;语句。

void printInfo(int x) 
{

    if (x < 0) {
        std::cout << "Error: negative number" << std::endl;

        return; // 提前终止函数执行
    }

    std::cout << "Number: " << x << std::endl;
}

为了确保代码的正确性和可读性,请在函数中使用适当的return语句,并始终与函数的预期返回类型保持一致。在不需要返回值的情况下,请使用void类型,不要随意省略return语句。文章来源地址https://www.toymoban.com/news/detail-810044.html

到了这里,关于C++ 从零基础到入门(3)—— 函数基础知识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始-学习网络必须掌握的基础知识

    从零开始!学习网络必须掌握的基础知识 完整的100个网络知识,可留言,会发送!点击关注,可获得网工大礼包哈

    2024年02月15日
    浏览(55)
  • 【C++】入门基础知识详解(二)

    目录 一、内联函数 1、概念 2、特性 3、内联函数与宏的优缺点 二、auto(C++11)   1、auto 简介   2、auto的使用细则     2.1 auto与指针和引用结合起来使用     2.2 在同一行定义多个变量   3、auto不能推导的场景     3.1 auto 不能作为函数的参数     3.2 auto 不能直接用来声

    2024年02月11日
    浏览(39)
  • 【C++】入门基础知识详解(一)

    目录 一、C++ 二、命名空间   1、命名空间的定义   2、命名空间的使用 三、C++输入输出 四、缺省参数   1、缺省参数的概念   2、缺省参数的分类     2.1 全缺省参数     2.2 半缺省参数 我们在学习C++之前,我相信大家大多数都对C语言多多少少都有所了解,C语言的关键

    2024年02月12日
    浏览(54)
  • C++基础知识 (命名空间、输入输出、函数的缺省参数、函数重载)

    🌠 例1: #include iostream 标准输入输出 std 是 c++ 标准库的命名空间,将标准库的定义实现都放到这个命名空间中 using namespace std 展开 std 里的内容 cout   c 代表的是 console 控制台的意思, out 有输出的意思 流运算符 流插入 endl 等价于 \\\'n\\\' 在 c++ 中,变量、函数和类的名称存在于

    2024年02月15日
    浏览(44)
  • Web安全入门基础知识(笔记)

    0x01 基础名词 一、域名 1.什么是域名 2.域名在那里注册 3.什么是二级域名,多级域名,顶级域名 4.域名发现对于安全测试的意义 二、DNS 1.什么是DNS 2.本地host和DNS的关系 3.CDN是什么,和DNS有什么关系 三、常见的DNS攻击 四、脚本语言 1.常见的脚本语言有哪些 2.不同的脚本类型于

    2024年02月10日
    浏览(55)
  • 入门必看——渗透测试基础知识笔记

    sql 注入攻击是通过将恶意的 sql 查询或添加语句插入到应用的输入参数中,再在后台 sql 服务器上解析 执行进行的攻击 头部注入(ua,cookie,referer) 联合注入 报错注入 布尔盲注 时间盲注 堆叠注入宽字节注入 布尔盲注:根据注入信息返回true or fales 没有任何报错信息 时间盲

    2024年02月14日
    浏览(54)
  • 【C++从入门到精通】第2篇:C++基础知识(中)

    本节,我们将更多地讨论在“Hello, World!”程序中使用的 std::cout 语句,将文本“Hello, World!”输出到控制台。我们还将探讨如何从用户获取输入,我们将使用这些使我们的程序更具交互性。 输入/输出库 (io 库)是处理基本输入和输出的C++标准库的一部分。我们将使用此库中的

    2024年02月07日
    浏览(44)
  • C++基础知识点整理笔记(四)

    10. C++的内存管理 在C++中,内存被分成五个区:栈、堆、自由存储区、静态存储区、常量区 (一) 栈:存放函数的参数和局部变量,编译器自动分配和释放 (二) 堆:new动态分配的内存,由程序员手动进行释放,否则程序结束后,由操作系统自动进行回收 (三) 自由存储区

    2024年02月15日
    浏览(52)
  • C++ 基础知识笔记(一)变量和数据的输入输出

    C++的基础知识包括如下内容: 变量和数据的输入输出 数据类型和运算符 比较运算符和布尔类型 if-else 选择语句、多分支语句 switch 分支语句 逻辑运算符 for 循环 for 循环进阶 数组 数组进阶 while 循环 格式化输入输出 浮点数和数据类型转换 字符串和字符数组 string 类型的字符

    2024年02月09日
    浏览(45)
  • 深度学习基础知识笔记

    怎么样提特征 (1)无人驾驶, 计算机视觉 (2)人脸识别 移动端-计算量太大,速度慢,卡。 参数:成千上百万的。 (3)医学 (4)变脸 (5)图像自动上色 有监督的问题, 1 分类: 挑战:照射角度,形状改变,部分遮挡,背景混入 套路:收集数据给定标签,训练分类器

    2024年02月13日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包