<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programming Life with Music &#187; 构造函数</title>
	<atom:link href="http://jackaldire.com/tag/constructor/feed/" rel="self" type="application/rss+xml" />
	<link>http://jackaldire.com</link>
	<description>JackalDire &#039;s Blog</description>
	<lastBuildDate>Tue, 13 Jul 2010 08:29:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>构造函数 ——《Inside the C++ Object Model》笔记一</title>
		<link>http://jackaldire.com/200905/note-constructor/</link>
		<comments>http://jackaldire.com/200905/note-constructor/#comments</comments>
		<pubDate>Thu, 14 May 2009 16:40:24 +0000</pubDate>
		<dc:creator>JackalDire</dc:creator>
				<category><![CDATA[编程]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[构造函数]]></category>
		<category><![CDATA[笔记]]></category>

		<guid isPermaLink="false">http://jackaldire.com/?p=47</guid>
		<description><![CDATA[Inside the C++ Object Model Chapter 2 : The Semantics of Constructor 构造函数语义学 一、默认构造函数 Default Constructor C++编译器会在Class的每一个构造函数中通过添加代码的方法暗中(implicit)做了下面几件事: 如果在这个构造函数没有对所有Member Class Object进行构造, 编译器会调用余下没有构造的Member Class Object的默认构造函数； 如果此构造函数没有提供基类构造函数的参数列表, 编译器会调用基类的默认构造函数； 如果类中含有虚函数,编译器会利用构造函数产生一张virtual function table(vbtl)，并在每个Class Object中添加一个vprt(指向vbtl的指针)； 如果类有Virtual Base Class虚基类，编译器会在构造函数中添加代码, 允许每个虚基类的执行期存取操作。 如果这个Class没有任何构造函数, 而且发生上述四种情况的任意一种, 编译器就会生成一个默认构造函数 有以下两个误区： 任何Class只要没有定义default constructor，就会被合成一个来； 编译器合成出来的default constructor会明确设定class内每一个data member的值。 二、拷贝构造函数 Copy Constructor 拷贝构造函数的情况于默认构造函数类似。编译器对没有声明拷贝构造函数的对象实行Bitwise Copy(位逐次拷贝)，也就是简单的复制类中的每一个成员，此时编译器不会生成默认拷贝构造函数。但若出现以下四种情况的任意一种，编译器将会生成一个拷贝构造函数： 当Class内含一个成员对象，而且这个成员对象声明有一个拷贝构造函数（无论是被设计者声明或是被编译器合成） 编译器会调用基类(Base Class)的拷贝构造函数构造； 如果类中含有虚函数, 编译器会重新设定vptr，而不是简单的拷贝其值。如果将一个对象复制同一种类对象时，复制vptr没有问题。但如果是将一个派生类对象复制给基类对象或者反之，复制vptr的值就是错误的。 如果类对象的继承链上有Virtual Base Class虚基类，当一个基类对象以一个派生类对象为初值的时候，需要重新设定vptr或者offset值 [...]]]></description>
			<content:encoded><![CDATA[<p>Inside the C++ Object Model Chapter 2 : The Semantics of Constructor 构造函数语义学</p>
<h3>一、默认构造函数 Default Constructor</h3>
<p>C++编译器会在Class的每一个构造函数中通过添加代码的方法暗中(implicit)做了下面几件事:</p>
<ol>
<li>如果在这个构造函数没有对所有Member Class Object进行构造, 编译器会调用余下没有构造的Member Class Object的默认构造函数；</li>
<li>如果此构造函数没有提供基类构造函数的参数列表, 编译器会调用基类的默认构造函数；</li>
<li>如果类中含有虚函数,编译器会利用构造函数产生一张virtual function table(vbtl)，并在每个Class Object中添加一个vprt(指向vbtl的指针)；</li>
<li>如果类有Virtual Base Class虚基类，编译器会在构造函数中添加代码, 允许每个虚基类的执行期存取操作。</li>
</ol>
<p><span id="more-47"></span><br />
如果这个Class没有任何构造函数, 而且发生上述四种情况的任意一种, 编译器就会生成一个默认构造函数</p>
<p>有以下两个误区：</p>
<ol>
<li>任何Class只要没有定义default constructor，就会被合成一个来；</li>
<li>编译器合成出来的default constructor会明确设定class内每一个data member的值。</li>
</ol>
<h3>二、拷贝构造函数 Copy Constructor</h3>
<p>拷贝构造函数的情况于默认构造函数类似。编译器对没有声明拷贝构造函数的对象实行Bitwise Copy(位逐次拷贝)，也就是简单的复制类中的每一个成员，此时编译器不会生成默认拷贝构造函数。但若出现以下四种情况的任意一种，编译器将会生成一个拷贝构造函数：</p>
<ol>
<li>当Class内含一个成员对象，而且这个成员对象声明有一个拷贝构造函数（无论是被设计者声明或是被编译器合成）</li>
<li>编译器会调用基类(Base Class)的拷贝构造函数构造；</li>
<li>如果类中含有虚函数, 编译器会重新设定vptr，而不是简单的拷贝其值。如果将一个对象复制同一种类对象时，复制vptr没有问题。但如果是将一个派生类对象复制给基类对象或者反之，复制vptr的值就是错误的。</li>
<li>如果类对象的继承链上有Virtual Base Class虚基类，当一个基类对象以一个派生类对象为初值的时候，需要重新设定vptr或者offset值</li>
</ol>

	<h4>Related Post</h4>
	<ul class="st-related-posts">
	<li><a href="http://jackaldire.com/200906/cost-of-class-inherit/" title="类继承的开销 ——《Inside the C++ Object Model》笔记二 (2009年06月20日)">类继承的开销 ——《Inside the C++ Object Model》笔记二</a> (0)</li>
	<li><a href="http://jackaldire.com/201001/c-style-cast-issues/" title="[C++]一个由C-Style类型转换引发的血案 (2010年01月11日)">[C++]一个由C-Style类型转换引发的血案</a> (3)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://jackaldire.com/200905/note-constructor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
