C++学习笔记(二)——交换函数(swap)
這次我們要透過一個(gè)簡(jiǎn)單的函數(shù)swap深入理解函數(shù)傳參的本質(zhì)以及在C++中如何選擇傳參方式。
先來看第一段程序:
void swap(int x, int y) {int temp = y;y = x;x = temp; }通過main函數(shù)的調(diào)用,我們發(fā)現(xiàn)x,y并未實(shí)現(xiàn)交換:
int main() {int x = 1;int y = 37;swap(x, y);cout << x << ":" << y << endl;return 0; }原因是整形x和y在函數(shù)swap內(nèi)為按值傳遞,按值傳遞時(shí),函數(shù)不會(huì)訪問當(dāng)前調(diào)用的實(shí)參。函數(shù)處理的值是它本地的拷貝,這些拷貝被存儲(chǔ)在運(yùn)行棧中,因此改變這些值不會(huì)影響實(shí)參的值。一旦函數(shù)結(jié)束了,函數(shù)的活動(dòng)記錄將從棧中彈出,這些局部值也就消失了。
在按值傳遞的情況下,實(shí)參的內(nèi)容沒有被改變。這意味著程序員在函數(shù)調(diào)用時(shí)無需保存和恢復(fù)實(shí)參的值。如果沒有按值傳遞機(jī)制,那么每個(gè)沒有被聲明為const 的參數(shù)就可能會(huì)隨每次函數(shù)調(diào)用而被改變。按值傳遞的危害最小,需要用戶做的工作也最少。毫無疑問,按值傳遞是參數(shù)傳遞合理的缺省機(jī)制。
另外,如果作為實(shí)參的變量是一個(gè)大型類的對(duì)象,分配并拷貝到棧中的時(shí)間和空間開銷往往過大。
要實(shí)現(xiàn)swap函數(shù)的效果,我們應(yīng)如何處理呢?第一個(gè)可行的做法是將形參聲明成指針:
void pswap(int *x, int *y) {int temp = *y;*y = *x;*x = temp; }?
在pswap函數(shù)中,由于傳遞的是兩個(gè)變量的內(nèi)存地址(指針)使得我們可以直接操作對(duì)應(yīng)的值。實(shí)際上這里還是存在按值傳遞的問題,只是由原先的整形傳遞變成了指針傳遞。我們可以修改指針指向的內(nèi)存卻依然無法修改指針本身。第二個(gè)可行的做法是想形參聲明為指針的引用:
void prswap(int *&x, int *&y) {int temp = *y;*y = *x;*x = temp; }void prswap(int *&x, int *&y) {int *temp = y;y = x;x = temp; }?
請(qǐng)注意,同一個(gè)函數(shù)原型下我提供了兩種函數(shù)定義??蔁o論哪一種,在實(shí)參傳遞的階段都不會(huì)發(fā)生按值傳遞的問題。那么兩種定義到底哪一種更滿足我們需求:
(1)交換內(nèi)存中的值
(2)交換指針地址
如果單獨(dú)考慮本文的需求,第一種方法更滿足。但是,如果我們需要交換的是一個(gè)大型類對(duì)象,第二種的效率則更高。
總結(jié):內(nèi)存管理是C++學(xué)習(xí)的一個(gè)難點(diǎn),初學(xué)者往往不容易掌握。但越是如此就越能體現(xiàn)一個(gè)開發(fā)者的語言內(nèi)功。
轉(zhuǎn)載于:https://www.cnblogs.com/learnhow/p/8543822.html
總結(jié)
以上是生活随笔為你收集整理的C++学习笔记(二)——交换函数(swap)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汪文君高并发编程总结-第一阶段
- 下一篇: 游戏运行库java下载官网_游戏运行库合