Effective C++学习笔记之explicit
关键字:
explicit意思为“明确的”和“清楚的”,是C++的关键词,意在阻止隐式类型的转换;
使用原因:
有时候不合法的隐式转换,会让乖巧听话的程序变得不可控。所以适当地使用explicit关键字是有必要的。
如 string str = 'a'; 这样的赋值是不能通过编译,错误原因是 invalid conversion from ‘char’ to ‘const char*,也就是“不能做隐式char->const char转换”。
注意事项:
1、只能用于类内部构造函数的声明前,不能用于类外部构造函数的实现前;
2、只能作用于构造函数的一个参数、或者有默认值的多个参数。
用途举栗:
现有一个testDog的函数,函参是一个Dog类的对象。Dog类只提供了一个设置成员变量age的构造函数。
1、传入name的构造函数,没有使用explicit关键字,直接对testDog传入一个string或者char *,也能得到想要的输出。其中隐式地将 "Huskie" 转换为一个“name = Huskie,age = 0”的Dog类对象。
2、传入age的构造函数,使用了explicit关键字,参数传入int型的2会编译不过,表示“不能做隐式int->Dog转换”。将Dog(2)当做函参传入就会解决此问题。
#include <iostream>
using namespace std; class Dog
{
public:
string name;
int age; explicit Dog(int age_)
{
name = "Huskie";
age = age_;
}
Dog(const char* p)
{
name = p;
age = ;
}
}; void testDog(Dog onedog)
{
cout<<"Dog's name is :"<<onedog.name<<", age :"<<onedog.age<<endl;
} int main()
{
string str = 'a';//invalid conversion from ‘char’ to ‘const char*
//即编译出错,不能做隐式char->const char转换 Dog dog1 = ;//编译出错,不能做隐式int->Dog转换
Dog dog2 = "haha"; cout<<"Test dog:"<<endl;
testDog("Shiba Inu");
testDog();//编译出错,不能做隐式int->Dog转换
testDog(Dog());
return ;
}
Effective C++学习笔记之explicit的更多相关文章
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor
Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
随机推荐
- LDA背景资料
[https://zhuanlan.zhihu.com/p/30226687] LDA模型的前世今生 在文本挖掘中,有一项重要的工作就是分析和挖掘出文本中隐含的结构信息,而不依赖任何提前标注的信息.L ...
- HttpClient与浏览器调用服务接口差异
我用httpclient访问接口,统计图有些不均匀,差距较大 ,有时只有几十毫秒,下图看到这种情况占多数,600-800毫秒之间的算是浏览器正常的产生调用接口的时间耗时 然后用jmeter跑时都是均值 ...
- 我的博客:C# PHP J2ee Java Android js WP Asp.net mvc Python
<p><A target="_blank" href="http://blog.163.com/hr_company_product/" &g ...
- Spark ML逻辑回归
import org.apache.log4j.{Level, Logger} import org.apache.spark.ml.classification.LogisticRegression ...
- Python之逻辑回归
代码: import numpy as np from sklearn import datasets from sklearn.linear_model import LogisticRegress ...
- [20180614]删除bootstrap$记录无法启动2.txt
[20180614]删除bootstrap$记录无法启动2.txt --//前几天看链接http://www.xifenfei.com/2018/05/willfully-delete-bootstr ...
- MySQL5.7 GTID学习笔记,[MySQL 5.6] GTID实现、运维变化及存在的bug
GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的. 下表整理 ...
- Emacs中使用shell(调出terminal)
在Emacs中使用shell(调出terminal) 方法: M-x eshell 注意:不能使用 M-x shell,这样调用的是 cmd命令,一些命令无法使用
- Django框架的使用教程--mysql数据库[三]
Django的数据库 1.在Django_test下的view.py里面model定义模型 from django.db import models # Create your models here ...
- 查询css相关属性的网站
mozalla developer netwoke https://developer.mozilla.org/zh-CN/docs/Web/CSS/background 布局,div+css:htt ...