0

0

第六章C++:函数基础与应用

php是最好的语言

php是最好的语言

发布时间:2018-08-06 10:47:13

|

1662人浏览过

|

来源于php中文网

原创

第六章 函数

函数是一个命名了的代码块,通过调用函数执行相应的代码。

函数基础

  • 通过调用运算符(call operator)来执行函数。其形式是一对圆括号。

  • 函数的调用完成两项工作(如下),此时主调函数(calling function)的执行被暂时中断,被调函数(called function)开始执行。

  • return语句:

    • 返回return语句中的值

    • 将控制权从被调函数移回主调函数

局部对象

  • 名字有作用域,对象有生命周期(lifetime)

  • 自动对象(automatic object):当函数的控制路径经过变量定义语句时创建该对象,当达到定义所在的块末尾时销毁它。

  • 局部静态对象:程序执行路径第一次经过对象定义语句时初始化,知道程序终止才被销毁。

    • 将局部变量定义为static获得,例如:

      //统计函数count_calls ()被调用了多少次
      size_t count_calls ()
      {
      static size_t ctr = 0;  //调用结束后,这个值仍然有效
      return ++ctr;
      }
      int main()
      {
      for (size_t i = 0; i != 10; ++i)
      cout return 0;
      }

函数声明

  • 也称作函数原型(function prototype)

  • 函数三要素(返回类型、函数名、形参类型)描述了函数的接口,函数声明中形参名可省略。

  • 函数应在头文件中声明,源文件中定义。

  • 分离式编译

参数传递

如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参。
- 如果无需修改引用形参的值,最好将其声明为常量引用。

main:处理命令行选项

假设main函数位于可执行文件prog内,我们可以向程序传递下面的选项:

prog -d -o ofile data0

这些命令通过两个可选的形参传递给main函数:

int main(int argc, char *argv[]) {...}
//或:
int main(int argc, char **argv) {...}

当实参传给main函数之后,argv的第一个元素指向程序的名字或者一个空字符串,接下来的元素一次传递命令行提供的实参。最后一个指针只会掉元素值保证为0。
- 以上面的命令行为例:

argc = 5;argv[0] = "prog";argv[1] = "-d";argv[2] = "-o";argv[3] = "ofile";argv[4] = "data0";argv[5] = 0;

含有可变形参的函数

  • C++11新标准提供两种方法编写能处理不同数量实参的函数:

  1. 所有实参类型相同,可以传递一个名为initializer_list的标准库类型。

  2. 实参类型不同,我们可以编写一种特殊的函数,叫做可变参数模板。

  • C++还有一种特殊的形参类型:省略符。可以用它传递可变数量的实参。这种功能一般只用于与C函数交互的接口程序。

  • initializer_list形参

    • 其类型定义在同名的头文件中

    • 提供如下操作:

      initializer_list lst;    //默认初始化,T类型元素的空列表
      initializer_list lst{a,b,c...};
      //lst的元素数量和初始值一样多;lst的元素是对应初始值的副本;列表中的元素是const
      lst2(lst)
      lst2 = lst  //拷贝或复制一个initializer_list对象不会拷贝列表中的元素;拷贝后,原始列表和副本元素共享
      lst.size()  //列表中元素的数量
      lst.begin() //返回指向lst中首元素的指针
      lst.end()   //返回指向lst中尾元素下一位置的指针

    返回类型和return语句

    • 引用返回左值,其他返回类型得到右值。

    • 列表初始化返回值:C++11新标准规定,函数可以返回花括号包围的值的列表。

      网页制作与PHP语言应用
      网页制作与PHP语言应用

      图书《网页制作与PHP语言应用》,由武汉大学出版社于2006出版,该书为普通高等院校网络传播系列教材之一,主要阐述了网页制作的基础知识与实践,以及PHP语言在网络传播中的应用。该书内容涉及:HTML基础知识、PHP的基本语法、PHP程序中的常用函数、数据库软件MySQL的基本操作、网页加密和身份验证、动态生成图像、MySQL与多媒体素材库的建设等。

      下载

    主函数main的返回值

    • 允许main函数没有返回值(若没有,编译器隐式地插入return 0)

    • 返回0表示执行成功,其他值依机器而定。

    • 为了使返回值与机器无关,cstdlib头文件定义了两个预处理变量,分别表示成功和失败:

      return EXIT_FAILURE;
      return EXIT_SUCCESS;
      //因为它们是预处理变量,所以既不能在前面加上std::,也不能在using声明里出现。

    返回数组指针

    1. 使用类型别名

      typedef int arrT[10];   //arrT是一个类型别名,它表示的类型是含有10个整数的数组
      using arrT = int[10];   //与上一句等价
      arrT* func(int i);      //func返回一个指向含有10个整数的数组的指针

    2. 声明一个返回数组指针的函数,形式如下

      Type (*function(parameter_list)) [dimension]
      //Type表示返回的数组指针指向的数组元素类型
      //dimension表示数组的大小
      //例如:
      int (*func(int i)) [10];

    3. 使用尾置返回类型(C++11)

      auto func(int i) -> int(*)[10];

    4. 使用decltype

      int odd[] = {1,3,5,7,9};
      int even[] = {0,2,4,6,8};
      decltype(odd) *arrPtr(int i)
      {
         return (i % 2) ? &odd : &even;  //返回一个指向数组的指针
      }

    函数重载

    如果同一作用域内的几个函数名字相同但形参列表不同,我们称之为重载(overloaded)函数

    • 不允许两个函数除了返回类型外其他所有要素都相同。

    • 重载与作用域:一旦在当前作用域中找到了所需的名字,编译器就会忽略掉外层作用域中的同名实体。

    特殊用途语言特性

    介绍三种函数相关的语言特性:默认实参、内联函数、constexpr函数。

    默认实参

    • 调用包含默认实参的函数时,可以包含该实参,也可以省略该实参。

    • 一旦某个形参被赋予了默认值,它后面所有的形参都必须有默认值。

    内联函数(inline)

    调用函数一般比求等价表达式的值要慢,内联函数可避免函数调用的开销。
    - 将函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。

    constexpr函数

    • 函数的返回类型和所有的形参类型都得是字面值类型。

    • 函数中必须有且只有一条return语句。

    • constexpr函数被隐式地指定为内联函数。

    内联函数和constexpr函数通常定义在头文件中

    调试帮助

    程序可以包含一些用于调试的代码,但这些代码只在开发程序时使用。当应用程序编写完成准备发布时,要先屏蔽掉调试代码。这种方法用到两项预处理功能:assert和NDEBUG。

    assert预处理宏

    #include assert(expr);//首先对expr求值,//如果表达式为假(即0),assert输出信息并终止程序的执行。//如果表达式为真(即非0),assert什么也不做。//例如:对一个文本进行操作的程序可能要求所给定单词的长度都大于某个阈值。assert(word.size() > threshold;

    NDEBUG预处理变量

    • assert的行为依赖于一个名为NDEBUG的预处理变量的状态。如果定义了NDEBUG,则assert什么也不做。默认状态下没有定义NDEBUG,此时assert将运行执行时检查。

      • 使用#define语句定义NDEBUG,从而关闭调试状态。

      • 很多编译器都提供了命令行选项使我们可以定义预处理变量。

        $ CC -D NDEBUG main.C   #微软编译器中用 /D

    • 这只是调试程序的辅助手段,不能代替真正的逻辑检查,也不能代替程序本应该包含的错误检查。

    • 除了assert以外,也能使用NDEBUG编写自己的条件调试代码:

    //如果定义了NDEBUG,#ifndef和#endif之间的代码将被忽略void print(const int ia[], aize_t size)
    {    #ifndef NDEBUG
            //_ _func_ _是编译器定义的一个局部静态变量,用于存放函数的名字,它是const char的一个静态数组。
            cerr << _ _func_ _ << "array size is " << size << endl;    #endif}

    除了_ _ func _ _之外,还有其它四个名字:

    _ _FILE_ _ 存放文件名的字符串字面值
    _ _LINE_ _ 存放当前行号的整型字面值
    _ _TIME_ _ 存放文件编译时间的字符串字面值
    _ _DATA_ _ 存放文件编译日期的字符串字面值

    函数指针

    bool lengthCompare(const string &, const string &);//pf指向一个函数,该函数的参数是两个const string的引用,返回值是bool类型。注意圆括号必不可少bool (*pf) (const string &, const string &);    //未初始化

    当我们把函数名作为值使用时,该函数自动地转换成指针

    pf = lengthCompare;     //pf指向名为lengthCompare的函数pf = &lengthCompare;    //等价赋值语句,&是可选的

    调用该函数:

    //此三个调用等价bool b1 = pf("hello", "goodbye");bool b2 = (*pf)("hello", "goodbye");bool b3 = lengthCompare("hello", "goodbye");

    参考:C++Primer第五版

    相关文章:

    第四章C++:表达式概念-运算符的应用

    第五章C++:语句的相关介绍

    相关文章

    c++速学教程(入门到精通)
    c++速学教程(入门到精通)

    c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    c++和c语言的区别有哪些
    c++和c语言的区别有哪些

    c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

    254

    2024.03.14

    c++和python学习顺序推荐
    c++和python学习顺序推荐

    一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

    408

    2024.03.14

    python和c++学习性价比分析
    python和c++学习性价比分析

    Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

    98

    2024.03.14

    c语言和c++一样吗
    c语言和c++一样吗

    c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    128

    2024.03.14

    c语言和c++先学哪个好
    c语言和c++先学哪个好

    初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    94

    2024.03.14

    c语言和c++的区别和联系
    c语言和c++的区别和联系

    c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    119

    2024.03.14

    c++软件中文更改教程
    c++软件中文更改教程

    对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

    295

    2024.03.21

    python和java和c++学习性价比分析
    python和java和c++学习性价比分析

    Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

    331

    2024.03.22

    php源码安装教程大全
    php源码安装教程大全

    本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

    7

    2025.12.31

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    C# 教程
    C# 教程

    共94课时 | 5.7万人学习

    C 教程
    C 教程

    共75课时 | 3.8万人学习

    C++教程
    C++教程

    共115课时 | 10.5万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号