【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 处理隐式数据类型转换在运行计划中的增强中,我提到了隐式数据类型转换添加对于数据分布非常不平均的表.评估的数据行数与实际值有非常大出入的问题,进一步測试之 ...
随机推荐
- shiro注解@RequiresPermissions多权限任选一参数用法
@RequiresPermissions(value={"xxx:xxx","xxx:xxx"},logical=Logical.OR)
- C# Winform 使用Application.Exit重新启动应用程序example
Application.Exit会在所有前台线程退出后,退出应用, Environment.Exit则立即终止进程,相比之下Environment.Exit更狠些 private static voi ...
- Windows store app[Part 3]:认识WinRT的异步机制
WinRT异步机制的诞生背景 当编写一个触控应用程序时,执行一个耗时函数,并通知UI更新,我们希望所有的交互过程都可以做出快速的反应.流畅的操作感变的十分重要. 在连接外部程序接口获取数据,操作本地数 ...
- 使用django rest framework写POST和GET接口
https://www.cnblogs.com/Jack-cx/p/9351633.html
- 创建第一个MVC专案--初识MVC
MVC1.0正式版2009就上市了,可自己今年才开始去接触,汗颜~ 自己在学的过程中也看过一些文章,很多都是大致介绍的没有连接数据库实现下操作,直至自己买了本后发现MVC有很强大的数据库操作类已封装好 ...
- C# 读Autofac源码笔记(1)
最近在看Autofac的源码. Autofac据说是.net中最快的IOC框架,具体没有实验,于是看看Autofac具体是怎样实例化实体. image.png 如上图所示,Autofac使用的是表 ...
- CF223C【Partial Sums】(组合数学+乱搞)
题面 传送门 题解 orz zzk 考虑这东西的组合意义 (图片来自zzk) \(a_i\)这个元素对\(k\)阶前缀和的第\(j\)个元素\(s_{k,j}\)的贡献就等于从\((0,i)\)走到\ ...
- 制作基于centos可以ssh连接的容器以及tomcat容器
可以ssh连接的centos容器 参考:http://blog.csdn.net/mexel310/article/details/51705777 一. pull好镜像后,运行容器 1. docke ...
- leetcode-830-Positions of Large Groups
题目描述: In a string S of lowercase letters, these letters form consecutive groups of the same characte ...
- 2016级算法第四次上机-G.ModricWang的序列问题 II
1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...