天天看点

C++ explicit 关键字

explicit 修饰只有一个参数的构造函数,以防止从参数类型到目标类类型的隐式转换。

<code>// stdmove.cpp -- using std::move()</code>

<code>#include &lt;iostream&gt;</code>

<code>#include &lt;utility&gt;</code>

<code>using</code> <code>std::cout;</code>

<code>using</code> <code>std::endl;</code>

<code>// use the following for g++4.5</code>

<code>// #define nullptr 0</code>

<code>// interface</code>

<code>class</code> <code>Useless</code>

<code>{</code>

<code>private</code><code>:</code>

<code>    </code><code>int</code> <code>n;          </code><code>// number of elements</code>

<code>    </code><code>char</code> <code>* pc;      </code><code>// pointer to data</code>

<code>    </code><code>static</code> <code>int</code> <code>ct;  </code><code>// number of objects</code>

<code>public</code><code>:</code>

<code>    </code><code>Useless();</code>

<code>    </code><code>explicit</code> <code>Useless(</code><code>int</code> <code>k);</code>

<code>    </code><code>Useless(</code><code>int</code> <code>k, </code><code>char</code> <code>ch);</code>

<code>    </code><code>Useless(</code><code>const</code> <code>Useless &amp; f); </code><code>// regular copy constructor</code>

<code>    </code><code>~Useless();</code>

<code>    </code><code>Useless &amp; operator=(</code><code>const</code> <code>Useless &amp; f); </code><code>// copy assignment</code>

<code>    </code><code>void</code> <code>ShowObject() </code><code>const</code><code>;</code>

<code>};</code>

<code>// implementation</code>

<code>int</code> <code>Useless::ct = 0;</code>

<code>Useless::Useless()</code>

<code>    </code><code>cout &lt;&lt; </code><code>"enter "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"()\n"</code><code>;</code>

<code>    </code><code>++ct;</code>

<code>    </code><code>n = 0;</code>

<code>    </code><code>pc = nullptr;</code>

<code>    </code><code>ShowObject();</code>

<code>    </code><code>cout &lt;&lt; </code><code>"leave "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"()\n"</code><code>;</code>

<code> </code><code>}</code>

<code>Useless::Useless(</code><code>int</code> <code>k) : n(k)</code>

<code>    </code><code>cout &lt;&lt; </code><code>"enter "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"(k)\n"</code><code>;</code>

<code>    </code><code>++ct; </code>

<code>    </code><code>pc = </code><code>new</code> <code>char</code><code>[n];</code>

<code>    </code><code>cout &lt;&lt; </code><code>"leave "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"(k)\n"</code><code>;</code>

<code>}</code>

<code>Useless::Useless(</code><code>int</code> <code>k, </code><code>char</code> <code>ch) : n(k)</code>

<code>    </code><code>cout &lt;&lt; </code><code>"enter "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"(k, ch)\n"</code><code>;</code>

<code>    </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; n; i++)</code>

<code>        </code><code>pc[i] = ch;</code>

<code>    </code><code>cout &lt;&lt; </code><code>"leave "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"(k, ch)\n"</code><code>;</code>

<code>Useless::Useless(</code><code>const</code> <code>Useless &amp; f): n(f.n) </code>

<code>    </code><code>cout &lt;&lt; </code><code>"enter "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"(const &amp;)\n"</code><code>;</code>

<code>        </code><code>pc[i] = f.pc[i];</code>

<code>    </code><code>cout &lt;&lt; </code><code>"leave "</code> <code>&lt;&lt; __func__ &lt;&lt; </code><code>"(const &amp;)\n"</code><code>;</code>

<code>Useless::~Useless()</code>

<code>    </code><code>--ct;</code>

<code>    </code><code>delete</code> <code>[] pc;</code>

<code>Useless &amp; Useless::operator=(</code><code>const</code> <code>Useless &amp; f)  </code><code>// copy assignment</code>

<code>    </code><code>f.ShowObject();</code>

<code>    </code><code>if</code> <code>(</code><code>this</code> <code>== &amp;f)</code>

<code>        </code><code>return</code> <code>*</code><code>this</code><code>;</code>

<code>    </code><code>n = f.n;</code>

<code>    </code><code>return</code> <code>*</code><code>this</code><code>;</code>

<code>void</code> <code>Useless::ShowObject() </code><code>const</code>

<code>{ </code>

<code>    </code><code>cout &lt;&lt; </code><code>"\t this="</code> <code>&lt;&lt; </code><code>this</code> <code>&lt;&lt; </code><code>", ct="</code> <code>&lt;&lt; ct; </code>

<code>    </code><code>cout &lt;&lt; </code><code>", pc=("</code> <code>&lt;&lt; n &lt;&lt; </code><code>", "</code> <code>&lt;&lt; (</code><code>void</code><code>*)pc &lt;&lt; </code><code>", "</code><code>; </code>

<code>    </code><code>if</code> <code>(n == 0)</code>

<code>        </code><code>cout &lt;&lt; </code><code>"(object empty)"</code><code>;</code>

<code>    </code><code>else</code>

<code>        </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i &lt; n; i++)</code>

<code>            </code><code>cout &lt;&lt; pc[i];</code>

<code>    </code><code>cout &lt;&lt; </code><code>" )."</code> <code>&lt;&lt; endl;</code>

<code>int</code> <code>main()</code>

<code>    </code><code>Useless obj1(10);</code>

<code>    </code><code>Useless obj2=5;</code>

说明:

//显式调用构造函数 ”explicit Useless(int k);”

Useless obj1(10);

//隐式调用构造函数 ”explicit Useless(int k);”。由于有explicit修饰,发生编译错误。

//error: conversion from ‘int’ to non-scalar type ‘Useless’ requested

//Useless obj2=5;

      本文转自FrankNie0101 51CTO博客,原文链接:http://blog.51cto.com/frankniefaquan/1934789,如需转载请自行联系原作者

继续阅读