【c++】explicit 隐式类类型转换
上代码
#include <iostream>
#include <sstream>
using namespace std; class A
{
public:
A(const string &book = "ab") : s(book) {}
int same_s(const A &a) const
{ return s == a.s; }
private:
string s;
}; int main(int argc ,char **argv)
{
A c("aaa");
string m = "aaa";
cout << c.same_s(m) << endl;
}
究其因
same_s应该接收一个类A的对象参数,但是这里直接传了一个字符串对象。过程这样:编译器接收一个string的对象,利用构造函数 A(const string &book = "ab") 生成临时对象(隐性转换),然后传递给same_s,临时对象失效.
注意: explicit 只能用于类内部的构造函数的声明上。
explicit和构造函数一起使用.
explicit constructor指明构造函数只能显式使用,目的是为了防止不必要的隐式转化.
如何防止隐性转换
构造函数加关键字explicit
#include <iostream>
#include <sstream>
using namespace std; class A
{
public:
explicit A(const string &book = "ab") : s(book) {}
int same_s(const A &a) const
{ return s == a.s; }
private:
string s;
}; int main(int argc ,char **argv)
{
A c("aaa");
string m = "aaa";
cout << c.same_s(m) << endl;
}
结果出错

解决之道
字符串强制传递给构造函数
#include <iostream>
#include <sstream>
using namespace std; class A
{
public:
explicit A(const string &book = "ab") : s(book) {}
int same_s(const A &a) const
{ return s == a.s; }
private:
string s;
}; int main(int argc ,char **argv)
{
A c("aaa");
string m = "aaa";
cout << c.same_s(A(m)) << endl;
}
同理
对于 A a = string("hello")来说,如果参数为string的构造函数为explicit,则这样初始化是错误的;如果不是explicit,则这样初始化是正确的(先利用构造函数生成临时对象,再把临时对象通过赋值操作符复制到新创建的对象上)。
对比实验
对
#include <iostream>
#include <sstream>
using namespace std; class A
{
public:
A(const string a) : s(a) {}
private:
string s;
};
int main(int argc ,char **argv)
{
A a = string("hello");
}

错
#include <iostream>
#include <sstream>
using namespace std; class A
{
public:
explicit A(const string a) : s(a) {}
private:
string s;
};
int main(int argc ,char **argv)
{
A a = string("hello");
}
【c++】explicit 隐式类类型转换的更多相关文章
- C++ 隐式类类型转换
<C++ Primer>中提到: “可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换.” 这里应该注意的是, “可以用单个形参进行调用” 并不是指构造函数 ...
- C++ 隐式类类型转换和转换操作符
隐式类类型转换 C++语言定义了内置类型之间的几个自动转换.也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构 ...
- [C++]复制构造函数、赋值操作符与隐式类类型转换
问题:现有类A定义如下: class A{public: A(int a) //构造函数 { ...
- C++隐式类类型转化
隐式类类型转换:可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换 class Person { public: Person(): mName()name, mAge ...
- explicit:C++规定,当定义了只有一个参数的构造函数时,同时也定义了一种隐式的类型转换
explicit研究 explicit是C++中的关键字,不是C语言中的.英文直译是“明确的”.“显式的”意思.出现这个关键字的原因,是在C++中有这样规定的基础上:当定义了只有一个参数的构造函数 ...
- 实例理解scala 隐式转换(隐式值,隐式方法,隐式类)
作用 简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型.话不多说,直接测试 ImplicitHel ...
- Scala中的Implicit(隐式转换,隐式参数,隐式类)
文章来自:http://www.cnblogs.com/hark0623/p/4196452.html 转发请注明 代码如下: /** * 隐式转换 隐式参数 隐式类 */ //隐式转换 class ...
- scala中隐式转换之隐式类
/** * Created by root * Description :隐式类: * 1.其所带的构造参数有且只能有一个:并且构造器的参数是转换之前的对象 * 2.隐式类必须被定义在类,伴生对象和包 ...
- 也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强 (续)
在上一篇文章也谈SQL Server 2008 处理隐式数据类型转换在运行计划中的增强中,我提到了隐式数据类型转换添加对于数据分布非常不平均的表.评估的数据行数与实际值有非常大出入的问题,进一步測试之 ...
随机推荐
- 单例模式和HttpContext线程内唯一
单例模式 --> 多个用户会使用同一个EF,且这个EF一直不能释放,EF追踪的数据越来越多,服务器内存迟早爆炸(联想应用程序池,用户可能会用到被人用过的Application,里面的EF也是被用 ...
- 使用纯真IP库获取用户端地理位置信息
引言 在一些电商类或者引流类的网站中经常会有获取用户地理位置信息的需求,下面我分享一个用纯真IP库获取用户地理位置信息的方案. 正文 第一步:本文的方案是基于纯真IP库的,所以首先要去下载最新的纯真I ...
- linux杀进程
1.Linux杀进程的一个例子 (1)查看进程:ps -ef | grep 进程名 (2)杀进程:kill -9 进程名或者进程号 例如:杀tomcat的进程 (1)ps -ef | grep tom ...
- react-route简明学习
- classnofoundexception:org.springframework.ui.freemarker.FreeMarkerConfigurationFactory
这个是在整合freemarker的时候出现的问题,在添加依赖spring-context-support.jar之后就好了 但是我在搭建框架的时候出现的问题是明明添加了这个依赖,但是出现一个问题 出现 ...
- jquer 使用原生DOM对象
js中使document.getElementById("ID"); Jquery中可以使用$("#id") 或者$("#id").get( ...
- 封装log4j支持记录到testng
一.初始方案 自动化中需要把日志通过testng的Reporter.log来记录日志在报告中展示.开始是新增了一个日志类: ReporterLog.class import org.slf4j.Log ...
- 断电后gitlab报500错误启动出错
异常断电后,gitlab报500错误,重启无效 通过sudo gitlab-ctl reconfigure启动时, 提示 [execute] pgsql:could not connect to se ...
- UGUI Slider的onValueChanged事件
在本文,你将学到如何将UGUI Slider的onValueChanged事件进行统一管理. using System; using UnityEngine; using UnityEngine.UI ...
- DataGridView绑定list的注意事项
1.DataGridView数据绑定对比(DataTable与泛型List): 当DataGridView的DataSource是DataTable的时候,DataTable的数据改变时, ...