網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1.函數(shù)基礎(chǔ)
一個(gè)函數(shù)由以下四部分組成:
- 返回類(lèi)型
- 函數(shù)名
- 參數(shù)(0個(gè)或多個(gè))
- 函數(shù)體
其中,函數(shù)的參數(shù)叫做形參,函數(shù)執(zhí)行的操作的語(yǔ)句塊叫做函數(shù)體
2.值傳遞
像一個(gè)這樣swap函數(shù),調(diào)用的時(shí)候,會(huì)用實(shí)參初始化swap函數(shù)對(duì)應(yīng)的形參
void Swap(int a, int b)
{
int tmp = a;
a = b;
b = tmp;
}
在內(nèi)存中會(huì)拷貝一份實(shí)參的值,但是修改形參的值并不影響實(shí)參的值
測(cè)試用例
#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;
// 運(yùn)行結(jié)果
// n: 0
// i: 1024
return 0;
}
int n = 0;
int i = n; // i是n的值的副本
i = 42;
3.指針傳遞
指針的行為和其他非引用類(lèi)型一樣。當(dāng)執(zhí)行指針拷貝操作時(shí),拷貝的是指針的值。
拷貝之后,兩個(gè)指針是不同的指針。因?yàn)橹羔樖刮覀兛梢蚤g接地訪(fǎng)問(wèn)它所指的對(duì)象,所以通過(guò)指針可以修改它所指對(duì)象的值
void SwapPoniter(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
測(cè)試用例
#include <iostream>
void SwapPoniter(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp; // 修改了指針b指向的對(duì)象的值
b = 0; // 只改變了函數(shù)體中的內(nèi)存拷貝,實(shí)參并沒(méi)有被修改
}
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;
// 運(yùn)行結(jié)果
// 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現(xiàn)在指向了i;但是n與i的值都不變
傳遞指針,就是拷貝一個(gè)指針,它儲(chǔ)存的值是一樣的,解引用后是指向同一個(gè)對(duì)象,但是修改指針的值就是修改拷貝對(duì)象的值
在C語(yǔ)言中,大多數(shù)程序員都用得指針類(lèi)型的形參去訪(fǎng)問(wèn)函數(shù)的外部對(duì)象,在C++中,建議使用引用類(lèi)型的形參代替指針
4.引用傳遞
引用傳遞跟指針傳遞有點(diǎn)類(lèi)似,使用引用傳參,允許函數(shù)訪(fǎng)問(wèn),改變一個(gè)或多個(gè)實(shí)參的值
void SwapQuote(int &a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
測(cè)試用例
#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;
// 運(yùn)行結(jié)果
// n: 1024
// i: 0
return 0;
}
使用引用傳遞可以避免拷貝
拷貝大的類(lèi)類(lèi)型對(duì)象或者容器對(duì)象比較低效,甚至有的類(lèi)類(lèi)型(包括IO類(lèi)型在內(nèi))根本就不支持拷貝操作。當(dāng)某種類(lèi)型不支持拷貝操作時(shí),函數(shù)只能通過(guò)引用形參訪(fǎng)問(wèn)該類(lèi)型的對(duì)象。
舉個(gè)例子,我們準(zhǔn)備編寫(xiě)一個(gè)函數(shù)比較兩個(gè)string對(duì)象的長(zhǎng)度。因?yàn)閟tring對(duì)象可能會(huì)非常長(zhǎng),所以應(yīng)該盡量避免直接拷貝它們,這時(shí)使用引用形參是比較明智的選擇。又因?yàn)楸容^長(zhǎng)度無(wú)須改變string對(duì)象的內(nèi)容,所以把形參定義成對(duì)常量的引用
當(dāng)我們只是單純讀取實(shí)參,并不打算修改時(shí),盡量使用常量引用
#include <iostream>
void testprint(const int &a)
{
std::cout << "a: " << a << std::endl;
}
int main()
{
int num = 111;
testprint(num);
// 輸出結(jié)果 a: 111
return 0;
}
使用引用傳遞返回額外信息
一個(gè)函數(shù)只能返回一個(gè)值,然而有時(shí)函數(shù)需要同時(shí)返回多個(gè)值,引用形參為我們一次返回多個(gè)結(jié)果提供了有效的途徑
舉個(gè)例子, 在剛剛的swap函數(shù)增加返回最小值與最大值
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;
}
這樣我們只需要調(diào)用的時(shí)候傳入實(shí)參,即可修改實(shí)參的值
原文鏈接:https://www.cnblogs.com/NueXini/p/16820924.html
相關(guān)推薦
- 2024-07-18 MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- 2022-04-03 對(duì)已有的docker容器增加新的端口映射問(wèn)題(兩種方式)_docker
- 2022-06-01 Go中的gRPC入門(mén)教程詳解_Golang
- 2022-09-05 Redis的數(shù)據(jù)刪除策略
- 2022-10-19 Docker鏡像與容器的導(dǎo)入導(dǎo)出以及常用命令總結(jié)_docker
- 2022-03-30 C++?Qt?QColorDialog使用方法_C 語(yǔ)言
- 2022-11-09 ORACLE中常用的幾種正則表達(dá)式小結(jié)_oracle
- 2024-01-10 右鍵添加 idea 打開(kāi)功能
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支