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

Benjamin

靜以修身,儉以養(yǎng)德,非澹薄無以明志,非寧靜無以致遠(yuǎn)。
隨筆 - 398, 文章 - 0, 評論 - 196, 引用 - 0
數(shù)據(jù)加載中……

C++基本概念之構(gòu)造函數(shù)(constructor)(一)

1.功能:創(chuàng)建(build objects)對象,將一連串的隨意的內(nèi)存位變對象,也分配資源(memory, files, semaphores, sockets等),"ctor" 是構(gòu)造函數(shù)(constructor)典型的縮寫。
2.假定List是個類名,List x和 List x()的區(qū)別:前者聲明了一個List對象,后者則是一個函數(shù),返回List類型。
3.能否在一個構(gòu)造函數(shù)中調(diào)用另一個構(gòu)造函數(shù)?答案是否定的。
假設(shè)類Fro有兩個構(gòu)造函數(shù)Foo::Foo(char x)和Foo::Foo(char x,int y),那么下面的代碼
class Foo {
 public:
   Foo(char x);
   Foo(char x, int y);
   ...
 };
 
 Foo::Foo(char x)
 {
   
...
   Foo(x, 0);  
// this line does NOT help initialize the this object!!to initialize a temporary(臨時量)local object (not this), it immediately destructs  that temporary when control flows over,   
   
...
 }
也可以組合這兩個構(gòu)造函數(shù),通過默認(rèn)參數(shù)
class Foo {
 public:
   Foo(char x, int y=0);  // this line combines the two constructors
   
...
 };
如果沒有默認(rèn)參數(shù)可用,那么我可以共享公用代碼在私有的Init函數(shù)中,如:
class Foo {
 public:
   Foo(char x);
   Foo(char x, int y);
   ...
 private:
   void init(char x, int y);
 };
 
 Foo::Foo(char x)
 {
   init(x, int(x) + 7);
   
...
 }
 
 Foo::Foo(char x, int y)
 {
   init(x, y);
   
...
 }
 
 void Foo::init(char x, int y)
 {
   
...
 }

不要嘗試把它用在布局new(placemement new)中,有些人認(rèn)為可以new(this) Foo(x, int(x)+7)在Foo::Foo(char)中,這是絕對錯誤的。它會影響對象的構(gòu)建位(constructed bits)。
4.默認(rèn)構(gòu)造函數(shù)(default constructor )的參數(shù)可以使沒有,也可以使默認(rèn)的參數(shù)。如:
class Fred {
 public:
   Fred();   // Default constructor: can be called with no args
   
...
 }; 或
class Fred {
 public:
   Fred(int i=3, int j=5);   // Default constructor: can be called with no args
   
...
 };
5.建立對象數(shù)組時,哪個構(gòu)造函數(shù)將被調(diào)用:
如果沒有默認(rèn)構(gòu)造函數(shù),那么創(chuàng)建對象數(shù)組將會出錯。如:
class Fred {
 public:
   Fred(int i, int j);       assume there is no default constructor
   
...
 };
 
 int main()
 {
   Fred a[10];              
 ERROR: Fred doesn't have a default constructor
   Fred* p = new Fred[10];  
 ERROR: Fred doesn't have a default constructor
   
...
 }
如果用std::vector<Fred> ,則可以不用默認(rèn)構(gòu)造函數(shù)。如:
#include <vector>
 
 int main()
 {
   std::vector<Fred> a(10, Fred(5,7));   the 10 Fred objects in std::vector a will be initialized with Fred(5,7)
   
...
 }
也可以現(xiàn)實初始化數(shù)組:也可以用placement new來手工初始化數(shù)組元素
class Fred {
 public:
   Fred(int i, int j);       assume there is no default constructor
   
...
 };
 
 int main()
 {
   Fred a[10] = {
     Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7),  
// The 10 Fred objects are
     Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7), Fred(5,7)   
// initialized using Fred(5,7)
   };
   
...
 }

一般的我們用vector來替代數(shù)組。
6.構(gòu)造函數(shù)中如何使用初始化列表(initialization lists)和賦值(assignment)
在構(gòu)造中使用初始化列表比賦值更有效率,后者比前者多了一個臨時變量,多了這個臨時變量的創(chuàng)建和銷毀的開銷。但是在內(nèi)置數(shù)據(jù)類型(int,float等)時,二者差別不大。
另一種情況是在構(gòu)造中的成員對象會被以默認(rèn)構(gòu)造函數(shù)完整的構(gòu)造,會分配一些缺省狀態(tài)下的內(nèi)存或是文件,這樣如果在構(gòu)造中如果使用表達(dá)式或復(fù)制失敗,是沒辦法來釋放資源或關(guān)閉文件的。
在下面情況下不易使用初始化列表:類有兩個構(gòu)造函數(shù)并且需要初始化這個數(shù)據(jù)成員按照不同的順序,或是有兩個數(shù)據(jù)成員自引用,或數(shù)據(jù)成員需要引用this對象,或者拋出一個異常之前要初始化這個this成員等。
7.構(gòu)造函數(shù)可以使用this指針嗎?可以,但是小心使用,甚至于在初始化列表中使用它。
可以使用的情況:構(gòu)造函數(shù)的函數(shù)體(或構(gòu)造函數(shù)所調(diào)用的函數(shù))能可靠地訪問基類中聲明的數(shù)據(jù)成員和/或構(gòu)造函數(shù)所屬類里聲明的數(shù)據(jù)成員。這是因為所有這些數(shù)據(jù)成員被保證在構(gòu)造函數(shù)函數(shù)體開始執(zhí)行時已經(jīng)被完整的建立。
構(gòu)造函數(shù)的函數(shù)體(或構(gòu)造函數(shù)所調(diào)用的函數(shù))不能向下調(diào)用被派生類重定義的虛函數(shù)。無論你如何調(diào)用虛成員函數(shù):顯式使用this指針(如,this->method()),隱式的使用this指針(如,method()),或甚至在this對象上調(diào)用其他函數(shù)來調(diào)用該虛成員函數(shù),原因:在基類的構(gòu)造函數(shù)執(zhí)行期間,派生類對象還未產(chǎn)生。
下面的情況有時是可行的:如果傳遞 this 對象的任何一個數(shù)據(jù)成員給另一個數(shù)據(jù)成員的初始化程序,你必須確保該數(shù)據(jù)成員已經(jīng)被初始化。他的優(yōu)點是不依賴編譯器,但是你必須知道一些語言規(guī)則(例如,基類子對象首先被初始化(如果有多重和/或虛繼承,則查詢這個次序!),然后類中定義的數(shù)據(jù)成員根據(jù)在類中聲明的次序被初始化),如果不知道就不要使用這個this指針。
8.命名的構(gòu)造函數(shù)法(Named Constructor Idiom):
作用就就是區(qū)分多個構(gòu)造函數(shù)。
結(jié)構(gòu):把構(gòu)造放到private或protected處,提供一個返回對象的public static 方法。每種不同的構(gòu)造對象的方法都有一個這樣的靜態(tài)方法。例子:
class Point {
 public:
   Point(float x, float y);     // Rectangular coordinates
   Point(float r, float a);     
// Polar coordinates (radius and angle)
   
// ERROR: Overload is Ambiguous: Point::Point(float,float)
 };
 
 int main()
 {
   Point p = Point(5.7, 1.2);   
// Ambiguous: Which coordinate system?
   
...
 }
解決方法就是使用Named Constructor Idiom
#include <cmath>               // To get sin() and cos()
 
 class Point {
 public:
   static Point rectangular(float x, float y);      
// Rectangular coord's
   static Point polar(float radius, float angle);   
// Polar coordinates
   
// These static methods are the so-called "named constructors"
   
...
 private:
   Point(float x, float y);     
// Rectangular coordinates
   float x_, y_;
 };
 
 inline Point::Point(float x, float y)
   : x_(x), y_(y) { }
 
 inline Point Point::rectangular(float x, float y)
 { return Point(x, y); }
 
 inline Point Point::polar(float radius, float angle)
 { return Point(radius*cos(angle), radius*sin(angle)); }


int main()
 {
   Point p1 = Point::rectangular(5.7, 1.2);   // Obviously rectangular
   Point p2 = Point::polar(5.7, 1.2);         
// Obviously polar
   
...
 }

如果Point有派生類,構(gòu)造就放在protected中。

posted on 2009-12-05 01:41 Benjamin 閱讀(3154) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲日本无吗高清不卡| 亚洲黄色小视频| 午夜在线观看免费一区| 亚洲一区二区三区四区视频| 一区二区激情| 午夜精品在线视频| 久久久精品久久久久| 久久人人九九| 欧美精品一区二区三区视频| 欧美日韩国产电影| 国产伦一区二区三区色一情| 黄色成人av网| 宅男噜噜噜66国产日韩在线观看| 亚洲欧美日韩国产成人精品影院| 欧美一区二区三区免费大片| 久久久噜噜噜久久狠狠50岁| 亚洲高清在线| 亚洲午夜小视频| 久久久久久尹人网香蕉| 欧美极品一区二区三区| 国产欧美日韩综合一区在线播放| 狠狠久久综合婷婷不卡| 一区二区欧美精品| 久久婷婷国产综合尤物精品| 亚洲人成网站在线观看播放| 性欧美暴力猛交69hd| 欧美精品免费观看二区| 激情久久久久久久久久久久久久久久| 亚洲九九九在线观看| 久久福利影视| 99精品国产高清一区二区| 欧美一区免费视频| 欧美无乱码久久久免费午夜一区| 亚洲电影在线免费观看| 小黄鸭精品aⅴ导航网站入口 | 国内精品久久久久久久影视蜜臀 | 国产免费观看久久| 亚洲黄色高清| 久久综合九色综合欧美就去吻| 亚洲精品三级| 噜噜爱69成人精品| 国产小视频国产精品| 亚洲欧美日产图| 亚洲乱码国产乱码精品精98午夜| 久久日韩粉嫩一区二区三区| 日韩一级精品| 狂野欧美激情性xxxx| 国产一区欧美| 久久久av毛片精品| 亚洲欧美日韩精品综合在线观看| 欧美日韩色婷婷| 日韩小视频在线观看| 亚洲电影自拍| 欧美高清视频在线| 亚洲精品影院| 亚洲片国产一区一级在线观看| 久久综合给合久久狠狠狠97色69| 国产综合色在线| 久久亚洲精品一区| 久久久综合网站| 亚洲成人资源网| 欧美不卡在线视频| 久久亚洲国产精品日日av夜夜| 极品尤物av久久免费看| 麻豆亚洲精品| 欧美国产视频在线| 亚洲作爱视频| 99在线精品观看| 国产精品免费一区二区三区在线观看 | 国产一区二区三区高清在线观看| 小嫩嫩精品导航| 亚洲自拍偷拍麻豆| 国产一区二区三区丝袜| 美日韩精品视频| 欧美成人国产| 99re热这里只有精品免费视频| 日韩一级不卡| 国产日韩欧美自拍| 欧美aa国产视频| 欧美日产一区二区三区在线观看| 亚洲调教视频在线观看| 亚洲午夜小视频| 黄色精品一区| 亚洲欧洲视频| 国产精品区一区二区三区| 欧美在线一级视频| 免费成人av在线| 亚洲欧美在线高清| 久久精品免费电影| 一本色道久久综合精品竹菊| 午夜精品久久久久| 亚洲美女诱惑| 久久国产综合精品| 亚洲视频自拍偷拍| 欧美中文字幕在线播放| 亚洲破处大片| 午夜视频久久久久久| 亚洲日本无吗高清不卡| 亚洲天堂网在线观看| 91久久在线视频| 亚洲欧美久久久久一区二区三区| 亚洲欧洲日本mm| 欧美影片第一页| 宅男精品视频| 免费一级欧美片在线观看| 国产亚洲一级高清| 亚洲七七久久综合桃花剧情介绍| 国产嫩草影院久久久久 | 亚洲国产欧美一区| 国产精品一区二区在线观看不卡 | 欧美中文字幕视频| 亚洲一级片在线看| 久久综合给合| 久久精品人人做人人爽电影蜜月| 欧美日韩国产专区| 亚洲国产精品一区二区第一页| 国产自产在线视频一区| 亚洲欧美日韩另类| 性欧美大战久久久久久久久| 欧美日韩免费视频| 亚洲国产cao| 伊人久久大香线| 性欧美video另类hd性玩具| 亚洲永久免费| 国产精品sss| 一区二区三区四区五区精品视频| 亚洲国产影院| 久久久亚洲成人| 蜜臀va亚洲va欧美va天堂| 国产午夜一区二区三区| 亚洲欧美偷拍卡通变态| 亚洲欧美色婷婷| 国产精品视频不卡| 亚洲欧美一区二区在线观看| 香蕉久久精品日日躁夜夜躁| 欧美色图麻豆| 夜夜爽www精品| 亚洲欧美激情四射在线日| 国产精品久久福利| 午夜精品久久久99热福利| 久久久久高清| 在线不卡欧美| 欧美福利视频一区| 亚洲精品视频一区二区三区| 一区二区精品在线观看| 欧美亚洲第一页| 性色av一区二区三区在线观看| 欧美一区二区三区免费视频| 国产日韩欧美中文在线播放| 久久精品国内一区二区三区| 久久亚裔精品欧美| 亚洲成人自拍视频| 欧美激情一区二区三区四区| 日韩一区二区电影网| 性欧美video另类hd性玩具| 国产一区二区三区奇米久涩| 久久久一二三| 亚洲精品一区二区三区av| 亚洲视屏一区| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品久久久久天堂| 欧美在线视频二区| 亚洲成人自拍视频| 中日韩午夜理伦电影免费| 亚洲高清免费视频| 欧美成人首页| 在线亚洲一区| 久久综合九色综合欧美就去吻| 91久久久久久国产精品| 国产精品久久| 老**午夜毛片一区二区三区| 99国产精品久久| 久久网站热最新地址| 亚洲欧洲久久| 国产亚洲激情| 欧美三级在线视频| 久久美女艺术照精彩视频福利播放| 亚洲精品一级| 乱中年女人伦av一区二区| 亚洲网友自拍| 亚洲欧洲日本mm| 国产日韩一区二区三区在线| 欧美剧在线观看| 久久久国产精品亚洲一区| 99精品国产一区二区青青牛奶| 久久精品色图| 一级成人国产| 亚洲国产一区二区三区高清 | 久久成人av少妇免费| 日韩视频一区二区三区在线播放免费观看| 亚洲女人天堂av| 亚洲精品乱码久久久久久久久| 国产亚洲精品7777| 国产精品久久久久毛片大屁完整版 | 久久精品国产第一区二区三区最新章节 | 国内精品伊人久久久久av一坑| 欧美亚洲成人精品| 欧美伦理a级免费电影| 久久亚洲私人国产精品va媚药 | 久久激情婷婷|