explicit 修饰只有一个参数的构造函数,以防止从参数类型到目标类类型的隐式转换。
<code>// stdmove.cpp -- using std::move()</code>
<code>#include <iostream></code>
<code>#include <utility></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 & f); </code><code>// regular copy constructor</code>
<code> </code><code>~Useless();</code>
<code> </code><code>Useless & operator=(</code><code>const</code> <code>Useless & 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 << </code><code>"enter "</code> <code><< __func__ << </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 << </code><code>"leave "</code> <code><< __func__ << </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 << </code><code>"enter "</code> <code><< __func__ << </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 << </code><code>"leave "</code> <code><< __func__ << </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 << </code><code>"enter "</code> <code><< __func__ << </code><code>"(k, ch)\n"</code><code>;</code>
<code> </code><code>for</code> <code>(</code><code>int</code> <code>i = 0; i < n; i++)</code>
<code> </code><code>pc[i] = ch;</code>
<code> </code><code>cout << </code><code>"leave "</code> <code><< __func__ << </code><code>"(k, ch)\n"</code><code>;</code>
<code>Useless::Useless(</code><code>const</code> <code>Useless & f): n(f.n) </code>
<code> </code><code>cout << </code><code>"enter "</code> <code><< __func__ << </code><code>"(const &)\n"</code><code>;</code>
<code> </code><code>pc[i] = f.pc[i];</code>
<code> </code><code>cout << </code><code>"leave "</code> <code><< __func__ << </code><code>"(const &)\n"</code><code>;</code>
<code>Useless::~Useless()</code>
<code> </code><code>--ct;</code>
<code> </code><code>delete</code> <code>[] pc;</code>
<code>Useless & Useless::operator=(</code><code>const</code> <code>Useless & f) </code><code>// copy assignment</code>
<code> </code><code>f.ShowObject();</code>
<code> </code><code>if</code> <code>(</code><code>this</code> <code>== &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 << </code><code>"\t this="</code> <code><< </code><code>this</code> <code><< </code><code>", ct="</code> <code><< ct; </code>
<code> </code><code>cout << </code><code>", pc=("</code> <code><< n << </code><code>", "</code> <code><< (</code><code>void</code><code>*)pc << </code><code>", "</code><code>; </code>
<code> </code><code>if</code> <code>(n == 0)</code>
<code> </code><code>cout << </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 < n; i++)</code>
<code> </code><code>cout << pc[i];</code>
<code> </code><code>cout << </code><code>" )."</code> <code><< 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,如需转载请自行联系原作者