啪啪拉拉噼里啪啦

          初學(xué)者天堂資料匯集

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            16 隨筆 :: 73 文章 :: 16 評論 :: 0 Trackbacks

          程序基本原理
          1.什么是計算機語言?
          計算機程序設(shè)計語言是計算機可以識別的語言,用于描述解決問題的方法,供計算機閱讀和執(zhí)行。
          2.什么是指令?
          所謂指令,是計算機可以識別的命令。
          3.什么是面向?qū)ο螅?BR>面向?qū)ο蟮木庉嬚Z言將客觀事務(wù)看作具有屬性和行為(或稱為服務(wù))的對象,通過抽象找出同一類的共同屬性(靜態(tài)特征)和行為(動態(tài)特征),形成類。對象也就是一組屬性和一組行為的構(gòu)成
          4.是么是面向?qū)ο蟮姆椒ǎ?BR>首先將數(shù)據(jù)和對數(shù)據(jù)的操作方法放在一起,作為一個相互依存,不可分離的整體--對象。對同類型的對象抽象出其共性,形成類。類中大多數(shù)數(shù)據(jù),智能用本類方法進行處理。類通過一個簡單的外部接口與外界發(fā)生關(guān)系。對象與對象之間通過消息進行通訊。
          5.什么是類》
           具有相同屬性和服務(wù)一組對象的集合
          6.面向?qū)ο蟮能浖_發(fā)
          面向?qū)ο蟮姆治觯∣OA) 面向?qū)ο笤O(shè)計(OOD) 面向?qū)ο缶幊蹋∣OP) 面向?qū)ο鬁y試(OOT) 面向?qū)ο蟮能浖S護(OOSM)
          7.程序類型
           翻譯程序有三種不同的類型
          匯編程序  編譯程序 解釋程序

          二:C/C++基礎(chǔ)
          2.1一個簡單的C/C++程序:
          #include<iostream.h>
          void main()
          { cout<<"hello world!"<<endl;
            cout<<"welcome to our c++ \n";
          }
          2.2字符集


          字符集是構(gòu)成C++的基本元素。
          英文字母A-Z,a-z;
          數(shù)字字符0-9;
          特殊字符
          空格 !  #  % ^&*()+=-<>/\" 等
          標(biāo)識符
          以大寫字母和小寫字母以及下劃線開始
          可以有大寫字母小寫字母以及數(shù)字組成
          大寫字母和小寫字母代表不同標(biāo)識符
          不能是C++關(guān)鍵字
          2.3 C++的注釋
          /*                 */ 段落間的注釋
          // 一行一行的注釋

          常量:整型常量 (十進制 八進制 十六進制)
           十進制 【0-9】
          八進制 【0/0--9  】
          十六進制 【0x/0-9】

          實型常量  一般形式  12.5 -12.5
                            指數(shù)形式 0.34E+2  -34.53e-4   實型常量 默認(rèn)為double  如果后綴為F 則是float
          字符常量
          'A','a','d','?','$'  \nnn  八進制形式                                 '\X61'='a' 十六進制 \xnnn
          字符串常量
          "this is a string"

          布爾常量
          只有兩個 false(假)   true(真)

          變量 變量在使用之前一定要聲明。
          數(shù)據(jù)類型 變量名1,變量名2,變量名3,…………變量名N;
          例如
          int a,b;
          folat v,r h;
          在聲明一個變量時也可以給它賦初值 : int a=3;
          double f=4.55;
          char c='3';
          int a(4);

          變量存儲了行, 變量除具有數(shù)據(jù)類型外,還具有存儲類型。
          auto: 采用堆棧方式分配內(nèi)存空間,屬于暫時性存儲。其存儲空間可被若干變量多次覆蓋
          register:存放在通用寄存器內(nèi)
          extern: 在所有函數(shù)和程序段都可以引用
          static: 在內(nèi)存中以固定地址存放,整個程序運行期均有用

          符號常量
          符號常量在使用前一定要聲明
          const  類型說明符  常量名=常量值;
          數(shù)據(jù)類型說明符 const 常量名 =常量值;

          const  float pi=3.1415926;
          符號常量在聲明時一定要賦初值,否則時錯誤的
          以下聲明就是錯誤的
          const float pi;
          pi=3.1415926; // 這是錯誤的。

          計算
          C=i++; 現(xiàn)把i值賦給C
          B=++i; 現(xiàn)使i +1 之后賦值給B

          a+=3  等價 a=a+3
          a+=a-=a*a 等價于  a=a+(a=a-(a*a))

          逗號表達(dá)式
          int a;
          a=3*5,a*4  //最終結(jié)果是60;

          條件運算符
          表達(dá)式1?表達(dá)式2:表達(dá)式3
          cout<<(score>=60?"pass":"fail");

          sizeof(類型名)
          或者sizeof(表達(dá)式)
          計算某種類型的對象在內(nèi)存所占的字節(jié)數(shù)


          數(shù)據(jù)的輸入和輸出

          C++中,將數(shù)據(jù)從一個對象到令一個對象的流動抽象為"流"

          C++ I/O 流類庫  iomanip.h
          dec  數(shù)值數(shù)據(jù)采用十進制
          Hex  數(shù)值采用16進制
          Oct  數(shù)值采用8進制
          Ws   取空白符
          endl 換行符,刷新流
          ENDS 插入空白符
          setprecision(INT) 設(shè)置浮點數(shù)的小數(shù)位數(shù)
          setw(int) 設(shè)置域?qū)?/P>


          算法基本結(jié)構(gòu)

          順序  選擇 循環(huán)

          1.用IF語句實現(xiàn)選擇結(jié)構(gòu)
          if(表達(dá)式) 語句1
          else 語句2

          例如
          if(x>y) cout<<x;
          else
          cout<<y;


          if(表達(dá)式)  語句  例如  if(x>y) cout<<x;

          判斷一個年份是否為閏年
          分析:
          閏年年份被4整除不能被100整除,或者能被400整除。因此

          isleapyear((year%4= =0&& year%100 !=0)||(year%400==0) );

          if(isleapyear)
          {cout<<"this year is leapyear"<<year;}
          else
          {cout<<"this year is not leapyear"<<year;}

          多重選擇結(jié)構(gòu)
          if(表達(dá)式1)
            if(表達(dá)式2)  語句1
          esle 語句2
          else
             if(表達(dá)式3)語句3
          else
             語句4



          例如

          cin>>x>>y;
          if(x!=y)
            if(x>y)
             cout<<x;
          else cout<<y;
          else
           cout<<"x=y"<<endl;


          if   else  if 語句

          if(表達(dá)式) 語句1
          else if (2)   語句2
          esle if(3) 語句3
          esle   語句N;


          switch 語句
          switch( 表達(dá)式)
          { case  常量表達(dá)式1:語句1
                  break;

            case  常量表達(dá)式n:  語句N
                break;
          default:語句N+1
              break;

          }

          例如:

          #include<iostream.h>
          void main()
          { int day;
            cout<<"Please input day"<<endl;
            cin>>day;
            switch(day)
          {  case 0: cout<<"sunday"<<end;
                          break;
              case 1:  cout<<"monday"<<endl;
                         break;
              case 6:  cout<<"saturday"<<endl;
                          break;
          default: cout<<"the error day!";
                     break;

          }

          }


          循環(huán)結(jié)構(gòu)

          while(i<10)
          { sum+=i[
            i++
          }

          do
          { sum=sum+i;
            i++;
          } while(i<=10);

          輸入一個整數(shù),將各位數(shù)字翻轉(zhuǎn)后輸出。。。

          #include<iostram.h>
          void main()
          { int n; right_digit;
             cout<<"enter the number";
            cin>>n;
           do
          {  right_digit=n%10;
             cout<<right_digit;
            n=n/10;

          } while(n!=0);
          cout<<endl;
          }

          for yu語句
          1..for(i=1;i<10;i++) sum=sum+i;
          2..i=1;
              for(;i<10;i++) sum=sum+i;
          3..for(i=0,j=0;i<=j;i++,j--) k=i+j;
          4..for(i=0;i<10;)sum=sum+i;i++;
          用FOR可以解決所有循環(huán)問題


          求出一個數(shù)的所有因子
          #include<iostream.h>
          void main()
          { int n,k;
            for(k=1;k<=n;k++)
          {  if(n%k==0)
             cout<<k<<"";
           cout<<endl;
          }
          }

          自定義類型

          typedef

          typedef  int  natural;
          natural t1,t2;

          定義natural可以為整型變量

          枚舉類型  enum
          enum  枚舉類型名 {變量值列表}
          enum weekday{sun,mon,tue,wed, thu,sat};
          對枚舉類型按照常量處理,但不能賦初值
          枚舉類型具有默認(rèn)值 依次分別為0,1,2,3,4,…………等
          也可在聲明時另行指定枚舉元素的值 如
          enum weekday{sun=7,mon=1,………………};
          整數(shù)值不能直接賦予枚舉類型。若需將整數(shù)值賦給枚舉變量,應(yīng)進行強制類型轉(zhuǎn)換
          枚舉可進行關(guān)系運算

          例如
          #include<iostream.h>
          enum game_result(win lose tie cancel);
          int main()
          { game_result result;
            emum game_result omit=cancel;
            int count;
           for(count=win;count<=cancel;count++)
           { result=(game_result)count;
            if(result=omit)
          {cout<<"the game is cancelled";}
          else
          { cout<<"the game was played";
           if(result=win)
            cout<<"and won";
          if (result=lose)
          cout<<"and lost"

          }
          }
          return 0;
          }


          五個顏色不同的彩球,每次取三個,三個顏色均不相同。問有多少種取法。
          5×4×3=60

          enmu color {red,yellow,blue,white,black}
          int i,j,k;
          int n=0;
          for(i=red;i<=black;i++)
            for(j=red;j<=black;j++)
              if(i!=j)
              { for(k=red;k<=black;k++)
                   if((k!=i)&&(k!=j))
                      { n=n+1 }
                         cout<<n;
                       
                       for(loop=1;loop<=3;loop++)
                             { switch(loop)
                                   {  case 1:pr1=(enum color)i;break;
                                       case 2:pr1=(enum color)j;break;
                                       case 3:pr1=(enum color)k;break;
                                   default:break; }
                                switch(pr1)
                                      {  case red: cout<<"red"; break;
                                          case blue :^………………
                                      ……………………
                                        default:break;}
                                     
                    }}
                        cout<<n;                     }

          結(jié)構(gòu)體變量
          struct  student
          { int num;
             char name[20];
             char sex;
          }
          student  student1;
          studen1.name="zhang san"

           

          聯(lián)合體
          有時需要幾個不同類型的變量共用一組內(nèi)存單元,這時可以聲明一個聯(lián)合體類型

           union uarea
          { char c_data;
            long  i_data; }
          聯(lián)合體可以不聲明名稱,稱之為無名聯(lián)合體

          posted on 2005-04-01 05:34 噼里啪啦的世界 閱讀(788) 評論(5)  編輯  收藏

          評論

          # re: 我的java學(xué)習(xí)筆記(第一章 回顧C/C++ 基本概念) 2005-04-01 06:45 噼里啪啦的世界
          問題:const變量 & 常量

            為什么我象下面的例子一樣用一個const變量來初始化數(shù)組,ANSI C的編譯器會報告一個錯誤呢?

            const int n = 5;

            int a[n];

            答案與分析:

            1)、這個問題討論的是“常量”與“只讀變量”的區(qū)別。常量肯定是只讀的,例如5, “abc”,等,肯定是只讀的,因為程序中根本沒有地方存放它的值,當(dāng)然也就不能夠去修改它。而“只讀變量”則是在內(nèi)存中開辟一個地方來存放它的值,只不過這個值由編譯器限定不允許被修改。C語言關(guān)鍵字const就是用來限定一個變量不允許被改變的修飾符(Qualifier)。上述代碼中變量n被修飾為只讀變量,可惜再怎么修飾也不是常量。而ANSI C規(guī)定數(shù)組定義時維度必須是“常量”,“只讀變量”也是不可以的。

            2)、注意:在ANSI C中,這種寫法是錯誤的,因為數(shù)組的大小應(yīng)該是個常量,而const int n,n只是一個變量(常量 != 不可變的變量,但在標(biāo)準(zhǔn)C++中,這樣定義的是一個常量,這種寫法是對的),實際上,根據(jù)編譯過程及內(nèi)存分配來看,這種用法本來就應(yīng)該是合理的,只是ANSI C對數(shù)組的規(guī)定限制了它。

            3)、那么,在ANSI C 語言中用什么來定義常量呢?答案是enum類型和#define宏,這兩個都可以用來定義常量。

            問題:const變量 & const 限定的內(nèi)容

            下面的代碼編譯器會報一個錯誤,請問,哪一個語句是錯誤的呢?

            typedef char * pStr;

            char string[4] = "abc";

            const char *p1 = string;

            const pStr p2 = string;

            p1++;

            p2++;

            答案與分析:

            問題出在p2++上。

            1)、const使用的基本形式: const char m;

            限定m不可變。

            2)、替換1式中的m, const char *pm;

            限定*pm不可變,當(dāng)然pm是可變的,因此問題中p1++是對的。

            3)、替換1式char, const newType m;

            限定m不可變,問題中的charptr就是一種新類型,因此問題中p2不可變,p2++是錯誤的。

            問題:const變量 & 字符串常量

            請問下面的代碼有什么問題?

            char *p = "i'm hungry!";

            p[0]= 'I';

            答案與分析:

            上面的代碼可能會造成內(nèi)存的非法寫操作。分析如下, “i'm hungry”實質(zhì)上是字符串常量,而常量往往被編譯器放在只讀的內(nèi)存區(qū),不可寫。p初始指向這個只讀的內(nèi)存區(qū),而p[0] = 'I'則企圖去寫這個地方,編譯器當(dāng)然不會答應(yīng)。

            問題:const變量 & 字符串常量2

            請問char a[3] = "abc" 合法嗎?使用它有什么隱患?

            答案與分析:

            在標(biāo)準(zhǔn)C中這是合法的,但是它的生存環(huán)境非常狹小;它定義一個大小為3的數(shù)組,初始化為“abc”,,注意,它沒有通常的字符串終止符'\0',因此這個數(shù)組只是看起來像C語言中的字符串,實質(zhì)上卻不是,因此所有對字符串進行處理的函數(shù),比如strcpy、printf等,都不能夠被使用在這個假字符串上。

            問題:const & 指針

            類型聲明中const用來修飾一個常量,有如下兩種寫法,那么,請問,下面分別用const限定不可變的內(nèi)容是什么?

            1)、const在前面

            const int nValue; //nValue是const

            const char *pContent; //*pContent是const, pContent可變

            const (char *) pContent;//pContent是const,*pContent可變

            char* const pContent; //pContent是const,*pContent可變

            const char* const pContent; //pContent和*pContent都是const

            2)、const在后面,與上面的聲明對等

            int const nValue; // nValue是const

            char const * pContent;// *pContent是const, pContent可變

            (char *) const pContent;//pContent是const,*pContent可變

            char* const pContent;// pContent是const,*pContent可變

            char const* const pContent;// pContent和*pContent都是const

            答案與分析:

            const和指針一起使用是C語言中一個很常見的困惑之處,在實際開發(fā)中,特別是在看別人代碼的時候,常常會因為這樣而不好判斷作者的意圖,下面講一下我的判斷原則:

            沿著*號劃一條線,const和誰在一邊,那么誰就是const,即const限定的元素就是它。你可以根據(jù)這個規(guī)則來看上面聲明的實際意義,相信定會一目了然。

            另外,需要注意:對于const (char *) ; 因為char *是一個整體,相當(dāng)于一個類型(如 char),因此,這是限定指針是const。

            回復(fù)  更多評論
            

          # re: 我的java學(xué)習(xí)筆記(第一章 回顧C/C++ 基本概念) 2005-04-01 06:49 噼里啪啦的世界
          一、typedef的用法

          ____在C/C++語言中,typedef常用來定義一個標(biāo)識符及關(guān)鍵字的別名,它是語言編譯過程的一部分,但它并不實際分配內(nèi)存空間,實例像:

          typedef int INT;
          typedef int ARRAY[10];
          typedef (int*) pINT;

          ____typedef可以增強程序的可讀性,以及標(biāo)識符的靈活性,但它也有“非直觀性”等缺點。

          二、#define的用法

          ____#define為一宏定義語句,通常用它來定義常量(包括無參量與帶參量),以及用來實現(xiàn)那些“表面似和善、背后一長串”的宏,它本身并不在編譯過程中進行,而是在這之前(預(yù)處理過程)就已經(jīng)完成了,但也因此難以發(fā)現(xiàn)潛在的錯誤及其它代碼維護問題,它的實例像:

          #define INT int
          #define TRUE 1
          #define Add(a,b) ((a)+(b));
          #define Loop_10 for (int i=0; i<10; i++)

          ____在Scott Meyer的Effective C++一書的條款1中有關(guān)于#define語句弊端的分析,以及好的替代方法,大家可參看。

          三、typedef與#define的區(qū)別

          ____從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為標(biāo)識符另起的新名稱(僅僅只是個別名),而#define原本在C中是為了定義常量,到了C++,const、enum、inline的出現(xiàn)使它也漸漸成為了起別名的工具。有時很容易搞不清楚與typedef兩者到底該用哪個好,如#define INT int這樣的語句,用typedef一樣可以完成,用哪個好呢?我主張用typedef,因為在早期的許多C編譯器中這條語句是非法的,只是現(xiàn)今的編譯器又做了擴充。為了盡可能地兼容,一般都遵循#define定義“可讀”的常量以及一些宏語句的任務(wù),而typedef則常用來定義關(guān)鍵字、冗長的類型的別名。

          ____宏定義只是簡單的字符串代換(原地擴展),而typedef則不是原地擴展,它的新名字具有一定的封裝性,以致于新命名的標(biāo)識符具有更易定義變量的功能。請看上面第一大點代碼的第三行:

          typedef (int*) pINT;
          以及下面這行:
          #define pINT2 int*

          ____效果相同?實則不同!實踐中見差別:pINT a,b;的效果同int *a; int *b;表示定義了兩個整型指針變量。而pINT2 a,b;的效果同int *a, b;表示定義了一個整型指針變量a和整型變量b。

          ____注意:兩者還有一個行尾;號的區(qū)別哦!
            回復(fù)  更多評論
            

          # re: 我的java學(xué)習(xí)筆記(第一章 回顧C/C++ 基本概念) 2005-04-01 06:50 噼里啪啦的世界

          常量
          常量是一種標(biāo)識符,它的值在運行期間恒定不變。C語言用 #define來定義常量(稱為宏常量)。C++ 語言除了 #define外還可以用const來定義常量(稱為const常量)。
          為什么需要常量
          如果不使用常量,直接在程序中填寫數(shù)字或字符串,將會有什么麻煩?
          (1) 程序的可讀性(可理解性)變差。程序員自己會忘記那些數(shù)字或字符串是什么意思,用戶則更加不知它們從何處來、表示什么。
          (2) 在程序的很多地方輸入同樣的數(shù)字或字符串,難保不發(fā)生書寫錯誤。
          (3) 如果要修改數(shù)字或字符串,則會在很多地方改動,既麻煩又容易出錯。

          【規(guī)則5-1-1】 盡量使用含義直觀的常量來表示那些將在程序中多次出現(xiàn)的數(shù)字或字符串。
          例如:
          #define MAX 100 /* C語言的宏常量 */
          const int MAX = 100; // C++ 語言的const常量
          const float PI = 3.14159; // C++ 語言的const常量
          const 與 #define的比較
          C++ 語言可以用const來定義常量,也可以用 #define來定義常量。但是前者比后者有更多的優(yōu)點:
          (1) const常量有數(shù)據(jù)類型,而宏常量沒有數(shù)據(jù)類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產(chǎn)生意料不到的錯誤(邊際效應(yīng))。
          (2) 有些集成化的調(diào)試工具可以對const常量進行調(diào)試,但是不能對宏常量進行調(diào)試。

          【規(guī)則5-2-1】在C++ 程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。



            回復(fù)  更多評論
            

          # re: 我的java學(xué)習(xí)筆記(第一章 回顧C/C++ 基本概念) 2005-04-01 06:52 噼里啪啦的世界
          常量定義規(guī)則
          【規(guī)則5-3-1】需要對外公開的常量放在頭文件中,不需要對外公開的常量放在定義文件的頭部。為便于管理,可以把不同模塊的常量集中存放在一個公共的頭文件中。
          【規(guī)則5-3-2】如果某一常量與其它常量密切相關(guān),應(yīng)在定義中包含這種關(guān)系,而不應(yīng)給出一些孤立的值。
          例如:
          const float RADIUS = 100;
          const float DIAMETER = RADIUS * 2;
          類中的常量
          有時我們希望某些常量只在類中有效。由于#define定義的宏常量是全局的,不能達(dá)到目的,于是想當(dāng)然地覺得應(yīng)該用const修飾數(shù)據(jù)成員來實現(xiàn)。const數(shù)據(jù)成員的確是存在的,但其含義卻不是我們所期望的。const數(shù)據(jù)成員只在某個對象生存期內(nèi)是常量,而對于整個類而言卻是可變的,因為類可以創(chuàng)建多個對象,不同的對象其const數(shù)據(jù)成員的值可以不同。
          不能在類聲明中初始化const數(shù)據(jù)成員。以下用法是錯誤的,因為類的對象未被創(chuàng)建時,編譯器不知道SIZE的值是什么。
          class A
          {…
          const int SIZE = 100; // 錯誤,企圖在類聲明中初始化const數(shù)據(jù)成員
          int array[SIZE]; // 錯誤,未知的SIZE
          };

          const數(shù)據(jù)成員的初始化只能在類構(gòu)造函數(shù)的初始化表中進行,例如
          class A
          {…
          A(int size); // 構(gòu)造函數(shù)
          const int SIZE ;
          };
          A::A(int size) : SIZE(size) // 構(gòu)造函數(shù)的初始化表
          {

          }
          A a(100); // 對象 a 的SIZE值為100
          A b(200); // 對象 b 的SIZE值為200

          怎樣才能建立在整個類中都恒定的常量呢?別指望const數(shù)據(jù)成員了,應(yīng)該用類中的枚舉常量來實現(xiàn)。例如
          class A
          {…
          enum { SIZE1 = 100, SIZE2 = 200}; // 枚舉常量
          int array1[SIZE1];
          int array2[SIZE2];
          };
          枚舉常量不會占用對象的存儲空間,它們在編譯時被全部求值。枚舉常量的缺點是:它的隱含數(shù)據(jù)類型是整數(shù),其最大值有限,且不能表示浮點數(shù)(如PI=3.14159)。

            回復(fù)  更多評論
            

          # re: 我的java學(xué)習(xí)筆記(第一章 回顧C/C++ 基本概念) 2005-04-01 06:53 噼里啪啦的世界
          const主要是為了程序的健壯型,減少程序出錯.
          最基本的用法:
          const int a=100; b的內(nèi)容不變,b只能是100也就是聲明一個int類型的常量(#define b =100)
          int const b=100; //和上面作用一樣

          const指針和引用一般用在函數(shù)的參數(shù)中
          int* m = &a; //出錯,常量只能用常指針
          int c= 1;const int*pc = &c;//常指針可指向常量

          const int* pa = &a; //指針指向的內(nèi)容為常量(就是b的值不變)
          int const *a = &b; //指針指向的內(nèi)容為常量(就是b的值不變)*p=3//error
          int* const a = &b; //指針為常量,不能更改指針了如 a++但可以改值*p=3;

          從這可以看出const放在*左側(cè)修飾的是指針的內(nèi)容,const放在*右側(cè)修飾的是指針
          本身.

          const引用的用法和指針一樣
          int const & a=b; 和指針一樣
          const int& a=b; 和指針一樣
          但沒有 int& const a=b 的用法因為引用不能做移位運算,但只是出個warning

          const int* const a = &b; //綜合應(yīng)用,一般用來傳遞多維的數(shù)組
          類如:char* init[] = {"Paris","in the","Spring"};
          void fun(const int* const a){}
          fun(init)//保護參數(shù)不被修改

          int A(int)const; //是常函數(shù),只能用在類中,調(diào)用它的對象不能改改變成員值
          const int A(); //返回的是常量,所以必須這么調(diào)用 cosnt int a=A();
          int A(const int); //參數(shù)不能改值,可用在任意函數(shù)
          int A(const int*);
          ....
          int height() const;//常函數(shù)只能由常函數(shù)調(diào)用
          int max(int,int) const;
          int Max = max(height(),height());

          const int* pHeap = new int;
          delete pHeap;
          p = NULL;//出錯
          我的解決辦法是強制類型轉(zhuǎn)換
          const int* pHeap = new int(1);
          delete (int*)pHeap;
          pHeap = NULL;

          一、const 和引用聯(lián)合使用的時候要注意

          const int a = 1;
          const int& ref1 = a;
          const int& ref2 = 1;

          ref1 和 ref2 都是正確的,但是他們引用的內(nèi)容和一般的引用不同
          對 const int& ref1 = a; 而言,其實這個 ref1 已經(jīng)和 a 沒有任何關(guān)系了
          ref1 實際上是對一個臨時量的引用。同理 const int& ref2 = 1; 也是對
          一個臨時量做的引用。當(dāng)引用臨時量是 C++ 的隱式類型轉(zhuǎn)換可以起作用。
          臨時量的生存期和引用量的生存期相同。

          二、強傳const對象可能導(dǎo)致無定義行為

          對于優(yōu)化做的比較好的編譯器,代碼 const int i = 1;
          當(dāng)后面用到變量 i 的時候,編譯器會優(yōu)化掉對 i 的存取,而直接使用立即數(shù) 1

          const int i = 1;

          *(const_cast<int*>(&i)) = 2;
          cout << *(int*)&i << endl;
          cout << i << endl;

          所以,對 const 對象做 const_cast 可能導(dǎo)致無定義行為
          目前我就遇到這些問題,那位還有補充的嗎





          能不能把自己的經(jīng)驗也談?wù)劇4蠹医涣鹘涣?
          這個就是我在調(diào)錯時發(fā)現(xiàn)的
          int height() const;//常函數(shù)只能由常函數(shù)調(diào)用
          int max(int,int) const;
          int Max = max(height(),height());





          Thinking again in C++(一)常量性原理 cphj(原作)
          有些地方很受啟發(fā)


          1.不能將const修飾的任何對象、引用和指針作為賦值表達(dá)式的左值。
          const int cx=100;
          const int & rcx=cx;
          const int * pcx=&cx;
          cx=200; //error
          rcx=200; //error
          *pcx=200; //error

          2.const類型的對象不能直接被non-const類型的別名所引用。
          (1)不能將const類型的對象傳遞給non-const類型的引用。
          const int cx=100;
          int & rx=cx; //error
          (2)不能將const類型的實參傳遞給形參為non-const類型引用的函數(shù)。
          void f(int a)
          {
          }
          void g(int & ra)
          {
          }
          const int cx=100;
          f(cx); //ok
          g(cx); //error
          (3)不能將const類型的對象作為non-const類型引用的函數(shù)返回值。
          int & f(const int & rca)
          {
          return rca; //error
          }
          int x=100;
          f(x);

          3.可以使用const類型別名引用non-const對象。此時通過const引用不能修改對象,但對象可以通過non-const引用被修改。
          int x=100;
          int & rx=x;
          const int & rcx=x; //ok
          x=200;
          rx=200;
          rcx=200; //error

          4.指針的屬性有兩個:指針的類型和指針本身的常量性。其中,指向const對象與指向non-const對象,是不同的指針類型。
          int x=100;
          const int * pcx=&x; //[1]
          int * px=&x; //[2]
          int y=100;
          int * const cpy=&y; //[3]
          int * py=&y; //[4]
          [1][2]兩個指針的類型不同;[3][4]兩個指針的常量性不同。
          對象與指向?qū)ο蟮闹羔樀囊?guī)則類似于對象與引用。即,const類型的對象不能直接被non-const類型的指針?biāo)甘荆ㄍ?);可以使用const類型的指針指向non-const對象(同3)。

          5.可以將相同類型(包括常量性)的const指針值賦給non-const指針。
          int x=100;
          int * px;
          const int * pcx=&x;
          px=pcx; //error
          int * const cpx=&x;
          px=cpx; //ok

          6.若函數(shù)的返回值為內(nèi)建類型或是指針,則該返回值自動成為const性質(zhì)。但自定義類型則為non-const性質(zhì)。
          int f() //相當(dāng)于返回const int
          {
          return 100;
          }
          int * g(int & ra) //相當(dāng)于返回int * const
          {
          return &ra;
          }
          class CTest
          {
          int n;
          public:
          CTest(int n){this->n=n;}
          };
          CTest h() //返回的就是CTest
          {
          return CTest(200);
          }

          f()=200; //error

          int x=100;
          int y=200;
          int * px=&x;
          g(y)=px; //error
          *g(y)=x; //ok,從這點可以看出g()返回的不是const int *

          CTest t(100);
          h()=t; //ok,但卻是完全錯誤的、危險的做法
          //所以h()的正確寫法是返回const CTest





          const int b=100; b的內(nèi)容不變,b只能是100
          int const b=100; b必須為int型,不能為其他類型?
          這2句話的意思應(yīng)該是一樣的吧 , THINKING IN C++是這樣說的





          const int a=100; a的內(nèi)容不變,a只能是100(同樣不能類型轉(zhuǎn)換)。
          int const b=100; b必須為int型,不能為其他類型?(同樣在使用中不能修改)。
          所以a和b是一樣的,稱為整型常數(shù),在使用中不能被修改,當(dāng)然都不能轉(zhuǎn)為其他類型了。
          #include <iostream>

          using namespace std;

          int main()
          {
            const int a = 100;
            int const b = 100;

            a = 100; //這四條語句編譯時都會出現(xiàn)“Cannot modify a const object
          b = 100; //in function main()”的錯誤提示,也就是說,任何企圖修改   a = 100.0; //a和b(其實是一樣的)的行為都會出現(xiàn)“災(zāi)難”,在語法上講就  b = 100.0; //是a和b都不能出現(xiàn)在賦值語句的左邊!

            cout<<'\n'<<a<<'\n'<<b<<endl;

            return 0;
          }





          常函數(shù)的調(diào)用是這樣的:常量對象只能調(diào)用常成員函數(shù),非常量對象即可以調(diào)常成員函數(shù),也可以調(diào)一般成員函數(shù),但當(dāng)某個函數(shù)有const和非const兩個版本時,const對象調(diào)const版本,非const對象調(diào)非const版本
          例:
          class A
          {
          public:
          int & GetData(){return data;}
          const int & GetData()const {return data;}
          private:
          int data;
          }
          A a;
          a.GetData();//調(diào)用int & GetData(){return data;}
          //但如果沒有這個函數(shù),也可以調(diào)用const int & GetData()const
          const A const_a;
          const_a.GetData();//調(diào)用const int & GetData()const {return data;}
          常函數(shù)只能調(diào)常函數(shù),也是由于這個原因





          算你狠!加兩點

          一、const 和引用聯(lián)合使用的時候要注意

          const int a = 1;
          const int& ref1 = a;
          const int& ref2 = 1;

          ref1 和 ref2 都是正確的,但是他們引用的內(nèi)容和一般的引用不同
          對 const int& ref1 = a; 而言,其實這個 ref1 已經(jīng)和 a 沒有任何關(guān)系了
          ref1 實際上是對一個臨時量的引用。同理 const int& ref2 = 1; 也是對
          一個臨時量做的引用。當(dāng)引用臨時量是 C++ 的隱式類型轉(zhuǎn)換可以起作用。
          臨時量的生存期和引用量的生存期相同。

          二、強傳const對象可能導(dǎo)致無定義行為

          對于優(yōu)化做的比較好的編譯器,代碼 const int i = 1;
          當(dāng)后面用到變量 i 的時候,編譯器會優(yōu)化掉對 i 的存取,而直接使用立即數(shù) 1

          const int i = 1;

          *(const_cast<int*>(&i)) = 2;
          cout << *(int*)&i << endl;
          cout << i << endl;

          所以,對 const 對象做 const_cast 可能導(dǎo)致無定義行為





          #include <iostream.h>
          void fun(char b){cout <<"void"<<endl;}
          int fun(int const b){cout <<"int"<<endl;}
          int main()
          {
          fun(1.0);//詳細(xì)看看重載函數(shù)吧
          fun(4); //想一想調(diào)用哪一個

          return 0;
          }
          我試了一下,會出錯? vc說:'fun':ambiguous call to overloaded function





          補充的好啊,這個一般不會注意的
          const int i = 1;
          *(const_cast<int*>(&i)) = 2;
          cout << *(int*)&i << endl;
          cout << i << endl;
          這個可真有意思,調(diào)試時兩個都是2,可編譯就是2,1了
          const的永遠(yuǎn)都是const,這樣能更改就不錯了,不然就自相矛盾了
          奇怪的是 pi 和 &i地址一樣啊,就像樓上說的這是編譯時的優(yōu)化
          處理
          const int i = 1;
          int* pi=const_cast<int*>(&i);
          *pi=2;
          cout << *pi << endl;
          cout << i << endl;





          那個主要是隱式轉(zhuǎn)換
          你可依次把兩個函數(shù)注掉看看調(diào)用
          #include <iostream.h>
          //void fun(char b){cout <<"void"<<endl;}
          void fun(int b){cout <<"int"<<endl;}
          int main()
          {
          fun('a');
          fun(4);
          return 0;
          }


            回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 化州市| 丰县| 西林县| 申扎县| 陆河县| 阿勒泰市| 刚察县| 卢龙县| 仁化县| 陇南市| 讷河市| 勐海县| 疏勒县| 焦作市| 昌邑市| 辽源市| 翼城县| 浮山县| 秭归县| 林芝县| 涪陵区| 泗阳县| 潮州市| 芦山县| 东安县| 剑川县| 新巴尔虎左旗| 新源县| 大方县| 新余市| 西贡区| 绥化市| 微博| 宜阳县| 满城县| 鹿邑县| 洱源县| 肃宁县| 舒城县| 永善县| 鲁甸县|