青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 55  文章 - 15  trackbacks - 0
<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿

隨筆分類

隨筆檔案

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

1. 取代#define 進行值替代
2. 修飾指針
3. 修飾參數和返回值
4. 修飾類和類成員變量及類成員函數


一、值替代
      #define只在預處理器進行值替代,并且沒有類型標識,出現錯誤很難排查。const 提供類型信息,在編譯期可以進行類型檢查。編譯器在編譯時可以通過必要的運算把一個復雜的常量表達式簡化,稱為常量折疊。
       我理解的常量折疊是:編譯器會把這個常量放到一個符號表中,比如說const int i = 1;符號表中有一個符號i,同時對應了一個數值1,此時是不分配內存空間的。如果你強行分配內存空間的話也可以。
const int i = 1;
int* ip = const_cast<int*>(&i);
*ip = 2;
cout <<"i = "<<i ;
cout <<"*ip = "<< *ip;
cout <<"*(&i) = "<<*(&i) ;
// i = 1; 
//*ip = 2;
// 
*(&i) = 1;
不論你怎么通過內存修改i,看起來i有兩個值,1和2,這貌似就是常量折疊。
內部鏈接問題
  C++中的const是內部鏈接,即const僅在被定義過的文件中才是可見的,鏈接時不能被其他編譯單元看到。在定義時,必須賦一個初值,不然必須用extern顯式地聲明。
通常,編譯器是不為const創建存儲空間的,相反把這個定義保存在它的符號表中。但是extern強制執行了存儲空間的分配,因為extern表示使用外部鏈接,也就是有幾個不同的編譯單元可以引用它,所以必須有存儲空間。(這句話我的理解是:每個編譯單元都有自己的符號表,其他編譯單元是不能看到其他編譯單元符號表中的東西的。其他編譯單元如果要引用一個外部變量,該變量必須是在內存中,可以讀取的。所以一定要分配空間。外部鏈接一般是找到相應名字的內存地址,比如鏈接一個外部函數,就是找到這個函數的內存地址)
  通常沒有extern的時候,不會分配存儲空間。但是有些結構比較復雜的const,編譯器還是會分配空間。因為.h文件中一般放置的都是不分配空間的代碼,所以cosnt變量默認為內部鏈接。不然鏈接程序在多個目標文件中看到相同的定義就會”抱怨“。

用常量表達式定義數組大小
  定義數組的大小的時候,必須是常量表達式,不能為變量,至于為什么。不太清楚,只是編譯器在編譯的時候給出錯誤:期望一個常量表達式,不能分配一個長度是0的數組,變量是長度未知的。(我的理解是,因為變量是變的,如果靜態地聲明了一個數組a[b]因為b確定,定義的時候b是1,在之后又被修改為2,那數組a長度到底應該是1呢還是2呢?)
  常量表達式:
  const int i = 100;// constant
      const int j = 100 + i;// constant express
      long addr = (long)&j;// forces storage
     char buf[j + 10];//right
     const可以應用于集合,但是編譯器不會把一個集合保存到符號表中,所以必須分配內存。這種情況下,const意味著‘不能改變的一塊內存’,編譯器不需要知道里面存儲的內容。如果這樣理解的話,那么編譯器在看到int b = 1;這句話的時候,也會想”這是一個int型的變量,我給他分配2個字節就行了,里面是什么,或許要到運行的時候再說了“,所以a[b]的長度就是未知長度了。

二、const 指針和指向const的指針
  int* u, v;== int*u; int v;
      因為c++對類型檢查非常精細,所以,你可以把一個非const指針賦給const指針,但是不能把一個const指針賦給非cosnt指針。同樣也不能把指向const的指針賦給指向非const的指針
int d = 1;
const int e = 2;
int* u = &d;//right;
int* v = &e;//wrong
int* w = const_cast<int*>(&e);//right
int* y = (int*)&e;//right


考慮下面一句代碼:
char* cp = "howdy";
”howdy"是存放在字符常量區的,它是個常量,這個表達式返回的是一個const char*,但是在某些編譯器中是可以通過編譯的。但最好寫成const char* cp = "howdy";修改該字符串數組是錯誤的。如果想修改它就把它放到一個數組中char cp[] = "howdy";為什么呢?
char cp[] = "abcd";
cp[1] = '2';
cout <<cp << endl;
// legall 

char *cp = "abcd";
cp[1] = '2';
cout << cp << endl;//cause runtime error

第一種情況:"abcd"是放在字符常量區的,但是數組是放在棧上的,現在棧上有5個字節的數組,分別存放了'a','b','c','d''/0',所以你修改它沒問題。第二種:"abcd"是放在字符常量區的,cp只是一個指針,指向了這串字符串,想修改它是錯誤地。

臨時量
  他們也需要存儲空間,并且可以構造和銷毀,但是,我們看不到它們,并且自動地成為常量。一旦計算結束,臨時變量也會不復存在,所以對臨時變量所做的任何操作都會丟失。
傳遞指針和引用的時候一般都用const修飾。
值拷貝:
int i = 1;
intconst ip = &i;
int* ip2 = ip;//right;because you can't modify ip by ip2

const int j = 2;
int k = j;//right;// you can't modify j by k;

const int m = 1;
int* mp = &m;//wrong, you can modify m by mp, but m is a constant

類中的const
非static變量在構造函數的初始化列表里定義
static const 在定義的地方初始化,enum可以實現static const作用
class A
{
  enum {size = 100};
int i[size];
};//equal to static const int size = 100;

const對象
const A a(1); 必須保證對象的數據成員在其聲明周期中不被改變。如何保證?用const成員函數,明確表示不改變成員數據。聲明的時候要用const 定義時也要用const,不然會被看作兩個函數。
class X
{
int i;
public:
int f() const;
};

int X::f() const 
{
 return i;
}

按位const和按邏輯const
按位是指這塊內存中的每個字節都是不能改變的。
按邏輯是指,可以在某個成員函數中修改成員變量。兩種方法:

class X
{
  int i;
public:
  void f() const;
}

void X::f() const
{
  (const_cast<X*>(this))->i++;//right
}

void X::f(const X* this)
{
   this->i++;//illegal
  (const_cast<X*>(this))->i++;//right
}

//////////another method//////////
class X
{
  mutable int i;
public:
  void f() const;
}

void X::f() const
{
  i++;//right
}
posted on 2012-05-30 16:12 Dino-Tech 閱讀(170) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久欧美肥婆一二区| 国产一区在线播放| 日韩视频在线永久播放| 先锋资源久久| 99精品视频免费观看视频| 亚洲电影视频在线| 国产美女在线精品免费观看| 欧美福利在线| 久久久亚洲午夜电影| 欧美在线观看网站| 欧美成人性生活| 欧美肥婆在线| 欧美激情第9页| 亚洲国产高清在线观看视频| 久久香蕉精品| 亚洲女同精品视频| 久久久久九九九| 在线中文字幕一区| 一本色道久久综合狠狠躁篇怎么玩 | 性久久久久久久久久久久| 亚洲精品资源| 久久精品亚洲热| 欧美激情偷拍| 久久国产精品久久久久久久久久| 国产视频一区在线观看| 久久精品国产一区二区电影| 99精品国产一区二区青青牛奶| 小嫩嫩精品导航| 久久久久久亚洲精品杨幂换脸| 9久草视频在线视频精品| 美日韩精品免费| 国产一区二区三区直播精品电影| 国产精品一区二区女厕厕| 久久先锋资源| 亚洲视频1区| 一本大道久久a久久精品综合| 亚洲精选国产| 香港久久久电影| 免费黄网站欧美| 亚洲小视频在线| 亚洲欧洲偷拍精品| 亚洲欧洲av一区二区| 亚洲曰本av电影| 亚洲精品一区中文| 久久久精品一区二区三区| 国产精品一区一区| 亚洲激情专区| 亚洲一区二区精品在线观看| 国产精品久久网| 亚洲精品在线视频观看| 久久夜色精品国产欧美乱极品 | 国产精品永久免费| 91久久精品一区二区三区| 一本色道久久88综合亚洲精品ⅰ| 国产午夜一区二区三区| 亚洲欧洲日产国产网站| 久久精品二区三区| 午夜精品999| 在线视频精品一区| 中国日韩欧美久久久久久久久| 欧美一区二视频在线免费观看| 欧美日韩三区| 亚洲午夜激情网站| 99国产精品国产精品久久| 欧美国产高清| 国产精品九九久久久久久久| 麻豆精品在线视频| 亚洲自拍高清| 久久精品国产欧美激情| 一片黄亚洲嫩模| 欧美国产先锋| 欧美日韩高清在线一区| 18成人免费观看视频| 亚洲欧美日韩视频一区| 久久久不卡网国产精品一区| 亚洲视频一区| 麻豆精品在线视频| 亚洲国产成人精品视频| 国产精品久久久久高潮| 亚洲一级电影| 亚洲毛片一区| 免费在线成人av| 亚洲午夜激情免费视频| 99精品国产热久久91蜜凸| 久久久久久欧美| 尤物网精品视频| 欧美亚洲一区| 亚洲欧美在线另类| 亚洲私人影院| 久久精品视频在线| 亚洲人在线视频| 国产亚洲精久久久久久| 亚洲第一天堂av| 国产精品视区| 欧美午夜免费电影| 欧美α欧美αv大片| 榴莲视频成人在线观看| 欧美一级播放| 国产日韩欧美在线| 亚洲欧美另类在线观看| 精品91视频| 亚洲国产精品成人| 亚洲午夜一级| 久久综合影音| 在线性视频日韩欧美| 欧美在线日韩| 欧美日韩裸体免费视频| 欧美手机在线| 中国女人久久久| 久久国产手机看片| 蜜桃av一区| 国产在线视频欧美| 亚洲人成在线观看网站高清| 亚洲欧洲精品一区| 欧美成人精品h版在线观看| 久久精品成人一区二区三区 | 狠色狠色综合久久| 男人的天堂亚洲| 中文精品在线| 亚洲欧美国产制服动漫| 亚洲视频综合| 久久久久网站| 一区二区高清在线| 欧美三区不卡| 极品av少妇一区二区| 久久精品视频免费| 欧美好骚综合网| 国产一区二区三区丝袜| 欧美国产日韩一区二区三区| 9l国产精品久久久久麻豆| 久久久五月婷婷| 亚洲裸体视频| 免费在线观看成人av| 国产精品制服诱惑| 9人人澡人人爽人人精品| 亚洲美女精品一区| 老司机久久99久久精品播放免费 | 麻豆91精品| 性欧美videos另类喷潮| 欧美视频官网| 一区二区三区产品免费精品久久75| 99热在这里有精品免费| 欧美精品一区视频| 亚洲免费av片| 西西裸体人体做爰大胆久久久| 国产精品乱码| 亚洲免费高清视频| 欧美.www| 亚洲狼人综合| 麻豆精品视频| 亚洲国产精品999| 亚洲精品综合| 欧美午夜不卡在线观看免费 | 亚洲欧美在线高清| 欧美三级免费| 亚洲伊人网站| 久久久久久久久久久久久9999| 久久青草欧美一区二区三区| 新狼窝色av性久久久久久| 国产美女高潮久久白浆| 一区二区三区四区五区精品| 亚洲永久免费精品| 国产欧美精品xxxx另类| 久久久99国产精品免费| 亚洲电影免费观看高清完整版在线观看| 91久久国产精品91久久性色| 欧美日韩精品一二三区| 久久综合给合| 欧美伊人久久久久久久久影院| 这里只有精品视频| 亚洲精品一区二区三区在线观看| 激情久久综合| 国内精品视频在线观看| 国产婷婷精品| 国产午夜精品久久久| 国产欧美精品一区二区三区介绍| 国产精品理论片| 国产欧美日韩精品在线| 亚洲一区二区三区在线视频| 亚洲视频专区在线| 亚洲欧美激情诱惑| 午夜日韩激情| 欧美一区2区三区4区公司二百 | 欧美风情在线观看| 欧美1区视频| 欧美成人免费播放| 欧美国产一区二区在线观看| 欧美电影专区| 欧美精品一区二区高清在线观看| 欧美精品久久一区二区| 欧美日韩在线精品| 国产精品一二三四区| 免费成人av| 欧美成人三级在线| 欧美日韩国产va另类| 国产精品亚洲综合色区韩国| 国产亚洲一区二区三区在线播放| 黄色另类av| 亚洲午夜久久久久久久久电影院| 亚洲国产91|