⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_50711.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:50711 发表者:IT40 发表日期:2003-08-25 23:32:45
<br>主题:关于类型转换
<br>内容:#include &lt;iostream.h&gt;<BR><BR>class A<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;A() { m=0;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;A(double i) { m=i;cout&lt;&lt;"constructor"; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;void print() { cout&lt;&lt;m&lt;&lt;endl; }<BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;double m;<BR>};<BR><BR>void main()<BR>{<BR>A a(5);<BR>a=10; //把10转换为一个A类型了<BR>a.print();<BR>}<BR>如果我把main改成:<BR>void main()<BR>{<BR>A a=10;<BR>//这里应该是先调用构造函数把10转换,然后再构造a吧。应该构造函数被调了两次为什么,从输出看只调了一次。<BR>a.print();<BR>}<BR><BR>&nbsp;&nbsp; 
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:擎天柱 回复日期:2003-08-26 08:05:05
<br>内容:调用了operator=
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IT40 回复日期:2003-08-26 11:28:00
<br>内容:两个不都调用了operator=吗
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:师少一一 回复日期:2003-08-26 14:49:25
<br>内容:从输出看当然只调了一次咯!<BR>输出的是那次是调用构造函数把10转换,你说的再构造a是程序中默认的,一般是不会显示出来的拉!:)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IT40 回复日期:2003-08-26 14:53:20
<br>内容:什么乱七八糟的 调用了构造函数当然要显示出来<BR>调的又不是默认的构造函数咯
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:哈哈黑 回复日期:2003-08-27 02:37:57
<br>内容:A a=10;<BR>这里的意思是声明一个A类的对象a,然后再运行a=10;所以只会显示一次<BR>相当于<BR>A a;<BR>a=10;
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-08-27 10:38:34
<br>内容:我感觉不对,A a=10; 我怀疑不涉及自定义类的类型转换,这直接就被编译器默认调用带参数构造函数了。就象是内置数据类型一样。好比,int i=10;如果是先构造一个对象,再进行类型转换,那也应该是先调用默认构造函数(而不是带参数构造函数),然后再进行自定义类类型转换。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:哈哈黑 回复日期:2003-08-27 14:55:52
<br>内容:调试了一下这个程序,发现上次说错了,不好意思<BR>如果是A a=10;程序直接执行A(double i) { m=i;cout&lt;&lt;&#34;constructor&#34;; }<BR>如果是A a;a=10;程序先执行A() { m=0;},再执行a=10,接着是A(double i) { m=i;cout&lt;&lt;&#34;constructor&#34;; }<BR>所以2者是不同的;<BR>在A a=10;时,构造函数被调用一次;<BR>在A a;a=10;时,构造函数被调用2次;你可以把A() { m=0;}改成A(){m=0;cout&lt;&lt;&#34;constructor1&#34;;},结果是不同的
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IT40 回复日期:2003-08-27 15:20:22
<br>内容:楼上说得很正确<BR>两个是不同的 <BR>为什么就不知道了<BR>但是A a=10; 肯定涉及自定义类的类型转换<BR>因为在构造函数前加上explicit就不会包错了<BR>所以很明显是涉及自定义类的类型转换<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IT40 回复日期:2003-08-27 15:23:36
<br>内容:说错了!<BR>因为在构造函数前加上explicit就会报错了!!<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-08-28 10:21:11
<br>内容:有点疑问和不同意见如下:<BR>&nbsp;&nbsp; 1、如果是A a=10;程序直接执行A(double i) { ;cout&lt;&lt;&#34;constructor&#34;; }&nbsp;&nbsp;根据是什么?我只是怀疑是直接应用了带参数构造函数A(double i) { m=i;cout&lt;&lt;&#34;constructor&#34;; },但现在还不能证明。&nbsp;&nbsp;请高手解释一下!<BR>&nbsp;&nbsp; 2、至于 A a(5);a=10;&nbsp;&nbsp;&nbsp;&nbsp;A a(5);肯定会调用带参数构造函数是没说的,而a=10; 涉及对象间位逐次拷贝和自定义类类型转换这两方面知识。因为a是自定义类类型对象,而10是内置数据类型,编译器便会试着将低精度数据类型向高精度数据类型转化以防止数据遗失。一般在类的构造函数中,凡是只带有一个参数的构造函数都定义了一组隐式转换,可以把构造函数里的参数类型转换为该类的类型。所以,本题中A(double i) { m=i;cout&lt;&lt;&#34;constructor&#34;; }这个带参数构造函数是自定义类类型转化的关键。所以,a=10; 整个过程是编译器通过这个带参数构造函数构造一个临时对象,然后再利用对象间位逐次拷贝把那个临时对象赋植给a。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 所以,我认为本题的两种赋植方式都没有调用operator=
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:badboy 回复日期:2003-08-28 11:44:19
<br>内容://因为自定义类型转换一般都是通过编译器在需要时“隐式”转换,也就是隐式调用带单参数构造函数来转换。编译器是不会调用一个显式构造函数来执行隐式类型转换的。但,当我们进行自定义类型对象强类型转换时,也会导致调用显式单参数构造函数进行自定义类型转换。程序如下:<BR>#include &lt;iostream.h&gt;<BR>class A<BR>{<BR>public:<BR>&nbsp;&nbsp;&nbsp;&nbsp;A() { m=0;cout&lt;&lt;&#34;con&#34;&lt;&lt;endl;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;explicit A(double i) { m=i;cout&lt;&lt;&#34;constrerereructor&#34;&lt;&lt;endl; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;void print() { cout&lt;&lt;m&lt;&lt;endl; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;double ren(double i){return m=i;}<BR>private:<BR>&nbsp;&nbsp;&nbsp;&nbsp;double m;<BR>};<BR><BR>void main()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;A a=(A)10;<BR>&nbsp;&nbsp;&nbsp;&nbsp;A b=(static_cast&lt;A&gt;(10));<BR>&nbsp;&nbsp;&nbsp;&nbsp;a.print();<BR>&nbsp;&nbsp;&nbsp;&nbsp;b.print();<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:IT40 回复日期:2003-08-28 15:26:07
<br>内容:其实说了这么多 我就是想知道:<BR>1、如果是A a=10;程序直接执行A(double i) { ;cout&lt;&lt;&#34;constructor&#34;; }&nbsp;&nbsp;根据是什么?我只是怀疑是直接应用了带参数构造函数A(double i) { m=i;cout&lt;&lt;&#34;constructor&#34;; },但现在还不能证明。&nbsp;&nbsp;请高手解释一下!<BR>&nbsp;&nbsp; 
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:哈哈黑 回复日期:2003-08-29 00:37:21
<br>内容:关注中。。。。。。。。。。。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:哈哈黑 回复日期:2003-08-29 23:44:40
<br>内容:明白了。。。。<BR>A a=10;c++的理解是A a=A(10);这里的处理中,c++首先构造了一个无名对象=A(10);所以根据参数的匹配原则会掉用A(double i)的构造函数,<BR>然后通过默认拷贝构造函数(如果你在类说明中没有定义拷贝构造函数,C++会提供一个默认的拷贝构造函数,就想默认的构造函数一样)将无名对象拷贝到a中,在这个过程中,无名对象在拷贝完成后就失去了任何作用,对于这种情况,C++特别的将其看做为A a=10;效果一样,而且可以省略创建无名对象这一步。<BR>类似的,a=10;也是一样的道理,这里的“=”是赋值(对象已创建),而A a=10中“=”是对象的拷贝(初始化);<BR><BR>2003-8-30 1:11:38

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -