網站首頁 編程語言 正文
1.函數基礎
一個函數由以下四部分組成:
- 返回類型
- 函數名
- 參數(0個或多個)
- 函數體
其中,函數的參數叫做形參,函數執行的操作的語句塊叫做函數體
2.值傳遞
像一個這樣swap函數,調用的時候,會用實參初始化swap函數對應的形參
void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
在內存中會拷貝一份實參的值,但是修改形參的值并不影響實參的值
測試用例
#include <iostream>
void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int n = 0;
int i = 1024;
Swap(n, i);
std::cout << "n: " << n << "\ni: " << i << std::endl;
// 運行結果
// n: 0
// i: 1024
return 0;
}
int n = 0;
int i = n; // i是n的值的副本
i = 42;
3.指針傳遞
指針的行為和其他非引用類型一樣。當執行指針拷貝操作時,拷貝的是指針的值。
拷貝之后,兩個指針是不同的指針。因為指針使我們可以間接地訪問它所指的對象,所以通過指針可以修改它所指對象的值
void SwapPoniter(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
測試用例
#include <iostream>
void SwapPoniter(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp; // 修改了指針b指向的對象的值
b = 0; // 只改變了函數體中的內存拷貝,實參并沒有被修改
}
int main()
{
int n = 0;
int i = 1024;
int *j = &n;
int *k = &i;
SwapPoniter(j, k);
std::cout << "j: " << *j << "\nk: " << *k << std::endl;
// 運行結果
// j: 1024
// k: 0
return 0;
}
int n = 0, i = 1024;
int *p = &n, *q = &i; // p指向n;q指向i
*p = 1024; // n的值被修改;p不變
p = q; // p現在指向了i;但是n與i的值都不變
傳遞指針,就是拷貝一個指針,它儲存的值是一樣的,解引用后是指向同一個對象,但是修改指針的值就是修改拷貝對象的值
在C語言中,大多數程序員都用得指針類型的形參去訪問函數的外部對象,在C++中,建議使用引用類型的形參代替指針
4.引用傳遞
引用傳遞跟指針傳遞有點類似,使用引用傳參,允許函數訪問,改變一個或多個實參的值
void SwapQuote(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
測試用例
#include <iostream>
void SwapQuote(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int n = 0;
int i = 1024;
SwapQuote(n, i);
std::cout << "n: " << n << "\ni: " << i << std::endl;
// 運行結果
// n: 1024
// i: 0
return 0;
}
使用引用傳遞可以避免拷貝
拷貝大的類類型對象或者容器對象比較低效,甚至有的類類型(包括IO類型在內)根本就不支持拷貝操作。當某種類型不支持拷貝操作時,函數只能通過引用形參訪問該類型的對象。
舉個例子,我們準備編寫一個函數比較兩個string對象的長度。因為string對象可能會非常長,所以應該盡量避免直接拷貝它們,這時使用引用形參是比較明智的選擇。又因為比較長度無須改變string對象的內容,所以把形參定義成對常量的引用
當我們只是單純讀取實參,并不打算修改時,盡量使用常量引用
#include <iostream>
void testprint(const int &a)
{
std::cout << "a: " << a << std::endl;
}
int main()
{
int num = 111;
testprint(num);
// 輸出結果 a: 111
return 0;
}
使用引用傳遞返回額外信息
一個函數只能返回一個值,然而有時函數需要同時返回多個值,引用形參為我們一次返回多個結果提供了有效的途徑
舉個例子, 在剛剛的swap函數增加返回最小值與最大值
void SwapQuote(int &a, int &b, int &mix, int &max)
{
int tmp = a;
a = b;
b = tmp;
a < b ? mix = a, max = b : max = a, mix = b;
}
這樣我們只需要調用的時候傳入實參,即可修改實參的值
原文鏈接:https://www.cnblogs.com/NueXini/p/16820924.html
相關推薦
- 2023-02-04 Qt信號與槽知識點總結歸納_C 語言
- 2022-11-04 Android實現簡易秒表功能_Android
- 2022-09-22 Apriori算法的實現
- 2022-05-18 ASP.NET?MVC授權過濾器用法_實用技巧
- 2022-10-02 Python實現遍歷讀取文件或文件夾_python
- 2022-02-17 奇怪的小知識 - 如何清空一個數組?在不改變地址的情況下呢?
- 2023-01-20 C#實現自定義動畫鼠標的示例詳解_C#教程
- 2022-12-19 Tensorflow加載與預處理數據詳解實現方法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支