explicit 修饰只有一个参数的构造函数,以防止从参数类型到目标类类型的隐式转换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
// stdmove.cpp -- using std::move() #include <iostream> #include <utility> using std::cout;
using std::endl;
// use the following for g++4.5 // #define nullptr 0 // interface class Useless
{ private :
int n; // number of elements
char * pc; // pointer to data
static int ct; // number of objects
public :
Useless();
explicit Useless( int k);
Useless( int k, char ch);
Useless( const Useless & f); // regular copy constructor
~Useless();
Useless & operator=( const Useless & f); // copy assignment
void ShowObject() const ;
}; // implementation int Useless::ct = 0;
Useless::Useless() { cout << "enter " << __func__ << "()\n" ;
++ct;
n = 0;
pc = nullptr;
ShowObject();
cout << "leave " << __func__ << "()\n" ;
}
Useless::Useless( int k) : n(k)
{ cout << "enter " << __func__ << "(k)\n" ;
++ct;
pc = new char [n];
ShowObject();
cout << "leave " << __func__ << "(k)\n" ;
} Useless::Useless( int k, char ch) : n(k)
{ cout << "enter " << __func__ << "(k, ch)\n" ;
++ct;
pc = new char [n];
for ( int i = 0; i < n; i++)
pc[i] = ch;
ShowObject();
cout << "leave " << __func__ << "(k, ch)\n" ;
} Useless::Useless( const Useless & f): n(f.n)
{ cout << "enter " << __func__ << "(const &)\n" ;
++ct;
pc = new char [n];
for ( int i = 0; i < n; i++)
pc[i] = f.pc[i];
ShowObject();
cout << "leave " << __func__ << "(const &)\n" ;
} Useless::~Useless() { cout << "enter " << __func__ << "()\n" ;
ShowObject();
--ct;
delete [] pc;
cout << "leave " << __func__ << "()\n" ;
} Useless & Useless::operator=( const Useless & f) // copy assignment
{ cout << "enter " << __func__ << "(const &)\n" ;
ShowObject();
f.ShowObject();
if ( this == &f)
return * this ;
delete [] pc;
n = f.n;
pc = new char [n];
for ( int i = 0; i < n; i++)
pc[i] = f.pc[i];
ShowObject();
cout << "leave " << __func__ << "(const &)\n" ;
return * this ;
} void Useless::ShowObject() const
{ cout << "\t this=" << this << ", ct=" << ct;
cout << ", pc=(" << n << ", " << ( void *)pc << ", " ;
if (n == 0)
cout << "(object empty)" ;
else
for ( int i = 0; i < n; i++)
cout << pc[i];
cout << " )." << endl;
} int main()
{ Useless obj1(10);
Useless obj2=5;
} |
说明:
//显式调用构造函数 ”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,如需转载请自行联系原作者