中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++的define是什么

發布時間:2021-11-29 15:37:32 來源:億速云 閱讀:1207 作者:iii 欄目:編程語言

這篇文章主要介紹“C++的define是什么”,在日常操作中,相信很多人在C++的define是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++的define是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

挑戰#define

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

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

如:#define PI 3. 1415926

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

cout << "PI is“<<PI;  cout << "Filename: "<< HZK16;

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

類似于上例:

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

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

HZK16[5]=&rsquo;r&rsquo;; //ok HZK16 ="HZK16K"

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

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

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

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

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

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

float*p=&PI;  //error: Cannot convert 'const float*&rsquo; to 'float*&rsquo;  *p=3.14;

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

//test08.cpp  #include <iostream.h>  void main()  {  char * Spy;  const char * const String = "Yahoo!";  Spy = (char*)String;  Spy[5] = '?';  cout << String;  }  輸出結果:Yahoo!

2.內聯函數(in line function)

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

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

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

ADD ('A' 0. 0l);

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

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

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

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

case ' +': Operator = & ADD;

并不能得到合理解釋。

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

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

//test09.cpp  #include <iostream.h>  inline int Add (int a int b)  {  return a + b;  }  void main O)  {  cout<<"1+2=“<<Add(1 2);  }

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

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

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

3.函數重載(overload)

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

double AddDouble(double a double b)  {  return a + b;  }  float AddFloat (float a float b )  {  return a + b;  }

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

double Add(double a double b)  {  return a + b;  }

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

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

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

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

void fun(int a);  int fun(int a);  void fun(int& a);  void fun (int a int b=0);

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

//test10.cpp  #include <graphics.h>  #include <iostream.h>  void Pixel(int x int y int color)  {  putpixel(x y color);  }  int Pixel(int x int y)  {  return getpixel(x y);  }  void main()  {  int Driver=VGA Mode=VGAHI;  initgraph(&Driver &Mode "");  Pixel(100 100 4);  int Color = Pixel(100 100);  closegraph();  cout << "Color of point(100 100):" << Color;  }

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

extern "C" {  void Pixel(int x int y int Color);  };

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

extern "C" { //' #include&rsquo;一定要另起一行  #include "function. h"  };

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

到此,關于“C++的define是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铜梁县| 远安县| 阳谷县| 汉寿县| 义乌市| 特克斯县| 罗田县| 容城县| 九龙县| 莱芜市| 敖汉旗| 湖口县| 平远县| 清新县| 江川县| 贵南县| 肇东市| 宁城县| 大宁县| 兴仁县| 田阳县| 莱阳市| 淅川县| 大洼县| 阳原县| 左贡县| 高州市| 娄烦县| 巴中市| 徐汇区| 镇安县| 德安县| 波密县| 大安市| 大城县| 黄冈市| 曲水县| 马公市| 宜丰县| 乐昌市| 永德县|