第 7 節

函數與頭文件

0瀏覽次數0訪問次數--跳出率--平均停留

函數

概述

**作用:**將一段經常使用的代碼封裝起來,減少重複代碼

一個較大的程序,一般分爲若干個程序塊,每個模塊實現特定的功能。

函數的定義

函數的定義一般主要有5個步驟:

1、返回值類型

2、函數名

3、參數表列

4、函數體語句

5、return 表達式

語法:

返回值类型 函数名 (参数列表)
{

       函数体语句

       return表达式

}

運行/觀察結果: 這段是語法或接口示例,重點觀察寫法;放入完整程序後再運行驗證。

  • 返回值類型 :一個函數可以返回一個值。在函數定義中
  • 函數名:給函數起個名稱
  • 參數列表:使用該函數時,傳入的數據
  • 函數體語句:花括號內的代碼,函數內需要執行的語句
  • return表達式: 和返回值類型掛鉤,函數執行完後,返回相應的數據

**示例:**定義一個加法函數,實現兩個數相加

//函数定义
int add(int num1, int num2)
{
    int sum = num1 + num2;
    return sum;
}

運行/觀察結果: 這段是語法或接口示例,重點觀察寫法;放入完整程序後再運行驗證。

函數的調用

**功能:**使用定義好的函數

語法: 函数名(参数)

示例:

//函数定义
int add(int num1, int num2) //定义中的num1,num2称为形式参数,简称形参
{
    int sum = num1 + num2;
    return sum;
}

int main() {

    int a = 10;
    int b = 10;
    //调用add函数
    int sum = add(a, b);//调用时的a,b称为实际参数,简称实参
    cout << "sum = " << sum << endl;

    a = 100;
    b = 100;

    sum = add(a, b);
    cout << "sum = " << sum << endl;


    return 0;
}

運行/觀察結果: 運行後會按輸出語句打印對應內容,變量值可結合初始化、賦值和函數調用順序推導。

總結:函數定義裏小括號內稱爲形參,函數調用時傳入的參數稱爲實參

值傳遞

  • 所謂值傳遞,就是函數調用時實參將數值傳入給形參
  • 值傳遞時,==如果形參發生,並不會影響實參==

示例:

void swap(int num1, int num2)
{
    cout << "交换前:" << endl;
    cout << "num1 = " << num1 << endl;
    cout << "num2 = " << num2 << endl;

    int temp = num1;
    num1 = num2;
    num2 = temp;

    cout << "交换后:" << endl;
    cout << "num1 = " << num1 << endl;
    cout << "num2 = " << num2 << endl;

    //return ; 当函数声明时候,不需要返回值,可以不写return
}

int main() {

    int a = 10;
    int b = 20;

    swap(a, b);

    cout << "mian中的 a = " << a << endl;
    cout << "mian中的 b = " << b << endl;


    return 0;
}

運行/觀察結果: 運行後會按輸出語句打印對應內容,變量值可結合初始化、賦值和函數調用順序推導。

總結: 值傳遞時,形參是修飾不了實參的

函數的常見樣式

常見的函數樣式有4種

  1. 無參無返
  2. 有參無返
  3. 無參有返
  4. 有參有返

示例:

//函数常见样式
//1、 无参无返
void test01()
{
    //void a = 10; //无类型不可以创建变量,原因无法分配内存
    cout << "this is test01" << endl;
    //test01(); 函数调用
}

//2、 有参无返
void test02(int a)
{
    cout << "this is test02" << endl;
    cout << "a = " << a << endl;
}

//3、无参有返
int test03()
{
    cout << "this is test03 " << endl;
    return 10;
}

//4、有参有返
int test04(int a, int b)
{
    cout << "this is test04 " << endl;
    int sum = a + b;
    return sum;
}

運行/觀察結果: 運行後會打印示例中的變量值或地址;地址值與運行環境有關,以同類對象的相對位置和指針變化爲觀察重點。

函數的聲明

作用: 告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義。

  • 函數的聲明可以多次,但是函數的定義只能有一次

示例:

//声明可以多次,定义只能一次
//声明
int max(int a, int b);
int max(int a, int b);
//定义
int max(int a, int b)
{
    return a > b ? a : b;
}

int main() {

    int a = 100;
    int b = 200;

    cout << max(a, b) << endl;


    return 0;
}

運行/觀察結果: 運行後會按輸出語句打印對應內容,變量值可結合初始化、賦值和函數調用順序推導。

函數的分文件編寫

**作用:**讓代碼結構更加清晰

函數分文件編寫一般有4個步驟

  1. 創建後綴名爲.h的頭文件
  2. 創建後綴名爲.cpp的源文件
  3. 在頭文件中寫函數的聲明
  4. 在源文件中寫函數的定義

示例:

//swap.h文件
#include<iostream>
using namespace std;

//实现两个数字交换的函数声明
void swap(int a, int b);

運行/觀察結果: 這段偏語法定義,通常需要配合調用代碼一起編譯,重點看定義方式和使用位置。

//swap.cpp文件
#include "swap.h"

void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;

    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}

運行/觀察結果: 運行後會按輸出語句打印對應內容,變量值可結合初始化、賦值和函數調用順序推導。

//main函数文件
#include "swap.h"
int main() {

    int a = 100;
    int b = 200;
    swap(a, b);


    return 0;
}

運行/觀察結果: 這段是語法或接口示例,重點觀察寫法;放入完整程序後再運行驗證。

頭文件的組織方式

頭文件的作用:頭文件含有某個庫的外部聲明函數和變量,方便我們調用庫中的API。

注意事項:

  1. 常見的頭文件stdio.h stdlib.h iostream string等
  2. 頭文件的擴展名:.h或者.hpp,其實沒必要寫擴展名,但是建議還是寫。
  3. 預處理:#include <> 和 #include " "
  4. 條件編譯
  5. extern "C" { } 用來實現C語言和C++的混合編譯,表明它按照類C的編譯和連接規約來編譯和連接,而不是C++的編譯的連接規約。
#ifndef __FILE_NAME_H_    //头文件防止引用重复的条件编译
#define __FILE_NAME_H_   //头文件防止引用重复的条件编译

#ifdef __cplusplus    //混合编译的条件编译
extern "C"           //混合编译的条件编译
{                   //混合编译的条件编译
#endif             //混合编译的条件编译
/*  头文件内容开始   */

//头文件内容:预处理、函数声明、变量声明

/*   头文件内容结束  */
#ifdef __cplusplus     //混合编译的条件编译
}                      //混合编译的条件编译
#endif                 //混合编译的条件编译

#endif   //头文件防止引用重复的条件编译

運行/觀察結果: 這段是語法或接口示例,重點觀察寫法;放入完整程序後再運行驗證。

音乐页