高质量程序设计指南c++/c语言(17)--函数
? ? ? 對于靜態鏈接庫的函數庫或者類庫,如果你調用了其中的函數,那么連接器會從相應的庫中提取這些函數的實現代碼并把他們連接到你的程序中,如果你沒有調用庫中的某些函數,則連接器是不會把他們的實現代碼連接進來的,即使該庫包含了成千上萬個函數。如果你使用的是動態鏈接庫,則運行時必須將所有dll都復制到運行環境的相應目錄下。
? ? ? 連接的本質就是把一個名字的實現代碼綁定到對它的每一個引用語句上,如果你根本沒有引用這個名字,那么它的實現和誰去綁定呢?
? ? ? 同樣,如果程序中任何地方都沒有調用你自己編寫的某個函數的話,編譯器也不會為該函數生成可執行代碼。明白了這個道理,你應該可以消除一些不必要的擔心了。例如,我們在開發一些通用類的時候,應該設計并實現完整的功能,而不需要去擔心它的使用者會因為僅使用其中一小部分功能卻要包含整個類定義而導致代碼體積增大。
1、 函數的最完整原型如下:
? ? ? [作用域] [函數的連接規范] 返回值類型 [函數的調用規范] 函數名 (參數列表);
2、不要把返回指針的函數用作左值
double *fun(double *p) {return p; }double d=100.0; *fun(&d) = 200.0;雖然編譯器可以接受,但是最后這個語句非常難以理解,應該避免類似的寫法。
3、return語句不可返回指向堆棧內存的指針或者引用
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"; //字符串常量存儲于靜態數據區cout << sizeof(str) << endl; //4cout << strlen(str) << endl; //11return str; }4、如果函數返回值是一個對象,要考慮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; //返回的時候用result初始化main作用域內的一個臨時對象,調用String(const String &string),并發生resut的析構,調用~String() }int main(void) {String s1; //String()String s2; //String()s2 = test(s1); //將臨時對象(不是test函數內的result)賦值給s2,調用String & operator=(const String &string),這條語句執行完畢后,臨時對象的聲明周期結束,故調用~String()return 0; } //main函數結束時,發生s1和s2的析構版本二:
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函數內的return String(s);表示創建一個臨時對象并返回它。編譯器直接把臨時對象創建并初始化在外部存儲單元中,省去了拷貝和析構的開銷,并提高了效率。
?
? ? ??
轉載于:https://www.cnblogs.com/zzj3/archive/2013/04/28/3049124.html
總結
以上是生活随笔為你收集整理的高质量程序设计指南c++/c语言(17)--函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sina App Engine 介绍
- 下一篇: 多项式相乘快速算法原理及相应C代码实现