欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
[原創(chuàng )]c++語(yǔ)言程序設計超級簡(jiǎn)單了解 邪惡八進(jìn)制信息安全團隊官方論壇 - 努力為信息安全撐起一片藍天 - EvilOctal Security Team - E.S.T

c++語(yǔ)言程序設計超級簡(jiǎn)單了解

信息來(lái)源:邪惡八進(jìn)制信息安全團隊([url]www.eviloctal.com[/url])
文章作者:金州

c++語(yǔ)言程序設計超級簡(jiǎn)單了解


千里之行,始于足下。

這是非常非常非常表面的介紹,是為一點(diǎn)都不知道的朋友寫(xiě)著(zhù)玩的。也許你看過(guò)之后什么都沒(méi)有
收獲到,一直罵作者是個(gè)sb.那么我請您原諒耽誤了您的時(shí)間,先表示抱歉了。呵呵

一。結構程序設計方法,要點(diǎn)。.三種基本控制結構。順序,循環(huán),選擇
選擇結構,兩種。if switch
if形式1.if   2. if else 3. if else if else if
switch(多分支選擇,金州注釋)
switch
{case 常量表達式1 :語(yǔ)句1
case 常量表達式n :語(yǔ)句n
default:語(yǔ)句n+1
}
循環(huán),while(沒(méi)有什么解釋的,先判斷,后執行,金州注釋)
例子,求1到100整數和
#include <iostream.h>   (套入函數,金州注釋?zhuān)?br> void main()         (下面主體,金州注釋?zhuān)?br> {                
  int i, sum = 0;     (定義i,賦予數值1,總和開(kāi)始為0,金州注釋?zhuān)?br>  i = 1;
  while(i <= 100) (循環(huán)下面部分,當i<100,判斷條件,金州注釋?zhuān)?br>  {
   sum += i;   (加,一直加,金州注釋?zhuān)?br>   i++;
  }         (循環(huán)結束,金州注釋?zhuān)?br>  cout<<"sum = "<<sum;   (搞出來(lái)結果,字符串sum=那個(gè)結果。金州注釋?zhuān)?br> }
do-while 循環(huán)(先執行,后判斷)
例子,還舉上面那個(gè),就是求1到100整數和
#include <iostream.h>
 void main()
 {
  int i, sum=0;     (定義賦值。金州注釋?zhuān)?br>  i = 1;
  do             (下面是循環(huán),金州注釋?zhuān)?br>  {
   sum += i;
   i++;
  }while(i<=100);   (條件,如果條件滿(mǎn)足就循環(huán),金州注釋?zhuān)?br>  cout<<"sum = "<<i;
 }
for循環(huán),
例子,還是上面那個(gè),求1到100整數和
#include <iostream.h>
 void main()
 {
  for(sum = 0, i = 1; i <= 100; i++)sum += i;
  cout<<"sum = "<<sum;
 }
(就是1-2-3-2-3-2-3(1指的是表達式),如果2不滿(mǎn)足,結束。金州注釋?zhuān)?br>
二,語(yǔ)言基礎:
看例子比較方便了解,
//simple.cpp是一個(gè)簡(jiǎn)單的C++程序 (標準注釋方法,不執行,我沒(méi)有用這種注釋?zhuān)鹬葑⑨專(zhuān)?br>#include <iostream.h> (一個(gè)文件頭,金州注釋?zhuān)?br>void main(void)   (函數,金州注釋?zhuān)?br>{             (main函數體開(kāi)始標記,金州注釋?zhuān)?br>int i;         (聲明一個(gè)變量,金州注釋?zhuān)?br>cout<<"jinzhou sb!";       (輸出,后面的東西,金州注釋?zhuān)?br>cout<<"請輸入一個(gè)整數:\n"; (\n是換行的意思,<<輸出符號,金州注釋?zhuān)?br>cin>>i;               (輸入,后面的東西。金州注釋?zhuān)?br>cout<<"輸入的整數是:";  
cout <<i;
cout <<‘\n‘;   (上三行簡(jiǎn)寫(xiě):cout<<"您輸入的整數是:" <<i <<‘\n‘;)
}           (主體結束,金州注釋?zhuān)?br>(Visual C++6編譯連接運行后,就是屏幕上出現“jinzhou sb!請輸入一個(gè)整數”
然后你隨便輸入一個(gè),回車(chē),得到“輸入的整數是:”,就是你輸入的那個(gè),大
概明白是這么個(gè)格式就行了。注意一點(diǎn)的就是,函數定義返回類(lèi)型為void,不用返回
,如果定義為int,則不同。如下。金州注釋。)
int main()
{
 …
 return 0;
}
(還有就是c++區分大小寫(xiě),一般命令小寫(xiě)多,常量大寫(xiě)多。變量混用多。金州注釋?zhuān)?br>數據類(lèi)型略過(guò)。大多類(lèi)似的。
變量使用舉一個(gè)簡(jiǎn)單的例子。
#include <iostream.h>
int main (void)  
{
int workDays = 5;     (定義一個(gè)整型變量,初始化為5,金州注釋?zhuān)?br>float workHours, payRate, weeklyPay;   (實(shí)型變量三個(gè),金州注釋?zhuān)?br>workHours = 7.5; payRate = 38.55;   (賦值,金州注釋?zhuān)?br>weeklyPay = workDays * workHours * payRate; (乘法運算,金州注釋?zhuān)?br>cout << "Weekly Pay = " << weeklyPay << ‘\n‘; (輸出換行,金州注釋?zhuān)?br>}

就是計算工資呢。
例子,打印給定半徑的圓的面積和周長(cháng)(有常量定義的實(shí)例程序)
void main()
{
 const double PI = 3.1415926535898;   (定義圓周率常量PI,金州注釋?zhuān)?br> double radius;   (定義圓半徑變量,金州注釋?zhuān)?br> double area;   (定義圓面積變量,金州注釋?zhuān)?br> double circumference;   (定義圓周長(cháng)變量,金州注釋?zhuān)?br> cout << "輸入半徑 : ";   (輸出,屏幕顯示,金州注釋?zhuān)?br> cin >> radius;       (輸入,金州注釋?zhuān)?br> area = PI*radius*radius; (面積公式,金州注釋?zhuān)?br> circumference = 2.0*PI*radius;   (周長(cháng)共識,金州注釋?zhuān)?br> cout << "面積 " << radius << " is "
 << area << " \n";
 cout << "周長(cháng)是 " << circumference   (輸出到屏幕,金州注釋?zhuān)?br><< ";
}
(注意定義常量的形式為 const 類(lèi)型 名字 = 值。)


三,運算符和表達式
要注意的是:
+ + 自加(前綴) ++valuel + 10 // 得出16,valuel變?yōu)?
+ + 自加(后綴) valuel++ + 10 // 得出15,valuel變?yōu)?
- - 自減(前綴) --valuel + 10 // 得出14,valuel變?yōu)?
- - 自減(后綴) valuel-- + 10 // 得出15,valuel變?yōu)?
(其實(shí)質(zhì)就是用‘++‘代替了"+1"(后綴)和"1+"(前綴)、‘-‘代替了"-1"。金州注釋?zhuān)?br>
!   邏輯非   !(5 = = 5) // 得出 0     (0是假,1是真,金州注釋?zhuān)?br>&&   邏輯與   5 < 6 && 6 < 6 // 得出 0
||   邏輯或   5 < 6 || 6 < 5 // 得出 1
~   取反 ~‘\011‘ // 得出 ‘\366‘
&   逐位與 ‘\011‘ & ‘\027‘ // 得出‘\001‘
|   逐位或 ‘\011‘ | ‘\027‘ // 得出‘\037‘
^   逐位異或 ‘\011‘ ^ ‘\027‘ // 得出‘\036‘
<< 逐位左移 ‘\011‘ << 2 // 得出‘\044‘
>> 逐位右移 ‘\011‘ >> 2 // 得出‘\002‘
實(shí)例 10進(jìn)制值 二進(jìn)制值
x   011     0 0 0 0 1 0 0 1
y   027     0 0 0 1 0 1 1 1
~x   366     1 1 1 1 0 1 1 0
x & y 001     0 0 0 0 0 0 0 1
x | y 037     0 0 0 1 1 1 1 1
x ^ y 036     0 0 0 1 1 1 1 0
x << 2 044   0 0 1 0 0 1 0 0
x >> 2 002   0 0 0 0 0 0 1 0
運算例子,
#include <iostream.h>
void main( )
{
 int a,b, m=3,n=4;
 a=7*2+-3%5-4/3;//-3%5=-3,4/3=1
 b=m++ - --n;
 cout<<a<<"\t"<<b<<"\t"<<m<<"\t"<<n<<endl;
}
結果10 0 4 3
例子
#include <iostream.h>
void main( )
{
 char x=‘m‘,y=‘n‘;
 int n;
 n=x<y;
 cout <<n<<endl;
 n=x==y-1;
 cout<<n<<endl;
 n=(‘y‘!=‘Y‘)+(5<3)+(y-x==1);
 cout <<n<<endl;
}
結果 1 1 2

四,流程控制語(yǔ)句。
if語(yǔ)句;if-else語(yǔ)句;switch語(yǔ)句;while語(yǔ)句;do-while語(yǔ)句;for語(yǔ)句;break語(yǔ)句;continue語(yǔ)句
(都是簡(jiǎn)單英語(yǔ),沒(méi)有什么解釋的,哈哈,金州注釋?zhuān)?br>五,函數。
這個(gè)解釋多多網(wǎng)上。
舉例子;求長(cháng)方形面積。
#include<iostream.h>   (C++庫函數說(shuō)明,金州注釋?zhuān)?br>int area(int length, int width);   ( area函數說(shuō)明,定義長(cháng)寬,金州注釋?zhuān)?br>void main()     (主函數,程序從該函數開(kāi)始執行,金州注釋?zhuān)?br>{
 int this_length, this_width;   (定義長(cháng)寬,金州注釋?zhuān)?br> cout << "輸入長(cháng)度: "; (cout和cin,就是函數,輸出后面字符串。金州注釋?zhuān)?br> cin >> this_length;   (輸入,金州注釋?zhuān)?br> cout << "輸入寬度: ";   (輸出那句話(huà)到屏幕,金州注釋?zhuān)?br> cin >> this_width;
 cout << "\n";         (回車(chē),金州注釋?zhuān)?br> cout << "面積 " << this_length << "x" << this_width;
 cout << " 長(cháng)方形面積是 " << area(this_length, this_width); (調用area函數,金州注釋?zhuān)?br>}
int area(int length, int width) (area函數定義,金州注釋?zhuān)?br>{
 int number;
 number = length * width;
 return number;
}
例子,比較大小的。
#include <iostream.h>
int max(int a,int b) (調用這個(gè)函數,金州注釋?zhuān)?br>{
 if(a>b)return a; (如果則怎么怎么的,金州注釋?zhuān)?br> else return b;
}           (以上是定義max函數的,金州注釋?zhuān)?br>void main()
{
 int max(int a,int b);
 int x,y,z;
 cout<<"輸入兩個(gè)數"<<endl; (屏幕顯示,回車(chē)輸入)
 cin>>x>>y;
 z=max(x,y);             (z為比較結果,金州注釋?zhuān)?br> cout<<"最大的數="<<z;     (輸出,金州注釋?zhuān)?br>}
例子

#include <iostream.h>
void Foo (int num)
{
 num = 0;
 cout << "num = " << num << ‘\n‘;
}
int main (void)
{
 int x = 10;
 Foo(x);
 cout << "x = " << x << ‘\n‘;
 return 0;
}
(這個(gè)更簡(jiǎn)單,不多說(shuō),主要是明白num是一個(gè)形參變量num,x是實(shí)參變量,實(shí)參調用時(shí)
送到形參,但是因為內存單元不同,即使num賦值0,并不影響x的值,道理大概理解了
就好,金州注釋?zhuān)?br>(不多解釋了,相關(guān)詳細內容,要找資料好好揣摩,這里只是簡(jiǎn)單說(shuō)一下,金州注釋?zhuān)?br>
六,數組與字符串。
#include <iostream.h>
void main(void)
{
 int marks[4] = {82,92,95,88}; (這個(gè)就是數組,就是這個(gè)格式,金州注釋?zhuān)?
 cout<<"第二個(gè)元素是:"<<marks[1]<<endl; (四個(gè)數排序是0123,所以1是第二個(gè)元素,金州注釋?zhuān)?br>}
(這就是定義數組了,找第二個(gè)元素的。92。金州注釋?zhuān)?br>例子,求字符串的長(cháng)度 (這個(gè)是字符串的,金州注釋。)
#define MAXLEN 80
#include <stdio.h>
void main(void)
{
 char str[MAXLEN + 1];   (最長(cháng)加1,因為是從0計算的,金州注釋?zhuān)?br> int l;           (定義長(cháng)度,這個(gè)符號可不是1啊,金州注釋?zhuān)?br> printf("Input a string:"); (輸出,告訴你開(kāi)始輸入,金州注釋?zhuān)?br> scanf("%s",str);       (檢查你輸入的,如果空,金州注釋?zhuān)?br> l = 0;             (長(cháng)度0,金州注釋?zhuān)?br> while(str[l] != ‘\0‘) (非空,金州注釋?zhuān)?br> l ++;             (加加,數出來(lái),金州注釋?zhuān)?br> printf("The length of this string is %d\n",l); (輸出結果回車(chē),金州注釋?zhuān)?br>}

七,指針與引用
指針就是在內存中的地址,它可能是變量的地址,也可能是函數的入口地址。
引用為變量提供了一個(gè)別名,變量通過(guò)引用訪(fǎng)問(wèn)與通過(guò)變量名訪(fǎng)問(wèn)是完全等價(jià)的。
引用提供了與指針相同的能力,但比指針更為直觀(guān),更易于理解。
int d =1;
int* const p =&d
(有const表示不可修改,p是一個(gè)常量指針,它指向一個(gè)整型變量。就是d,p本
身不能修改,但它所指向的內容卻可以修改:*p =2;這個(gè)不大好說(shuō),請查閱相
嚴謹詳細資料。關(guān)金州注釋。)
例如:
#include <iostream.h>
#define SIZE 10  
void main()
{
 int array[SIZE]; (聲明整數數組,金州注釋?zhuān)?br> int *p=array;     (定義一個(gè)整型指針p,給他數組首地址,金州注釋?zhuān)?br> int i ;         (定義變量i,金州注釋?zhuān)?br> for(i=0;i<SIZE;i++)   (賦值,運算,金州注釋?zhuān)?br>  array[i]=i;
 for(i=0;i<SIZE;i++)
  cout<<*p++<<endl;   (*p++就是訪(fǎng)問(wèn)下一個(gè)數組元素,金州注釋?zhuān)?br> p=&array[8];     (給他array[8]的地址,金州注釋?zhuān)?br> cout<<"array[8]="<<*p<<endl;     (輸出*p,金州注釋?zhuān)?br> cout<<"array[8]="<<array[8]<<endl; (輸出array[8],金州注釋?zhuān)?br>}  
(兩個(gè)值是一樣的,因為從0開(kāi)始,所以都是對數組第9個(gè)元素的訪(fǎng)問(wèn)。金州注釋?zhuān)?br>例子:折半查找函數
int BinSearch (char *item, char *table[],     (就是在table中查找是否含有item的元素)
int n, int (*Compare)(const char*, const char*))   Compare是一個(gè)比較函數指針,金州注釋?zhuān)?br>{
 int bot = 0;     (底部0,金州注釋?zhuān)?br> int top = n - 1;   (頂部n-1,金州注釋?zhuān)?br> int mid, cmp;   (定義比較變量,比較,金州注釋?zhuān)?br>while (bot <= top) (比較當然需要循環(huán),循環(huán)條件,意思就是不空,金州注釋?zhuān)?br> {           (以下循環(huán)內容)
mid = (bot + top) / 2;   (mid等于,全部除以2,就是一半,金州注釋?zhuān)?br>if ((cmp = Compare(item,table[mid])) == 0) (如果恰好相等,金州注釋?zhuān)?br> return mid;   ( 就是它,金州注釋?zhuān)?br> else if (cmp < 0) (不相等,金州注釋?zhuān)?br>    top = mid - 1; ( 查找數組的下半部,金州注釋?zhuān)?br>   else
    bot = mid + 1;   ( 查找數組的上半部,金州注釋?zhuān)?br> }
return -1; (上面循環(huán)之后,返回-1,沒(méi)有找到,因為n就是0了。金州注釋?zhuān)?br>}

例如。
char *cities[] = {"Beijing", "Shanghai", "Tianjin", "Zhongqing"};
cout << BinSearch("Tianjin ", cities, 4, strcmp) << ‘\n‘
輸出結果2
(就是,給出一個(gè)數組,找找“Tianjin”在四個(gè)中的位置,2就是在第三個(gè)位置。)

八。結構 鏈表
結構(struct)數據類(lèi)型,它能夠識別一組相關(guān)的數據。
鏈表也是表示線(xiàn)性數據最有用的方法之一,用鏈表保存線(xiàn)性數據,可以克服數組的問(wèn)題
舉例
#include <iostream.h>
#include <string.h>
struct Person_Info {   (個(gè)人信息表,下面是相關(guān)內容。金州注釋?zhuān)?br> char name[10];
 int age;
 long ssn;
};
void main (void)
{
 Person_Info* p1;     (給個(gè)指針,金州注釋?zhuān)?br> p1 = new Person_Info;   (申請內存,金州注釋?zhuān)?br> p1->age = 27; ( 給age成員賦值,金州注釋?zhuān)?br> strcpy(p1->name,"jinzhou"); (給name成員賦值 ,金州注釋)
 cout << "Name: " << p1->name << endl; ( 打印name成員,金州注釋?zhuān)?br> cout << "Age: " << p1->age << endl; (打印age成員,金州注釋?zhuān)?br> delete p1;                 (釋放申請的內存,金州注釋?zhuān)?br>}
簡(jiǎn)單例子學(xué)生結構的實(shí)例
struct stu
  {
   int num;
   int score;
   stu *next;
  }
(明白這個(gè)意思就行了,金州注釋?zhuān)?br>
九,編譯預處理
C++提供的編譯預處理功能主要有以下三種:(一) 宏定義(二) 文件包含(三) 條件編譯
宏定義例子;
#include <iostream.h>, (一定要有,或者出錯,金州注釋)
#define CUBE_THREE 3*3* (用簡(jiǎn)單宏定義定義了一個(gè)符號常量"CUBE_THREE")
void main()
{
 int a;           (定義變量,金州注釋?zhuān)?br> a=CUBE_THREE;     (賦予值,就是a=3*3*3,金州注釋?zhuān)?br> cout<<"a is"<<a<<endl;   (輸出,結果為27,金州注釋?zhuān)?br>}
(這個(gè)意思主要是說(shuō)可以把常用的東西定義為宏。這個(gè)不帶參數,帶參數的略。金州注釋?zhuān)?br>文件包含類(lèi)的略。
例子:條件編譯命令的一個(gè)例子
#include <iostream.h>
#define TIME
void main()
{
 #ifdef TIME             (如果TIME被定義過(guò),輸出下面句話(huà)。金州注釋?zhuān)?br>  cout<<"Now begin to work"<<endl;
 #else               (如果沒(méi)有定義,輸出下面的,金州注釋?zhuān)?br>  cout<<"You can have a rest"<<endl;
 #endif
}
(所謂條件,就是有條件的,金州注釋。就是要選擇。哈哈)

十。類(lèi)與對象
略過(guò),請找尋相關(guān)詳細資料閱讀,不好意思。

十一,繼承與多態(tài)。(略過(guò))
十二,輸入輸出流。
抽象流基類(lèi)
ios         流基類(lèi)
輸入流類(lèi)
istream       普通輸入流類(lèi)和用于其它輸入流的基類(lèi)
ifstream      輸入文件流類(lèi)
istream_withassign 用于cin的輸入流類(lèi)
istrstream     輸入串流類(lèi)
輸出流類(lèi)
ostream      普通輸出流類(lèi)和用于其它輸出流類(lèi)的基類(lèi)
ofstream      輸出文件流類(lèi)
ostream_withassign 用于cout、cerr和clog的流類(lèi)
ostrstream.    輸出串流類(lèi)
輸入輸出流類(lèi)
iostream      普通輸入輸出流類(lèi)和用于其它輸入輸出流的基類(lèi)
fstream      輸入輸出文件流類(lèi)
strstream     輸入輸出串流類(lèi)
stdiostream    用于標準輸入輸出文件的輸入輸出類(lèi)
緩沖流類(lèi)
streambuf     抽象緩沖流基類(lèi)
filebuf      用于磁盤(pán)文件的緩沖流類(lèi)
strstreambuf.   用于串的緩沖流類(lèi)
stdiobuf      用于標準輸入輸出文件的緩沖流類(lèi)
預定義流初始化類(lèi)
iostream_init   預定義流初始化的類(lèi)
其中,ios、istream、ostream和streambuf類(lèi)構成了C++中iostream輸入輸出功能的基礎
(略)

  如果你真的捏著(zhù)鼻子再捏著(zhù)鼻子讀完的話(huà),也許和我一樣覺(jué)得算是了解了c++九牛一毛了,
其實(shí)后來(lái)才發(fā)現不過(guò)是才知道牛是有毛的而已。到現在我也沒(méi)有抓住牛頭,據說(shuō)編程需要天才,
我沒(méi)有哪個(gè)天分,哈哈,只是希望有朋友看到之后能夠有一個(gè)很大概地了解。不好意思。不過(guò)大家可
以常常到邪惡八進(jìn)制來(lái)看看,這里有很多這方面的超級高手,至少算是看看天才的樣子,哈哈
祝福!
                              金州。邪惡八進(jìn)制
                                  2005.12.17


 

 

定義常量也可以使用define、inline去實(shí)現

我建議大家用const和inline而不用#define

這個(gè)條款最好稱(chēng)為:“盡量用編譯器而不用預處理”,因為#define經(jīng)常被認為好象不是語(yǔ)言本身的一部分。這是問(wèn)題之一。再看下面的語(yǔ)句:

#define ASPECT_RATIO 1.653

編譯器會(huì )永遠也看不到ASPECT_RATIO這個(gè)符號名,因為在源碼進(jìn)入編譯器之前,它會(huì )被預處理程序去掉,于是ASPECT_RATIO不會(huì )加入到符號列表中。如果涉及到這個(gè)常量的代碼在編譯時(shí)報錯,就會(huì )很令人費解,因為報錯信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO不是在你自己寫(xiě)的頭文件中定義的,你就會(huì )奇怪1.653是從哪里來(lái)的,甚至會(huì )花時(shí)間跟蹤下去。這個(gè)問(wèn)題也會(huì )出現在符號調試器中,因為同樣地,你所寫(xiě)的符號名不會(huì )出現在符號列表中。
解決這個(gè)問(wèn)題的方案很簡(jiǎn)單:不用預處理宏,定義一個(gè)常量:

const double ASPECT_RATIO = 1.653;

這種方法很有效。但有兩個(gè)特殊情況要注意。
首先,定義指針常量時(shí)會(huì )有點(diǎn)不同。因為常量定義一般是放在頭文件中(許多源文件會(huì )包含它),除了指針所指的類(lèi)型要定義成const外,重要的是指針也經(jīng)常要定義成const。例如,要在頭文件中定義一個(gè)基于char*的字符串常量,你要寫(xiě)兩次const:

const char * const authorName = "Scott Meyers";

關(guān)于const的含義和用法,特別是和指針相關(guān)聯(lián)的問(wèn)題,參見(jiàn)條款21。

另外,定義某個(gè)類(lèi)(class)的常量一般也很方便,只有一點(diǎn)點(diǎn)不同。要把常量限制在類(lèi)中,首先要使它成為類(lèi)的成員;為了保證常量最多只有一份拷貝,還要把它定義為靜態(tài)成員:
     

class GamePlayer {
private:
      static const int NUM_TURNS = 5; // constant eclaration  
      int scores[NUM_TURNS];                 // use of constant
      ...
};

還有一點(diǎn),正如你看到的,上面的語(yǔ)句是NUM_TURNS的聲明,而不是定義,所以你還必須在類(lèi)的實(shí)現代碼文件中定義類(lèi)的靜態(tài)成員:

const int GamePlayer::NUM_TURNS;         // mandatory definition;
              // goes in class impl.file

你不必過(guò)于擔心這種小事。如果你忘了定義,鏈接器會(huì )提醒你。

舊一點(diǎn)的編譯器會(huì )不接受這種語(yǔ)法,因為它認為類(lèi)的靜態(tài)成員在聲明時(shí)定義初始值是非法的;而且,類(lèi)內只允許初始化整數類(lèi)型(如:int, bool, char 等),還只能是常量。
在上面的語(yǔ)法不能使用的情況下,可以在定義時(shí)賦初值:


class EngineeringConstants { // this goes in the class
private:                 // header file
      static const double FUDGE_FACTOR;
      ...
};
      // this goes in the class implementation file
      const double EngineeringConstants::FUDGE_FACTOR = 1.35;

大多數情況下你只要做這么多。唯一例外的是當你的類(lèi)在編譯時(shí)需要用到這個(gè)類(lèi)的常量的情況,例如上面GamePlayer::scores數組的聲明(編譯過(guò)程中編譯器一定要知道數組的大小)。所以,為了彌補那些(不正確地)禁止類(lèi)內進(jìn)行整型類(lèi)常量初始化的編譯器的不足,可以采用稱(chēng)之為“借用enum”的方法來(lái)解決。這種技術(shù)很好地利用了當需要int類(lèi)型時(shí)可以使用枚舉類(lèi)型的原則,所以GamePlayer也可以象這樣來(lái)定義:


class GamePlayer {
private:
      enum { NUM_TURNS = 5 }         // "the enum hack" — makes
      // NUM_TURNS a symbolic name  
      // for 5
      int scores[NUM_TURNS];// fine
};

除非你正在用老的編譯器(即寫(xiě)于1995年之前),你不必借用enum。當然,知道有這種方法還是值得的,因為這種可以追溯到很久以前的時(shí)代的代碼可是不常見(jiàn)的喲。

回到預處理的話(huà)題上來(lái)。另一個(gè)普遍的#define指令的用法是用它來(lái)實(shí)現那些看起來(lái)象函數而又不會(huì )導致函數調用的宏。典型的例子是計算兩個(gè)對象的最大值:


#define max(a,b) ((a) > (b) ? (a) : (b))

這個(gè)語(yǔ)句有很多缺陷,光想想都讓人頭疼,甚至比在高峰時(shí)間到高速公路去開(kāi)車(chē)還讓人痛苦。
無(wú)論什么時(shí)候你寫(xiě)了象這樣的宏,你必須記住在寫(xiě)宏體時(shí)對每個(gè)參數都要加上括號;否則,別人調用你的宏時(shí)如果用了表達式就會(huì )造成很大的麻煩。但是即使你象這樣做了,還會(huì )有象下面這樣奇怪的事發(fā)生:

int a = 5, b = 0;
max(++a, b);// a 的值增加了2次
max(++a, b+10); // a 的值只增加了1次

這種情況下,max內部發(fā)生些什么取決于它比較的是什么值!
幸運的是你不必再忍受這樣愚笨的語(yǔ)句了。你可以用普通函數實(shí)現宏的效率,再加上可預計的行為和類(lèi)型安全,這就是內聯(lián)函數(見(jiàn)條款33):


inline int max(int a, int b) { return a > b ? a : b; }
不過(guò)這和上面的宏不大一樣,因為這個(gè)版本的max只能處理int類(lèi)型。但模板可以很輕巧地解決這個(gè)問(wèn)題:


template<class T>
inline const T& max(const T& a, const T& b)
{ return a > b ? a : b; }

這個(gè)模板產(chǎn)生了一整套函數,每個(gè)函數拿兩個(gè)可以轉換成同種類(lèi)型的對象進(jìn)行比較然后返回較大的(常量)對象的引用。因為不知道T的類(lèi)型,返回時(shí)傳遞引用可以提高效率(見(jiàn)條款22)。

順便說(shuō)一句,在你打算用模板寫(xiě)象max這樣有用的通用函數時(shí),先檢查一下標準庫(見(jiàn)條款49),看看他們是不是已經(jīng)存在。比如說(shuō)上面說(shuō)的max,你會(huì )驚喜地發(fā)現你可以后人乘涼:max是C++標準庫的一部分。
有了const和inline,你對預處理的需要減少了,但也不能完全沒(méi)有它。拋棄#include的日子還很遠,#ifdef/#ifndef在控制編譯的過(guò)程中還扮演重要角色。預處理還不能退休,但你一定要計劃給它經(jīng)常放長(cháng)假。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C++入門(mén)到理解階段二核心篇(1)——c++面向對象概述、內存分析、引用
C 之C 與C的區別一
詳解C++中的const關(guān)鍵字及與C語(yǔ)言中const的區別
數組名和指針的區別
C++ 學(xué)習筆記1 - 日志 - 邱泳天 - 血與榮譽(yù)SNS平臺 - Powered by ...
默認參數與函數重載,及函數匹配
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久