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

asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

/********************************************\
|????歡迎轉載, 但請保留作者姓名和原文鏈接, 祝您進步并共勉!???? |
\********************************************/


Chapter 2. The Semantics of Constructors
----------------------------------------
2.1 Default Constructor Construction

作者: Jerry Cat
時間: 2006/04/27
鏈接:?http://m.shnenglu.com/jerysun0818/archive/2006/04/28/6407.html

========================================
Global objects are guaranteed to have their associated memory "zeroed out" at program start-up. Local objects allocated on the program stack and heap objects allocated on the free-store do not have their associated memory zeroed out; rather, the memory retains the arbitrary bit pattern of its previous use.

If there is no user-declared constructor for class X, a default constructor is implicitly declared…. A constructor is trivial(瑣碎, 微不足道, 啥也不干) if it is an implicitly declared default constructor….

1). Member Class Object with Default Constructor:
If a class without any constructors contains a member object of a class with a default constructor, the implicit default constructor of the class is nontrivial and the compiler needs to synthesize a default constructor for the containing class. This synthesis, however, takes place only if the constructor actually needs to be invoked.

An interesting question, then: Given the separate compilation model of C++, how does the compiler prevent synthesizing multiple default constructors, for example, one for file A.C and a second for file B.C? In practice, this is solved by having the synthesized default constructor, copy constructor, destructor, and/or assignment copy operator defined as inline. An inline function has static linkage and is therefore not visible outside the file within which it is synthesized. If the function is too complex to be inlined by the implementation, an explicit non-inline static instance is synthesized.

For example, in the following code fragment, the compiler synthesizes a default constructor for class Bar:

class Foo { public: Foo(), Foo( int ) ... };

class Bar { public: Foo foo; char *str; };

void foo_bar() {
?? Bar bar; // Bar::foo must be initialized here
?? if ( str ) { } ...
}
The synthesized default constructor contains the code necessary to invoke the class Foo default constructor on the member object Bar::foo, but it does not generate any code to initialize Bar::str. Initialization of Bar::foo is the compiler's responsibility; initialization of Bar::str is the programmer's. The synthesized default constructor might look as follows:

____To simplify our discussion, these examples ignore the insertion of the implicit this pointer.
// possible synthesis of Bar default constructor
// invoke Foo default constructor for member foo
inline Bar::Bar()
{
?? foo.Foo::Foo(); // Pseudo C++ Code
}
Again, note that the synthesized default constructor meets only the needs of the implementation, not the needs of the program.

What happens if there are multiple class member objects requiring constructor initialization? The language requires that the constructors be invoked in the order of member declaration within the class. This is accomplished by the compiler. It inserts code within each constructor, invoking the associated default constructors for each member in the order of member declaration. This code is inserted just prior to the explicitly supplied user code. For example, say we have the following three classes:

class Dopey?? { public: Dopey(); ... };
class Sneezy? { public: Sneezy( int ); Sneezy(); ... };
class Bashful { public: Bashful() ... };
and a containing class Snow_White:

class Snow_White {
public:
?? Dopey dopey;
?? Sneezy sneezy;
?? Bashful bashful;
?? // ...
private:
?? int mumble;
};
If Snow_White does not define a default constructor, a nontrivial default constructor is synthesized that invokes the three default constructors of Dopey, Sneezy, and Bashful in that order. If, on the other hand, Snow_White defines the following default constructor:

// programmer coded default constructor
Snow_White::Snow_White() : sneezy( 1024 )
{
?? mumble = 2048;
}
it is augmented as follows:

// Compiler augmented default constructor
// Pseudo C++ Code
Snow_White::Snow_White()
{
?? // insertion of member class object constructor invocations
?? dopey.Dopey::Dopey();
?? sneezy.Sneezy::Sneezy( 1024 );
?? bashful.Bashful::Bashful();

?? // explicit user code
?? mumble = 2048;
}

2). Base Class with Default Constructor:
Similarly, if a class without any constructors is derived from a base class containing a default constructor, the default constructor for the derived class is considered nontrivial and so needs to be synthesized. The synthesized default constructor of the derived class invokes the default constructor of each of its immediate base classes in the order of their declaration. To a subsequently derived class, the synthesized constructor appears no different than that of an explicitly provided default constructor.

What if the designer provides multiple constructors but no default constructor? The compiler augments each constructor with the code necessary to invoke all required default constructors. However, it does not synthesize a default constructor because of the presence of the other user-supplied constructors. If member class objects with default constructors are also present, these default constructors are also invoked梐fter the invocation of all base class constructors.

3). Class with a Virtual Function:
There are two additional cases in which a synthesized default constructor is needed:

(1). The class either declares (or inherits) a virtual function
(2). The class is derived from an inheritance chain in which one or more base classes are virtual

In both cases, in the absence of any declared constructors, implementation bookkeeping necessitates the synthesis of a default constructor. For example, given the following code fragment:

class Widget {
public:
?? virtual void flip() = 0;
?? // ...
};

void flip( const Widget& widget ) { widget.flip(); }

// presuming Bell and Whistle are derived from Widget
void foo() {
?? Bell b;? Whistle w;
?? flip( b );
?? flip( w );
}
the following two class "augmentations" occur during compilation:

(3). A virtual function table (referred to as the class vtbl in the original cfront implementation) is generated and populated with the addresses of the active virtual functions for that class.
(4). Within each class object, an additional pointer member (the vptr) is synthesized to hold the address of the associated class vtbl.

In addition, the virtual invocation of widget.flip() is rewritten to make use of widget's vptr and flip()'s entry into the associated vtbl:

?? // simplified transformation of virtual invocation:
widget.flip()
?? ( * widget.vptr[ 1 ] ) ( &widget )
where:

____1 represents flip()'s fixed index into the virtual table, and

____&widget represents the this pointer to be passed to the particular invocation of flip().

For this mechanism to work, the compiler must initialize the vptr of each Widget object (or the object of a class derived from Widget) with the address of the appropriate virtual table. For each constructor the class defines, the compiler inserts code that does just that (this is illustrated in Section 5.2). In classes that do not declare any constructors, the compiler synthesizes a default constructor in order to correctly initialize the vptr of each class object.

4). Class with a Virtual Base Class:
Virtual base class implementations vary widely across compilers. However, what is common to each implementation is the need to make the virtual base class location within each derived class object available at runtime. For example, in the following program fragment:

class X { public: int i; };
class A : public virtual X?? { public: int j; };
class B : public virtual X?? { public: double d; };
class C : public A, public B { public: int k; };
// cannot resolve location of pa->X::i at compile-time
void foo( const A* pa ) { pa->i = 1024; }

main() {
?? foo( new A );
?? foo( new C );
?? // ...
}
the compiler cannot fix the physical offset of X::i accessed through pa within foo(), since the actual type of pa can vary with each of foo()'s invocations. Rather, the compiler must transform the code doing the access so that the resolution of X::i can be delayed until runtime. In the original cfront implementation, for example, this is accomplished by inserting a pointer to each of the virtual base classes within the derived class object. All reference and pointer access of a virtual base class is achieved through the associated pointer. In our example, foo() might be rewritten as follows under this implementation strategy:

// possible compiler transformation
void foo( const A* pa ) { pa->__vbcX->i = 1024; }
where?__vbcX represents the compiler-generated pointer to the virtual base class X.

As you've no doubt guessed by now, the initialization of __vbcX (or whatever implementation mechanism is used) is accomplished during the construction of the class object. For each constructor the class defines, the compiler inserts code that permits runtime access of each virtual base class. In classes that do not declare any constructors, the compiler needs to synthesize a default constructor.

2.1 小結:
=-=-=-=-=
Programmers new to C++ often have two
common misunderstandings:

? 1. That a default constructor is synthesized for every class that does not define one
? 2. That the compiler-synthesized default constructor provides explicit default initializers for each data member declared within the class

posted on 2006-04-28 03:00 Jerry Cat 閱讀(1062) 評論(3)  編輯 收藏 引用

FeedBack:
# re: C++對象模型(4) - Default Constructor Construction
2006-04-28 18:39 | dfdffddffdfd
你些的我看不懂,小樣,我8級的也看不懂~~~~請你編個中文版的解說。
知道不??????????????????  回復  更多評論
  
# re: C++對象模型(4) - Default Constructor Construction
2006-04-28 18:51 | 婀娜
彩運500萬福彩3D110期預測
膽碼:34

復式:復式:123/357/014
喜歡合買的朋友,可以加我QQ448967360聊聊!
彩運500萬http://www.cy500.com
  回復  更多評論
  
# re: C++對象模型(4) - Default Constructor Construction
2006-04-29 01:04 | Jerry Cat
dfdffddffdfd, 小樣不小樣免了吧:) 8級有用么? 你不是學計算機的吧? 這非我寫, 乃C++大師Stanley所寫, 國內學校100級英語也不行呀! 不是對你有任何看法, 大家一起努力吧! 只不過想到外企拿高薪并且35歲后不失業(yè), 不能心浮, 要靜心好好地去學!

--------------------------------------------------

(附: 請在小弟處只談asm, c, C++, 別的免談, 這句送給哪個買啥鳥彩票的朋友!)  回復  更多評論
  

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿(7)

隨筆檔案

最新隨筆

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲男女自偷自拍| 久久www成人_看片免费不卡| 99热在线精品观看| 亚洲精品网站在线播放gif| 亚洲欧洲在线一区| 国产区在线观看成人精品| 久久久爽爽爽美女图片| 亚洲国产欧美一区| 99精品欧美一区二区三区| 亚洲午夜av电影| 亚洲欧美另类在线| 麻豆精品网站| 亚洲精品视频免费在线观看| 亚洲伊人网站| 欧美1区3d| 国产伦精品免费视频| 在线观看欧美日韩| 亚洲综合视频网| 欧美11—12娇小xxxx| av成人免费| 欧美激情一区三区| 亚洲欧美日韩精品在线| 久久国产精品久久国产精品 | 国产综合在线看| 亚洲黄色性网站| 亚洲精品系列| 99国产精品久久久久久久久久 | 在线不卡中文字幕| 午夜久久一区| 久久国产精品99国产精| 亚洲高清123| 亚洲天堂av在线免费| 久久一区二区三区超碰国产精品| 欧美特黄a级高清免费大片a级| 激情久久综合| 欧美影院在线播放| 亚洲一区二区三区国产| 免费在线视频一区| 先锋亚洲精品| 欧美性猛交视频| 亚洲裸体俱乐部裸体舞表演av| 久久久99爱| 一区二区在线免费观看| 欧美视频在线观看| 99re6这里只有精品| 久久综合中文| 久久激情网站| 国产亚洲欧美一级| 久久国产精品一区二区| 亚洲性av在线| 国产精品v片在线观看不卡| 亚洲美女视频| 亚洲精品久久久一区二区三区| 久久久久久一区| 在线精品观看| 亚洲福利精品| 欧美精品一区二区三区久久久竹菊| 亚洲一区二区三区欧美| 美女精品视频一区| 亚洲国产婷婷综合在线精品| 久久综合久久综合久久综合| 久久久久久有精品国产| 伊人久久大香线蕉综合热线| 欧美精品日韩三级| 嫩草国产精品入口| 亚洲美女一区| 一区二区日韩免费看| 国产精品二区影院| 久久国产精品久久精品国产| 久久国产视频网| 亚洲第一网站| 亚洲欧洲日产国产综合网| 欧美日韩国产免费| 欧美亚洲在线视频| 欧美一区二区精品久久911| 国内精品久久久久久久97牛牛| 在线精品视频免费观看| 男人天堂欧美日韩| 欧美美女福利视频| 国产人成精品一区二区三| 久久精品国产v日韩v亚洲| 久久青青草原一区二区| 日韩一二三区视频| 亚洲你懂的在线视频| 韩国免费一区| 亚洲人成亚洲人成在线观看图片| 蜜桃av噜噜一区二区三区| 欧美xart系列高清| 午夜精品视频| 欧美大片免费| 久久成年人视频| 欧美不卡视频一区发布| 欧美亚洲视频在线看网址| 美女诱惑一区| 欧美中文日韩| 欧美日韩亚洲一区二区三区在线观看 | 亚洲精品影院在线观看| 国产精品伊人日日| 欧美激情中文字幕乱码免费| 国产精品美腿一区在线看| 欧美国产精品劲爆| 久久综合九色综合欧美就去吻| 亚洲国产成人高清精品| 国产精品视频自拍| 91久久精品网| 国内精品视频一区| 一区二区三区视频在线看| 亚洲国产精品久久| 欧美一级视频免费在线观看| 亚洲午夜伦理| 欧美日韩成人综合在线一区二区| 亚洲片区在线| 欧美午夜剧场| 亚洲日本激情| 亚洲人成人一区二区在线观看| 亚洲欧美一区二区激情| 亚洲一区日韩在线| 亚洲欧洲三级电影| 亚洲大胆视频| 久久久久久电影| 久久久国产视频91| 国产精品一区二区视频| 亚洲小视频在线观看| 亚洲一区二区三区精品视频| 久久综合色播五月| 亚洲欧美国产高清| 午夜在线a亚洲v天堂网2018| 欧美日韩国产一区精品一区| 亚洲激情成人在线| 亚洲经典在线看| 欧美3dxxxxhd| 亚洲国产精品精华液网站| 亚洲国产高清一区| 卡一卡二国产精品| 欧美大片91| 久久精品综合一区| 玖玖玖免费嫩草在线影院一区| 国产视频不卡| 欧美怡红院视频| 久久裸体视频| 亚洲国产精品第一区二区| 免费在线日韩av| 99re视频这里只有精品| 欧美日韩国产成人在线观看| 欧美gay视频| 亚洲欧洲在线播放| 欧美日韩亚洲一区二区| 亚洲午夜视频在线| 欧美亚洲一区在线| 亚洲午夜久久久久久久久电影院| 欧美日韩一区二区在线观看| 一区二区三区精品国产| 久久成人资源| 亚洲第一色中文字幕| 欧美成人一区二区在线| 99精品99久久久久久宅男| 欧美一区二区成人6969| 黄色成人免费观看| 欧美激情精品久久久久久蜜臀| 亚洲精品日韩在线| 欧美在现视频| 亚洲精品视频二区| 国产精品区一区| 久久久久免费| 一区二区三区**美女毛片| 久久久伊人欧美| 亚洲最新在线| 久久香蕉国产线看观看网| 亚洲精品免费在线| 久久大逼视频| 99国内精品| 激情欧美日韩一区| 国产精品videossex久久发布| 久久精品国产一区二区电影 | 久久精品水蜜桃av综合天堂| 欧美成人在线网站| 亚洲免费影视第一页| 亚洲国产成人午夜在线一区| 亚洲婷婷免费| 久久国产精彩视频| 99国内精品久久| 欧美大片网址| 久久久久久有精品国产| 亚洲天天影视| 亚洲理伦在线| 亚洲福利视频一区二区| 国产日韩欧美综合精品| 欧美日韩色婷婷| 欧美激情第10页| 久久午夜精品| 久久精品夜色噜噜亚洲aⅴ| 亚洲深夜av| 一本不卡影院| 91久久精品美女高潮| 国产综合一区二区| 国产三区二区一区久久| 欧美日韩一区二区视频在线| 欧美国产日韩亚洲一区| 久久亚洲国产成人| 久久精品99国产精品|