<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    啪啪拉拉噼里啪啦

    初學者天堂資料匯集

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

    程序基本原理
    1.什么是計算機語言?
    計算機程序設計語言是計算機可以識別的語言,用于描述解決問題的方法,供計算機閱讀和執行。
    2.什么是指令?
    所謂指令,是計算機可以識別的命令。
    3.什么是面向對象?
    面向對象的編輯語言將客觀事務看作具有屬性和行為(或稱為服務)的對象,通過抽象找出同一類的共同屬性(靜態特征)和行為(動態特征),形成類。對象也就是一組屬性和一組行為的構成
    4.是么是面向對象的方法?
    首先將數據和對數據的操作方法放在一起,作為一個相互依存,不可分離的整體--對象。對同類型的對象抽象出其共性,形成類。類中大多數數據,智能用本類方法進行處理。類通過一個簡單的外部接口與外界發生關系。對象與對象之間通過消息進行通訊。
    5.什么是類》
     具有相同屬性和服務一組對象的集合
    6.面向對象的軟件開發
    面向對象的分析(OOA) 面向對象設計(OOD) 面向對象編程(OOP) 面向對象測試(OOT) 面向對象的軟件維護(OOSM)
    7.程序類型
     翻譯程序有三種不同的類型
    匯編程序  編譯程序 解釋程序

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


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

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

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

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

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

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

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

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

    計算
    C=i++; 現把i值賦給C
    B=++i; 現使i +1 之后賦值給B

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

    逗號表達式
    int a;
    a=3*5,a*4  //最終結果是60;

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

    sizeof(類型名)
    或者sizeof(表達式)
    計算某種類型的對象在內存所占的字節數


    數據的輸入和輸出

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

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


    算法基本結構

    順序  選擇 循環

    1.用IF語句實現選擇結構
    if(表達式) 語句1
    else 語句2

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


    if(表達式)  語句  例如  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;}

    多重選擇結構
    if(表達式1)
      if(表達式2)  語句1
    esle 語句2
    else
       if(表達式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(表達式) 語句1
    else if (2)   語句2
    esle if(3) 語句3
    esle   語句N;


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

      case  常量表達式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;

    }

    }


    循環結構

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

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

    輸入一個整數,將各位數字翻轉后輸出。。。

    #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可以解決所有循環問題


    求出一個數的所有因子
    #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};
    對枚舉類型按照常量處理,但不能賦初值
    枚舉類型具有默認值 依次分別為0,1,2,3,4,…………等
    也可在聲明時另行指定枚舉元素的值 如
    enum weekday{sun=7,mon=1,………………};
    整數值不能直接賦予枚舉類型。若需將整數值賦給枚舉變量,應進行強制類型轉換
    枚舉可進行關系運算

    例如
    #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;                     }

    結構體變量
    struct  student
    { int num;
       char name[20];
       char sex;
    }
    student  student1;
    studen1.name="zhang san"

     

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

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

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

    評論

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

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

      const int n = 5;

      int a[n];

      答案與分析:

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

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

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

      問題:const變量 & const 限定的內容

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

      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不可變,當然pm是可變的,因此問題中p1++是對的。

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

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

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

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

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

      p[0]= 'I';

      答案與分析:

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

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

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

      答案與分析:

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

      問題:const & 指針

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

      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語言中一個很常見的困惑之處,在實際開發中,特別是在看別人代碼的時候,常常會因為這樣而不好判斷作者的意圖,下面講一下我的判斷原則:

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

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

      回復  更多評論
      

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

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

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

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

    二、#define的用法

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

    #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中有關于#define語句弊端的分析,以及好的替代方法,大家可參看。

    三、typedef與#define的區別

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

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

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

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

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

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

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

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

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



      回復  更多評論
      

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

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

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

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

      回復  更多評論
      

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

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

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

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

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

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

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

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

    一、const 和引用聯合使用的時候要注意

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

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

    二、強傳const對象可能導致無定義行為

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

    const int i = 1;

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

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





    能不能把自己的經驗也談談。大家交流交流
    這個就是我在調錯時發現的
    int height() const;//常函數只能由常函數調用
    int max(int,int) const;
    int Max = max(height(),height());





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


    1.不能將const修飾的任何對象、引用和指針作為賦值表達式的左值。
    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類型引用的函數。
    void f(int a)
    {
    }
    void g(int & ra)
    {
    }
    const int cx=100;
    f(cx); //ok
    g(cx); //error
    (3)不能將const類型的對象作為non-const類型引用的函數返回值。
    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]兩個指針的常量性不同。
    對象與指向對象的指針的規則類似于對象與引用。即,const類型的對象不能直接被non-const類型的指針所指示(同2);可以使用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.若函數的返回值為內建類型或是指針,則該返回值自動成為const性質。但自定義類型則為non-const性質。
    int f() //相當于返回const int
    {
    return 100;
    }
    int * g(int & ra) //相當于返回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的內容不變,b只能是100
    int const b=100; b必須為int型,不能為其他類型?
    這2句話的意思應該是一樣的吧 , THINKING IN C++是這樣說的





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

    using namespace std;

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

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

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

      return 0;
    }





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





    算你狠!加兩點

    一、const 和引用聯合使用的時候要注意

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

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

    二、強傳const對象可能導致無定義行為

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

    const int i = 1;

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

    所以,對 const 對象做 const_cast 可能導致無定義行為





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

    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;
    這個可真有意思,調試時兩個都是2,可編譯就是2,1了
    const的永遠都是const,這樣能更改就不錯了,不然就自相矛盾了
    奇怪的是 pi 和 &i地址一樣啊,就像樓上說的這是編譯時的優化
    處理
    const int i = 1;
    int* pi=const_cast<int*>(&i);
    *pi=2;
    cout << *pi << endl;
    cout << i << endl;





    那個主要是隱式轉換
    你可依次把兩個函數注掉看看調用
    #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;
    }


      回復  更多評論
      


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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲国产成人久久一区二区三区| 亚洲AV综合色区无码一区| 免费无码一区二区| 亚洲欧美日韩中文高清www777| 亚洲一区二区三区乱码A| 久久青草亚洲AV无码麻豆| 宅男666在线永久免费观看| 97av免费视频| 亚洲国产第一站精品蜜芽| 亚洲精品一级无码鲁丝片| 国产精品四虎在线观看免费| 亚洲AV成人无码网天堂| 亚洲欧美日韩国产成人| 亚洲伦理中文字幕| 亚洲精品天堂在线观看| 亚洲国产精品成人午夜在线观看| 亚洲欧洲国产成人精品| 青青草国产免费久久久下载| 成人黄软件网18免费下载成人黄18免费视频| 暖暖免费在线中文日本| 中日韩亚洲人成无码网站| 亚洲国产视频久久| 老司机午夜免费视频| 久久久精品视频免费观看| 黄 色一级 成 人网站免费| 久久免费高清视频| 女人张开腿给人桶免费视频| 四虎永久成人免费| 真人做A免费观看| 亚洲成?Ⅴ人在线观看无码| 久久精品亚洲中文字幕无码网站 | 91福利免费体验区观看区| 天天拍拍天天爽免费视频| 亚洲色成人WWW永久网站| 午夜免费福利在线| 亚洲AV无码专区亚洲AV伊甸园 | 性做久久久久免费看| 666精品国产精品亚洲| 亚洲欧洲国产精品你懂的| 亚洲Av永久无码精品黑人| 无码国产精品一区二区免费3p |