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

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>
            一区二区三区欧美| 欧美成人午夜激情在线| 亚洲小说春色综合另类电影| 国产精自产拍久久久久久蜜| 久久高清一区| 亚洲一区三区视频在线观看 | 一区二区三区导航| 久久久精品久久久久| 欧美 日韩 国产一区二区在线视频 | 欧美日韩国产色视频| 欧美91大片| 欧美日韩国产限制| 国产精品久久亚洲7777| 国产视频观看一区| 激情偷拍久久| 日韩视频一区二区三区| 一区二区三区波多野结衣在线观看| 亚洲免费观看高清在线观看| 一本色道久久综合亚洲精品不卡 | 性欧美激情精品| 久久免费高清视频| 国产日韩在线播放| 在线日本高清免费不卡| 99精品99| 免费人成网站在线观看欧美高清| 欧美国产一区视频在线观看| 日韩午夜激情电影| 久久久五月婷婷| 国产精品女同互慰在线看| 亚洲第一在线视频| 欧美一级片在线播放| 亚洲日本黄色| 国产精品99久久不卡二区| 午夜精品www| 欧美国产一区二区在线观看| 国产精品大全| 亚洲欧美另类国产| 亚洲激情视频在线| 麻豆成人在线播放| 国产一区二区三区奇米久涩 | 亚洲福利小视频| 久久久久久久91| 久久久福利视频| 国产在线成人| 狼人社综合社区| 久久久久综合网| 1204国产成人精品视频| 欧美www视频| 欧美日本亚洲韩国国产| 亚洲午夜性刺激影院| 一区二区欧美在线观看| 国产精品二区二区三区| 久久国产一区二区| 久久疯狂做爰流白浆xx| 香蕉免费一区二区三区在线观看| 国产三区精品| 91久久极品少妇xxxxⅹ软件| 欧美日韩国产成人| 欧美一级久久久| 每日更新成人在线视频| 亚洲婷婷在线| 久久久久国色av免费看影院| 亚洲国产二区| 亚洲欧美日韩中文视频| 精品99一区二区三区| 亚洲乱码精品一二三四区日韩在线| 欧美日精品一区视频| 你懂的国产精品| 国产精品免费一区豆花| 欧美高清视频| 亚洲电影在线播放| 欧美一区二区国产| 亚洲在线视频观看| 欧美精品粉嫩高潮一区二区| 久久婷婷麻豆| 国产精品一二一区| 一本大道久久a久久综合婷婷| 一区在线影院| 午夜久久电影网| 久久不射电影网| 国产精品一区二区久久久久| 亚洲精品视频一区| 亚洲精品一区二区三区四区高清 | 亚洲图片在线观看| 亚洲特级片在线| 国产精品久久久久高潮| 亚洲免费电影在线观看| 欧美电影免费观看高清完整版| 久久精品国产91精品亚洲| 国产精品亚洲综合久久| 亚洲一区二区三区在线看| 亚洲字幕在线观看| 国产精品实拍| 蜜乳av另类精品一区二区| 久久九九全国免费精品观看| 国产精品中文在线| 蜜桃精品久久久久久久免费影院| 美女成人午夜| 一本色道久久综合狠狠躁的推荐| 欧美性大战久久久久| 香港成人在线视频| 亚洲激情在线视频| 欧美一区国产二区| 亚洲人成网站影音先锋播放| 欧美日韩免费网站| 久久综合导航| 亚洲午夜久久久久久久久电影院| 另类专区欧美制服同性| 亚洲一区二区少妇| 亚洲人被黑人高潮完整版| 欧美日韩高清不卡| 一本一本a久久| 麻豆精品网站| 蜜臀a∨国产成人精品| 亚洲欧洲一区二区在线播放| 亚洲欧美日韩国产一区| 一区二区三区成人| 亚洲精品乱码久久久久久按摩观| 国产精品女主播一区二区三区| 久热精品在线视频| 欧美不卡在线| 欧美高清在线一区二区| 狼人天天伊人久久| 久久久久网址| 久久在线视频| 欧美v日韩v国产v| 欧美暴力喷水在线| 亚洲欧美日韩国产一区| 亚洲综合社区| 亚洲乱码国产乱码精品精天堂| 国产日韩欧美综合| 国产视频一区在线观看| 国产精品亚洲美女av网站| 国产精品综合| 亚洲激情视频在线观看| 一本一本久久a久久精品牛牛影视| 一本久道久久久| 久久久国产精品一区| 欧美韩国一区| 亚洲一区国产精品| 欧美成人一区二区三区| 欧美午夜精品久久久久久孕妇| 国产精品亚洲不卡a| 亚洲精品久久久久久下一站| 亚洲欧美国产日韩天堂区| 久久综合999| 新片速递亚洲合集欧美合集| 久久午夜精品一区二区| 欧美日韩免费一区| 亚洲国产一区二区三区在线播| 亚洲一区二区三区精品动漫| 久久久久久久999精品视频| 亚洲精品美女在线| 久久婷婷国产麻豆91天堂| 国产精品国产三级国产普通话99 | 中日韩美女免费视频网址在线观看 | 欧美亚洲一区二区在线| 欧美日韩99| 夜夜狂射影院欧美极品| 亚洲国产日韩欧美在线图片| 欧美一区2区视频在线观看| 亚洲精华国产欧美| 欧美日韩第一区| 午夜免费日韩视频| 午夜日韩福利| 亚洲黄色尤物视频| 亚洲日韩欧美视频一区| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 老鸭窝91久久精品色噜噜导演| 欧美亚洲在线| 亚洲精品在线视频观看| 99re在线精品| 久久精品一二三区| 韩国欧美国产1区| 欧美激情一区二区三区全黄| 欧美日本国产| 免费欧美电影| 欧美日韩在线播放一区| 欧美在线一级视频| 欧美不卡一卡二卡免费版| 中国成人亚色综合网站| 午夜精品久久久久久久99樱桃| 尹人成人综合网| 99国产精品视频免费观看一公开| 国产视频久久久久| 亚洲国产小视频在线观看| 国产一区91精品张津瑜| 最新国产乱人伦偷精品免费网站| 欧美性猛交xxxx乱大交退制版| 老色批av在线精品| 国产人成精品一区二区三| 日韩视频免费观看高清在线视频 | 国产精品每日更新| 久久久久久穴| 国产日产欧产精品推荐色| 最新日韩在线| 中国女人久久久| 欧美精品入口| 亚洲美女网站| 亚洲在线观看视频|