美文网首页
《C++ Primer Plus》第7章学习笔记

《C++ Primer Plus》第7章学习笔记

作者: 蓬篙人 | 来源:发表于2021-06-08 21:49 被阅读0次

内容思维导图

第7章 函数

1. 复习函数的基本知识

  • 使用函数需完成的工作:
    • 提供函数定义。
    • 提供函数原型。
    • 调用函数。
// 函数使用示例
#include <iostream>

void simple();    // 函数原型

int main()
{
    using namespace std;
    cout << "main() will call the simple() function: \n";
    simple();     // 函数调用

    return 0;
}
// 函数定义
void simple()
{
    using namespace std;
    cout << "I'm but a simple function.\n";
}
  • 可将函数分为两类:没有返回值或有返回值
// void函数
void functionName(parameterList)
{
    statements
    return;        // 可选
}
// 有返回值函数
typeName functionName(parameterList)
{
    statements
    return value;    // 值将转换为类型typeName
}
  • C++函数返回值不能是数组。通常,函数通过将返回值复制到指定的CPU寄存器或内存单元中来将其返回。
  • 原型描述了函数到编译器的接口。
  • 在C++中,不指定函数列表时应使用省略号:
void say(...);
  • C++函数原型的功能:
      1. 编译器正确处理函数返回值。
      1. 编译器检查使用的参数数目是否正确。
      1. 编译器检查使用的参数类型是否正确。
  • 在编译阶段进行的原型化被称为静态类型检查(static type checking)
  • 用于接收传递值的变量被称为形参,传递给函数的值被称为实参

2. 函数和数组

  • 数组作为函数参数,实际传递的是指针(即第一个元素的地址),这意味着函数中使用的是原来的数组(没有拷贝数组的数据)。
  • const用于指针
      1. 让指针指向一个常量对象,防止使用该指针来修改所指向的值。
      1. 将指针本身声明为常量。
// 声明指向常量的指针
int age = 39;
const int* pt = &age;
*pt += 1;              // 错误!!!
int age2 = 80;
pt = &age2;           // 可以
// 声明指针常量
int sloth = 3;
int* const finger = &sloth;
// 指向const对象的const指针
double trouble = 2.0E30;
const double* const stick = &trouble;
  • C++禁止将const地址赋给非const指针。
  • 仅当只有一层间接关系(如指针指向基本数据类型)时,才可以将非const地址或指针赋给const指针。
const int** pp2;
int* p1;
pp2 = &p1;    // 不允许
  • 通常将指针作为函数参数来传递时,可以使用指向const的指针来保护数据。

3. 函数和二维数组

  • 二维数组作为参数
int data[3][4] = { { 1, 2, 3, 4 }, { 9, 8, 7, 6 }, { 2, 4, 6, 8 } };
int total = sum(data, 3);
// 上述函数sum()的原型如下:
int sum(int (*ar2)[4], int size);
// 或
int sum(int ar2[][4], int size);
  • 上述代码中的函数sum()在声明参数ar2时,没有使用const,因为这种技术只能用于指向基本类型的指针,而ar2是指向指针的指针。

4. 函数和C-风格字符串

  • 字符串作为函数参数的3种表示方式:
      1. char数组。
      1. 用引号括起来的字符串常量。
      1. 被设置为字符串的地址的char指针。
  • 将字符串作为参数来传递,实际传递的是字符串第一个字符的地址。

5. 递归

  • void类型的递归函数代码格式如下:
void recurs(argumentlist)
{
    statements1
    if(test)
        recurs(arguments)
    statements2
}
  • 递归方法有时被称为分而治的策略(divide-andconquer strategy)
// 分而治策略示例
void subdivide(char ar[], int low, int hight, int level)
{
    if(level == 0)
        return;
    int mid = (high + low) / 2;
    ar[mid] = '|';
    subdivide(ar, low, mid, level - 1);
    subdivide(ar, mid, high, level - 1);
}

6. 函数指针

  • 函数的地址是存储其机器语言代码的内存的开始地址。
  • 获取函数的地址:使用函数名即可。
  • 通常,要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*pf)替换函数名,这样pf就是这类函数的指针。
double pam(int);     // 函数原型
double (*pf)(int);   // pf为带一个int参数返回值类型为double的函数的指针
  • C++允许像使用函数名那样使用pf
double pam(int);    
double (*pf)(int);   
pf = pam;
double y1 = (*pf)(5);   // 使用指针调用pam()函数
double y2 = pf(5);      // 与上行代码等效

相关文章

  • c primer plus 和 c++ primer plus

    c++ primer plus 第6版:下载链接 备用链接1 备用链接2 c primer plus 第6版:下载...

  • [163]1.1关于c++类声明的记录【GeekBand】

    //C++微专业 第一周笔记 //以下点多来自 《C++ Primer Plus 》第6版 1. C++程序组成 ...

  • C++循环与决策

    Tags:C++,《C++ Primer Plus》笔记 一、循环## 语法### C++中有三种循环语句,语法与...

  • c++学习笔记——第一天

    一、c++综述 (1)书籍推荐 ①、c++ primer ②、c++ primer plus ③、c++编程思想 ...

  • C++I/O小结

    Tags:C++,《C++ Primer Plus》笔记 一、iostream## 头文件 用于对控制台进行输...

  • C++算术类型

    Tags:C++,《C++ Primer Plus》笔记 一、分类## 见下图,注意以下几点: char16_t,...

  • C++ Primer Plus第6版18个重点笔记

    下面是我看《C++ Primer Plus》第6版这本书后所做的笔记,作为备忘录便于以后复习。 笔记部分### C...

  • C++复合类型

    Tags:C++,《C++ Primer Plus》笔记 一、分类## 如下图,大概分为这些类型,每种类型的声明语...

  • C++模板库笔记

    C++标准模板库笔记(C++ Primer plus) 1.除序列外,vector还是可反转容器(reversib...

  • C++函数初识

    Tags:C++,《C++ Primer Plus》笔记 一、原型、定义与调用## 一个完整的函数包含原型、定义和...

网友评论

      本文标题:《C++ Primer Plus》第7章学习笔记

      本文链接:https://www.haomeiwen.com/subject/epajeltx.html