函數與頭文件
函數
概述
**作用:**將一段經常使用的代碼封裝起來,減少重複代碼
一個較大的程序,一般分爲若干個程序塊,每個模塊實現特定的功能。
函數的定義
函數的定義一般主要有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、 无参无返
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個步驟
- 創建後綴名爲.h的頭文件
- 創建後綴名爲.cpp的源文件
- 在頭文件中寫函數的聲明
- 在源文件中寫函數的定義
示例:
//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。
注意事項:
- 常見的頭文件stdio.h stdlib.h iostream string等
- 頭文件的擴展名:.h或者.hpp,其實沒必要寫擴展名,但是建議還是寫。
- 預處理:#include <> 和 #include " "
- 條件編譯
- extern "C" { } 用來實現C語言和C++的混合編譯,表明它按照類C的編譯和連接規約來編譯和連接,而不是C++的編譯的連接規約。
#ifndef __FILE_NAME_H_ //头文件防止引用重复的条件编译
#define __FILE_NAME_H_ //头文件防止引用重复的条件编译
#ifdef __cplusplus //混合编译的条件编译
extern "C" //混合编译的条件编译
{ //混合编译的条件编译
#endif //混合编译的条件编译
/* 头文件内容开始 */
//头文件内容:预处理、函数声明、变量声明
/* 头文件内容结束 */
#ifdef __cplusplus //混合编译的条件编译
} //混合编译的条件编译
#endif //混合编译的条件编译
#endif //头文件防止引用重复的条件编译
運行/觀察結果: 這段是語法或接口示例,重點觀察寫法;放入完整程序後再運行驗證。