日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

高质量程序设计指南c++/c语言(17)--函数

發(fā)布時(shí)間:2025/3/13 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高质量程序设计指南c++/c语言(17)--函数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? 對于靜態(tài)鏈接庫的函數(shù)庫或者類庫,如果你調(diào)用了其中的函數(shù),那么連接器會從相應(yīng)的庫中提取這些函數(shù)的實(shí)現(xiàn)代碼并把他們連接到你的程序中,如果你沒有調(diào)用庫中的某些函數(shù),則連接器是不會把他們的實(shí)現(xiàn)代碼連接進(jìn)來的,即使該庫包含了成千上萬個(gè)函數(shù)。如果你使用的是動態(tài)鏈接庫,則運(yùn)行時(shí)必須將所有dll都復(fù)制到運(yùn)行環(huán)境的相應(yīng)目錄下。

? ? ? 連接的本質(zhì)就是把一個(gè)名字的實(shí)現(xiàn)代碼綁定到對它的每一個(gè)引用語句上,如果你根本沒有引用這個(gè)名字,那么它的實(shí)現(xiàn)和誰去綁定呢?

? ? ? 同樣,如果程序中任何地方都沒有調(diào)用你自己編寫的某個(gè)函數(shù)的話,編譯器也不會為該函數(shù)生成可執(zhí)行代碼。明白了這個(gè)道理,你應(yīng)該可以消除一些不必要的擔(dān)心了。例如,我們在開發(fā)一些通用類的時(shí)候,應(yīng)該設(shè)計(jì)并實(shí)現(xiàn)完整的功能,而不需要去擔(dān)心它的使用者會因?yàn)閮H使用其中一小部分功能卻要包含整個(gè)類定義而導(dǎo)致代碼體積增大。

1、 函數(shù)的最完整原型如下:

? ? ? [作用域] [函數(shù)的連接規(guī)范] 返回值類型 [函數(shù)的調(diào)用規(guī)范] 函數(shù)名 (參數(shù)列表);

2、不要把返回指針的函數(shù)用作左值

double *fun(double *p) {return p; }double d=100.0; *fun(&d) = 200.0;

雖然編譯器可以接受,但是最后這個(gè)語句非常難以理解,應(yīng)該避免類似的寫法。

3、return語句不可返回指向堆棧內(nèi)存的指針或者引用

char *fun(void) //error {char str[] = "hello world";cout << sizeof(str) << endl; //12cout << strlen(str) << endl; //11return str; }const char *fun(void) //ok {const char *p = "hello world"; //字符串常量存儲于靜態(tài)數(shù)據(jù)區(qū)cout << sizeof(str) << endl; //4cout << strlen(str) << endl; //11return str; }

4、如果函數(shù)返回值是一個(gè)對象,要考慮return 語句的效率

例如:

class String { public:String(){cout << "String()" << endl;}String(const String &string){cout << "String(const String &string)" << endl;}String & operator=(const String &string){cout << "String & operator=(const String &string)" << endl;return *this;}~String(){cout << "~String()" << endl;} };

版本一:

String test(const String &s) {String result(s); //String(const String &string)return result; //返回的時(shí)候用result初始化main作用域內(nèi)的一個(gè)臨時(shí)對象,調(diào)用String(const String &string),并發(fā)生resut的析構(gòu),調(diào)用~String() }int main(void) {String s1; //String()String s2; //String()s2 = test(s1); //將臨時(shí)對象(不是test函數(shù)內(nèi)的result)賦值給s2,調(diào)用String & operator=(const String &string),這條語句執(zhí)行完畢后,臨時(shí)對象的聲明周期結(jié)束,故調(diào)用~String()return 0; } //main函數(shù)結(jié)束時(shí),發(fā)生s1和s2的析構(gòu)

版本二:

String test(const String &s) {return String(s); }int main(void) {String s1;String s2;s2 = test(s1);return 0; }

輸出如下:

String()
String()
String(const String &string)
String & operator=(const String &string)
~String()
~String()
~String()
Press any key to continue

? ? ? test函數(shù)內(nèi)的return String(s);表示創(chuàng)建一個(gè)臨時(shí)對象并返回它。編譯器直接把臨時(shí)對象創(chuàng)建并初始化在外部存儲單元中,省去了拷貝和析構(gòu)的開銷,并提高了效率。

?

? ? ??

轉(zhuǎn)載于:https://www.cnblogs.com/zzj3/archive/2013/04/28/3049124.html

總結(jié)

以上是生活随笔為你收集整理的高质量程序设计指南c++/c语言(17)--函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。