博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ explicit 关键字
阅读量:6815 次
发布时间:2019-06-26

本文共 2782 字,大约阅读时间需要 9 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
大话转岗 PHP 开发小结
查看>>
React的状态管理
查看>>
寻找一种易于理解的一致性算法(扩展版)下
查看>>
MySQL - 高可用性:少宕机即高可用?
查看>>
2018电影票房分析-谁才是票房之王
查看>>
程序员可以干到多少岁?
查看>>
Storm系列(六)storm和kafka集成
查看>>
东南亚的招聘骗局,程序员请注意!
查看>>
Android 获得View宽高的几种方式
查看>>
iOS正则表达式
查看>>
关于javascript的this指向问题
查看>>
Promise的理解和用法
查看>>
java B2B2C Springboot电子商城系统-高可用的服务注册中心
查看>>
Dubbo的总体架构
查看>>
Spring Cloud微服务架构代码结构详细讲解
查看>>
以太经典硬分叉:矿工欢喜、投资者欢庆、社区高兴的“三赢”之举
查看>>
我的友情链接
查看>>
LVS启(禁)用成员
查看>>
innobackupex 备份报错
查看>>
2016 IT 运维工作计划及学习
查看>>