成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

經驗分享 從C到C++(二)

開發 后端
本文介紹的是從C到C++我們應該學習哪些內容,讓你輕輕松松完成從C到C++的轉變。希望對你有幫助,一起來看。

C++技術固然是很時髦的,許多C用戶都想在盡可能短的時間內為自己貼上C++的標簽。介紹C++的書很多,但只有那些已經僥幸入門的用戶才偶爾去翻翻,仍有不少在C++門口徘徊的流浪漢。

本文只針對C用戶,***是一位很不錯的老用戶(譬如他在遇到最簡單的問題時都嘗試著使用指針),通過一些C和更好的C++(本文用的是Borland C++3.1版本)例程介紹有關C++的一些知識,讓讀者朋友們“淺入深出”,輕輕松松C to C++!

二、挑戰#define

#define是C提供的一條很有用的指令,但在C++中,很有可能杜絕宏指令的使用。

1 .const宏指令允許用戶指定某一標識符的值作為一個常量,

如:#define PI 3. 1415926

它也可以用來定義字符串:#define HZK16 "HZK16F"以下使用可以通過:

 

  1. cout << "PI is“<<PI;  
  2. cout << "Filename: "<< HZK16;  

 

但宏畢竟不是一個合法的對象,雖然它偽裝得很***。C++為用戶提供了常量修飾符const,可以指定某個對象的值為常量。它阻止用戶對其進行賦值或其它副作用,

類似于上例:

  1. const float PI=3.1415926;  
  2. char*const HZK16="HZK16F";  
  3. PI = 3. 14; //error  
  4. HZK16="HZK16K"//error: Cannot modify a const object  

但對于指針的處理似乎有些復雜,例如以下使用卻又合法:

  1. HZK16[5]=’r’; //ok HZK16 ="HZK16K" 

 

清楚地了解const修飾的范圍很有必要,如下是聲明形式與相應含義:

  1. char*const cpl="I love you!“; //const修飾’*’,cp1是一個指向字符的指針常量  
  2. const char*cp2="I hate you!“; //const修飾’char' cp2是一個指向字符常量的指針  
  3. const char*const cp3="Get the hell out of here!“; // const分別修飾’char’和’*’, 

 

cp3是一個指向字符常量的指針常量,因此,以下使用仍合法:

  1. strcpy(cpl "Oh no...“);  
  2. cp2++; 

 

因為cpl只管盯住某一處的地址不放,而阻止其中的內容不被改寫則不是它的責任,cp2則恰恰相反,它不允許你修改其中的內容,卻可以被你指來指去(這個下場可能更慘)。只有使用兩個修飾符(如cp3)才可能是最保險的辦法。

指向const的指針不能被賦給指向非const的指針:

  1. float*p=&PI;  
  2. //error: Cannot convert 'const float*’ to 'float*’  
  3. *p=3.14; 

 

這條限制保證了常量的正當含義。但注意由顯式轉換所引起的常量間接修改是可能的:

  1. //test08.cpp  
  2. #include <iostream.h>  
  3. void main()  
  4. {  
  5. char * Spy;  
  6. const char * const String = "Yahoo!";  
  7. Spy = (char*)String;  
  8. Spy[5] = '?';  
  9. cout << String;  
  10. }  
  11. 輸出結果:Yahoo! 

 

2.內聯函數(in line function)

宏在某些場合能得到類似于函數的功能,如下是一個常見的例子:#define ADD (a b) ((a)+(b))

cout<<“1+2=”<它將實現數據求和功能而輸出:但我們至少有一打理由拒絕使用它,以下是最明顯的:

①宏缺少類型安全檢測,如:

  1. ADD ('A' 0. 0l); 

 

這樣的調用將被解釋為合法,而事實上,很少的用戶期望能寫出這樣的語句;

②宏不會為參數引入臨時拷貝,如:

 

  1. #define DOUBLE (x)((x)+(x))  
  2. int i(1);  
  3. cout<<DOUBLE(i++); //prints '3'  

 

③宏不具有地址,例如可能在一個計算器程序中有:

  1. case ' +': Operator = & ADD; 

 

并不能得到合理解釋。

采取函數?然而,使用函數并不是最劃算的支出,它浪費了寶貴的執行時間。使用過匯編語言的讀者可能知道,一般函數執行真正的函數體前后,要做一些現場保護工作,當函數體積很小時,這種冗余的工作量將會遠遠大于函數本身。

為此,C++提供了關鍵字inline,當用戶希望編譯器將某函數的代碼直接插入到調用點時,可將其設置成inline函數,即在函數定義時加上關鍵字inline,如:

 

  1. //test09.cpp  
  2. #include <iostream.h>  
  3. inline int Add (int a int b)  
  4. {  
  5. return a + b;  
  6. }  
  7. void main O)  
  8. {  
  9. cout<<"1+2=“<<Add(1 2);  
  10. }  

主函數將被編譯器解釋為:

  1. count<<"1+2=“<<{1+2 }; 

 

其行為完全類似于前例的ADD (a b)宏。經驗表明,將使用頻繁而且體積很小的函數聲明為inline是明智的。

3.函數重載(overload)

在實際數據求和操作時,如上節內容中提供的Add()函數是遠遠不夠的,你不得不再添加一些其它代碼,如:

 

  1. double AddDouble(double a double b)  
  2. {  
  3. return a + b;  
  4. }  
  5. float AddFloat (float a float b )  
  6. {  
  7. return a + b;  
  8. }  

 

特別地,在C++中你可以玩弄名字的技巧,將以上的AddDouble AddFloat皆取名為Add,如:

  1. double Add(double a double b)  
  2. {  
  3. return a + b;  

盡管放心,編譯器會安全地為不同的調用形式找到相應的函數原型。如:

  1. double a b;  
  2. Add(f 2); //int Add(int int)  
  3. Add (a b); //double Add (doubledouble)  

 

這樣,不同的函數擁有相同的函數名,即函數重載。函數重載以及后面的模板、虛函數機制形成了“一個接口,多種功能”的特性,即多態性(polymorphism),它是面向對象(OO)的技術之一。

在使用重載機制時,C++提出了許多防止二義性的限制,如:

 

  1. void fun(int a);  
  2. int fun(int a);  
  3. void fun(int& a);  
  4. void fun (int a int b=0);  

 

很可能引起C ++編譯器的恐慌,它在遇到諸如fun(100)的調用時會十分不滿。用戶有義務保證任一調用形式不產生二義性。以下是一種常見的使用重載機制的例程:

  1. //test10.cpp  
  2. #include <graphics.h>  
  3. #include <iostream.h>  
  4. void Pixel(int x int y int color)  
  5. {  
  6. putpixel(x y color);  
  7. }  
  8. int Pixel(int x int y)  
  9. {  
  10. return getpixel(x y);  
  11. }  
  12. void main()  
  13. {  
  14. int Driver=VGA Mode=VGAHI;  
  15. initgraph(&Driver &Mode "");  
  16. Pixel(100 100 4);  
  17. int Color = Pixel(100 100);  
  18. closegraph();  
  19. cout << "Color of point(100 100):" << Color;  
  20. }  

可以想象C++將以上不同的Pixel()函數分別編碼為Pixel_iii和Pixel_ii,它的形式包含了各入口參數的數據類型。注意,編碼未包含返回值的信息,因而依賴于返回值類型的差異的函數重載是不穩定的。因此,連接器(linker)可以毫不費力地找到相應的模塊。但這對于新舊C版本產生的模塊連接恐怕添加了麻煩,因為傳統的C函數庫中并沒有對函數名再作手腳的壞習慣,C++不得不提供關鍵字extern來保證這種連接的安全性,如下形式(注意‘C’可要大寫):

  1. extern "C" 
  2. {  
  3. void Pixel(int x int y int Color);  
  4. };  

將告訴編譯器只需要在函數庫中找相應的Pixel模塊,而不必自作聰明。而

  1. extern "C" 
  2. //' #include’一定要另起一行  
  3. #include "function. h"  
  4. };  

則聲明包含在頭文件function. h中所有函數模塊皆采取C連接。

希望通過本文的介紹,能給你帶來幫助。請繼續看下一篇>>

【編輯推薦】

  1. C++新手之詳細介紹MFC
  2. 舉例介紹VC++中的ODBC編程
  3. 詳細介紹C/C++時間函數使用方法
  4. C++基礎學習之引用和指針
  5. 經驗分享 C++編程技巧
責任編輯:于鐵 來源: 互聯網
相關推薦

2011-07-13 17:08:02

CC++

2011-07-13 17:42:32

CC++

2011-07-13 16:36:11

C++

2010-02-04 15:19:38

C++獲取CPU信息

2015-06-25 11:21:33

C++Objective-C

2021-12-06 23:00:36

CC++編程語言

2011-06-15 15:29:25

Qt C++

2009-08-27 16:03:31

從c#到c++

2009-08-20 15:54:48

從C#到C++

2011-05-18 18:05:47

C#C++

2010-02-05 18:09:28

C++ Doxygen

2010-02-01 11:13:00

C++ Traits

2024-01-22 11:33:17

C++編程語言開發

2010-01-21 16:08:26

C++語言

2025-03-25 09:00:00

2024-11-11 09:39:11

Cloudflare遷移Go

2009-09-04 17:34:11

C#CC++

2011-07-12 13:41:15

C++

2010-01-28 16:58:32

學習C++感想

2011-07-20 10:30:29

C語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美成人在线影院 | 久久精品二区亚洲w码 | 久久草在线视频 | 日本一区二区在线视频 | 三级视频国产 | 国产成人精品免高潮在线观看 | 日韩欧美国产精品 | 中文字幕亚洲视频 | a在线观看| 亚洲伊人久久综合 | 国产成人精品一区二区三区四区 | 欧美激情99 | 成人在线欧美 | 亚洲伊人久久综合 | 国产精品不卡 | 中文字幕一区二区三区在线视频 | 日本久久网 | 国产精品久久久久久高潮 | 日韩手机在线看片 | 国产激情 | 精品日韩在线 | 伊人久久免费视频 | 国产精品成人一区 | 青青久在线视频 | 91精品国产色综合久久不卡98口 | 国产精品区一区二 | 久草新在线 | 亚洲有码转帖 | 久久久免费观看视频 | 亚洲欧美精品久久 | 欧美日韩视频 | 国产日韩精品视频 | 岛国av在线免费观看 | 黑色丝袜三级在线播放 | 亚洲高清在线视频 | 日本免费一区二区三区四区 | 中文字幕在线视频精品 | 黄色一级大片在线免费看产 | 成人在线视频免费观看 | 亚洲精品乱码久久久久久久久久 | 日韩高清一区二区 |