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

C++之父力作學習筆記(4)——類的好多事

      類,這個概念比較大。包含的事太多。咱們就一一的盡量弄清楚它。
      一個類就是一個用戶定義類型。C++里類概念的目標就是為程序員提供一種建立新類型的工具,是這些新類型的使用能夠像內部一樣方便。
      訪問控制:class成員的默認訪問方式是私有的。一個struct也是一個class,但是其成員的默認方式是公用的。非成員函數禁止訪問私有成員。
      構造函數:就是函數名和類名一樣的函數且沒有返回值。這誰都知道。It's easy。而默認構造函數就是調用時不必提供參數的構造函數。如果用戶自己聲明了一個默認構造函數,那么就會去使用它;否則,如果有必要,而且用戶沒有聲明其他的構造函數,編譯器就會設法去生成一個。編譯器生成的默認構造函數將隱式地為類類型的成員和它的基類調用有關的默認構造函數。這里解釋一下:類類型(Class type)即指那些由程序員定義的類而產生的類型,以便與內部類型和其他用戶定義類型相區分。相信大家這里也沒什么問題。有一個注意點來了,由于const和引用必須進行初始化,包含const或引用成員的類就不能進行默認構造,除非程序員的我們自己顯示的提供默認構造函數。例如:
struct X
{
    
const int a;
    
const int& r;
}
;
X x;
//錯誤;X無默認構造函數
      默認構造函數也可以顯示調用。內部類型同樣也有默認構造函數。
      下面再談談復制構造函數,先看看復制構造函數是怎么引進來的。
按照默認約定,類對象可以復制。特別是可以用一個類的對象和復制對該類的其他對象進行初始化。即使是聲明了構造函數的地方,也是可以這樣做:
Date d=today;//通過復制初始化
按照默認方式,類對象的復制就是其中各個成員的復制。如果某個類X所需要的不是這種默認方式,那么就可以定義一個復制構造函數X::X(const X&),由它提供所需要的行為。還有一個概念就是復制賦值,很容易和復制構造函數搞混。咱們就一起搞清楚它們。先看一段程序:
void h()
{
    Table t1;
    Table t2
=t1;//復制初始化
    Table t3;
    t3
=t2;      //復制賦值
}
看似好像沒什么問題,對于復制上面提到的解釋方式,在應用到具有指針成員的類的對象時,就可能產生一種出人意料的作用。對于包含了由構造函數/析構函數管理的資源的對象而言,按成員復制的語義通常是不正確的。在這里,Table的默認構造函數為t1和t3各調用了一次,一共是兩次。然而Table的析構函數則被調用了三次;對t1、t2和t3各一次!由于賦值的默認解釋是按成員賦值,所以在h()結束時,t1、t2和t3中將各包含一個指針,它們都指向建立t1時從自由存儲中分配的那個名字數組。在建立t3時所分配的數組的指針并沒有保留下來,因為它被賦值t3=t2覆蓋掉了。這樣,如果沒有自動廢料收集,對這個程序而言,該數組的存儲就將永遠丟掉了。而在另一方面,為t1的創建而分配的數組因為同時出現在t1、t2和t3里,將被刪除3次。這種情況所導致的結果是無定義,很可能是災難性的。這類反常情況可以避免,方式就是將Table復制的意義定義清楚:
class Table
{
    
//---
    Table(const Table&);//復制構造函數
    Table& operator=(const Table&);//復制賦值
}
;
咱們自己可以為這些復制操作定義自己認為最合適的任何意義,例如
//這里補上Table類的詳細定義
class Table
{
    Name
* p;
    size_t sz;
public:
    Table(size_t s
=15)
    
{
        p
=new Name[sz=s];
    }

    
~Table()
    

        delete[] p;
    }

    Name
* loopup(const char*);
    
bool insert(Name*);
}


Table::Table(
const Table& t)//復制構造函數
{
   p
=new Name[z=t.sz];
   
for(int i=0;i<sz;i++)
      p[i]
=t.p[i];
}


Table
& Table::operator=(const Table& t)//賦值
{
    
if(this!=&t)//當心自賦值:t=t
    
{
        delete[] p;
        p
=new Name[sz=t.sz];
        
for(int i=0;i<sz;i++)
            p[i]
=t.p[i];
    }

    
return *this;
}
情況幾乎總是如此,復制構造函數與復制賦值通常都很不一樣。究其根本原因,復制構造函數是去完成對為初始化的存儲區的初始化,而復制賦值運算符則必須正確處理一個結構良好的對象。
      成員常量:
      對那些靜態整型成員,可以給它的成員聲明加上一個常量表達式作為初始式,例如
class Curious
{
    
static const int c1=7;//ok,但要記得去定義
    static int c2=11;//錯誤:非const
    const int c3;//錯誤:非Static
    static const int c4=f(1);//錯誤:在類里的初始表達式不是常量
    static const float c5=7.0;//錯誤:在類里初始化的不是整型
}
1)在類中不能用const來創建常量!因為:類只是描述了對象的形式,并沒有真正創建對象!所以, 在對象建立之前,并沒有存值空間!
2)而const是用來創建常量的!
方法1 你可以用枚舉:
class a
{
enum{buf_size_t buf_size=、、、}//用枚舉創建一個常量,但不是數據成員

}

方法2 你可以用static
class a
{
private
  
static const buf_size_t buf_size=30//該常量將與憋得靜態常量存儲在一起,而不是存儲在對象中
}
但《C++程序設計語言》書上說當你用到某個被初始化的成員,而且需要將它作為對象存入存儲器時,這個成員就必須在某處有定義。初始式不必重復寫:
const int Curious::c1;//必須,但這里不必重復初始式
const int* p=&Cusious::c1;//ok:Curious::c1已經有定義
這里有點讓我懵了,為什么還要const int Curious::c1;//必須,但這里不必重復初始式 這一行呢?還說是必須,經過測試是有問題的——當前范圍內的定義或重新聲明非法,到底是書錯了還是還有其他什么原因?
還請高手不吝賜教
今天就到這里吧,到這里就出了問題,還需要思考。

這里有一篇博文關于
VC6.0中,整型const static成員不能在類的定義體中初始化. http://blog.csdn.net/yiruirui0507/article/details/5984530




posted on 2011-08-05 17:00 Daywei 閱讀(2228) 評論(0)  編輯 收藏 引用 所屬分類: C++之父力作學習筆記

<2011年8月>
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導航

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

牛人博客

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产高清一区二区| 久久久国产一区二区| 黄色成人免费网站| 欧美国产1区2区| 欧美日韩国产专区| 久久不射网站| 久色婷婷小香蕉久久| 狼狼综合久久久久综合网| 亚洲国产成人av在线| 亚洲激情网址| 欧美日韩亚洲一区二区三区| 亚洲一区欧美| 久久精品综合网| 在线一区亚洲| 欧美影院在线播放| 亚洲美女av在线播放| 亚洲视频免费看| 亚洲高清三级视频| 中文国产成人精品久久一| 国产亚洲精品久| 亚洲精品久久久久久下一站| 国产视频不卡| 91久久精品www人人做人人爽| 国产精品每日更新在线播放网址| 久久亚洲影音av资源网| 欧美久久久久久久久| 久久精品国产99精品国产亚洲性色| 久久久久国产精品一区| 亚洲一级在线观看| 久热国产精品视频| 久久久久国色av免费观看性色| 欧美精品一区二区视频| 麻豆成人在线观看| 国产老肥熟一区二区三区| 亚洲大片av| 激情亚洲一区二区三区四区| 亚洲一区二区三区在线观看视频| 亚洲美女黄色| 久久午夜电影| 久久米奇亚洲| 国产亚洲女人久久久久毛片| 亚洲深夜福利网站| 一区二区三区日韩精品| 米奇777超碰欧美日韩亚洲| 久久福利资源站| 国产精品久久久久久影院8一贰佰| 亚洲国产成人精品视频| 在线精品亚洲| 久久久水蜜桃| 久久久久久久久久久成人| 国产精品久久九九| 99精品欧美一区| 夜夜嗨av色综合久久久综合网| 久久亚洲图片| 欧美国产亚洲另类动漫| 永久免费毛片在线播放不卡| 久久国产精品久久久久久| 小黄鸭精品密入口导航| 国产精品成人一区二区三区夜夜夜 | 亚洲国产综合91精品麻豆| 久久国产乱子精品免费女| 欧美与欧洲交xxxx免费观看 | 久久丁香综合五月国产三级网站| 羞羞漫画18久久大片| 国产精品久久一级| 亚洲午夜在线观看视频在线| 午夜精品久久久久久久99黑人| 国产精品久久午夜夜伦鲁鲁| 亚洲一级在线| 久久精品国语| 欧美日韩国产一区| 亚洲视频在线免费观看| 香蕉久久一区二区不卡无毒影院| 国产精品免费在线| 先锋影音久久| 欧美国产激情二区三区| 99re视频这里只有精品| 国产精品jvid在线观看蜜臀| 亚洲性xxxx| 久久蜜桃精品| 亚洲经典视频在线观看| 欧美激情女人20p| 一本色道久久88综合亚洲精品ⅰ| 亚洲一区二区三区四区在线观看| 国产精品二区在线| 欧美中文日韩| 亚洲高清网站| 亚洲欧美日韩国产中文在线| 国产一区二区在线免费观看| 美女黄色成人网| 一区二区三区不卡视频在线观看| 欧美一级午夜免费电影| 亚洲电影观看| 国产精品久久综合| 六月丁香综合| 亚洲综合日韩| 亚洲欧洲一区二区三区久久| 欧美一区综合| 一区二区三欧美| 影音先锋日韩精品| 国产精品久久一卡二卡| 美女脱光内衣内裤视频久久影院| 国产精品99久久久久久人| 欧美成人精品| 欧美专区在线| 亚洲视频欧美视频| 亚洲国产精品免费| 国产日韩精品一区观看| 欧美日韩高清不卡| 久久女同精品一区二区| 亚洲性视频网站| 亚洲美女网站| 亚洲激情网站| 欧美激情精品久久久六区热门| 欧美在线观看日本一区| 洋洋av久久久久久久一区| 亚洲国产精品va在看黑人| 国产欧美日韩另类视频免费观看| 欧美精品在线一区二区| 老司机久久99久久精品播放免费| 亚洲综合视频一区| 一本一本久久a久久精品综合麻豆| 免费亚洲电影| 久久先锋影音av| 欧美在线www| 欧美一级理论片| 午夜精品99久久免费| 宅男噜噜噜66一区二区| 9i看片成人免费高清| 亚洲精品美女在线观看播放| 在线观看日韩av电影| 黑人巨大精品欧美一区二区| 国产亚洲二区| 国产日韩欧美亚洲| 国产亚洲va综合人人澡精品| 国产日本欧美一区二区三区| 国产欧美一区二区三区视频| 国产伦精品一区二区| 国产精品高潮呻吟久久| 欧美日韩一区二区国产| 欧美精品一区二区高清在线观看| 欧美国产三区| 欧美日韩网址| 国产精品久久久久9999吃药| 国产精品久久毛片a| 国产精品稀缺呦系列在线| 国产欧美一区二区白浆黑人| 欧美成人精品不卡视频在线观看| 亚洲天堂久久| 国产三区精品| 亚洲欧美视频在线观看| 国产精品99久久久久久久vr | 久热精品视频在线观看| 国产精品美女久久久久久免费| 亚洲夫妻自拍| 亚洲片区在线| 欧美插天视频在线播放| 亚洲久色影视| 久久精品国产999大香线蕉| 国产伦精品免费视频| 欧美一区二区三区四区高清 | 欧美午夜视频在线观看| 一本久道久久综合狠狠爱| 亚洲男人的天堂在线| 国色天香一区二区| 欧美电影免费网站| 亚洲欧美日韩一区二区三区在线观看| 欧美在线一区二区三区| 亚洲精品中文字幕有码专区| 国产精品豆花视频| 欧美乱大交xxxxx| 你懂的网址国产 欧美| 国产精品区一区| 欧美视频导航| 久久精品国产久精国产一老狼 | 在线观看视频免费一区二区三区 | 欧美在线一区二区三区| 国产精品久久久久久影视 | 欧美激情1区2区3区| 亚洲一区二区动漫| 亚洲国内欧美| 欧美成人伊人久久综合网| 国产精品99久久久久久宅男 | 欧美日韩国内| 麻豆91精品| 久久久国产成人精品| 性色av一区二区三区| 午夜日韩视频| 久久久91精品国产| 性做久久久久久久久| 欧美伊人久久久久久久久影院| 一区二区久久| 久久国产精品久久久久久| 亚洲一区在线播放| 久久久久在线| 农村妇女精品| 国产精品揄拍一区二区| 国产欧美日韩综合| 亚洲第一在线视频|