高质量程序设计指南c++/c语言(17)--函数
? ? ? 對于靜態(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sina App Engine 介绍
- 下一篇: s3c2440移植MQTT