【C++基础之十七】抑制由构造函数定义的隐式转换

原创 2013年11月28日 15:38:30

原创作品,转载请标明http://blog.csdn.net/jackystudio/article/details/17006543


有时候构造函数的隐式转换可以帮我们不少忙,但有时候它也会帮倒忙。所以我们应该要控制它,而不是让它无脑操作。


1.示例

先看一段代码。

#include "stdafx.h"
using namespace std;

class A
{
public:
	A(int v):var(v){};//带一个int型值的构造函数
	bool isSame(const A& ref) const {return var==ref.var;}//判等函数
private:
	int var;//成员变量var
};

int _tmain(int argc, _TCHAR* argv[])
{
	A a(5);//构造a对象
	A b(5);//构造b对象
	if (a.isSame(b))
		cout<<"a==b"<<endl;
	else
		cout<<"a!=b"<<endl;
}

代码定义了类A,包含一个int型成员变量var,构造函数需要传入var的初始值,isSame函数用于判断2个类A的对象是否相等(通过判断成员变量var值)。上述代码获得结果是a==b。如果A b(3),获得的结果就是a!=b。


2.构造函数定义引起的隐式转换

由于构造函数需要传入一个int型初始值,因此可以认为这是一个隐式转换,把一个int型值转换为一个A类型的对象。所以如果修改main函数为如下代码。

int _tmain(int argc, _TCHAR* argv[])
{
	A a(5);//构造a对象
	if (a.isSame(5))//这里会因为构造函数的隐式转换,因而正确执行isSame
		cout<<"a==b"<<endl;
	else
		cout<<"a!=b"<<endl;
}
这看起来不错,好像还省了不少力气,但是这样的使用依赖于用户是否有相应的需求,有时候它将成为一个bug。所以更好的办法是抑制这种由构造函数引起的隐式转换。


3.抑制抑制由构造函数定义的隐式转换

在构造函数中引入explicit可以帮我们解决这个问题。

class A
{
public:
	explicit A(int v):var(v){};//引入explicit关键字
	bool isSame(const A& ref) const {return var==ref.var;}
private:
	int var;
};

int _tmain(int argc, _TCHAR* argv[])
{
	A a(5);
	if (a.isSame(5))
		cout<<"a==b"<<endl;
	else
		cout<<"a!=b"<<endl;
}
看看结果:
error C2664: “A::isSame”: 不能将参数 1 从“int”转换为“const A &”
1>        原因如下: 无法从“int”转换为“const A”
1>        class“A”的构造函数声明为“explicit”
好了,这样一来构造函数就无法进行隐式转换,


4.为转换进行显式使用构造函数

这时候仍想进行转换的话,显式使用构造函数吧。

int _tmain(int argc, _TCHAR* argv[])
{
	A a(5);
	if (a.isSame(A(5)))//显式使用构造函数
		cout<<"a==b"<<endl;
	else
		cout<<"a!=b"<<endl;
}

5.总结

除非有明显的理由想利用构造函数定义的隐式转换,否则设置explicit可以避免一些错误,当需要进行转换的时候,由用户显式地调用构造函数。当然C++的临时对象都是const,如果isSame函参不是const型,则隐式调用构造函数时生成的临时对象也无法传入。


版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jackyvincefu/article/details/17006543

C++基础

介绍C++的基本语法,通过实践的方式讲解C++每一个知识点,应用大量示例展现每一个知识点的多种用法,强化训练,使学习者掌握知识点.
  • 2016年07月28日 22:14

C++拾趣——类构造函数的隐式转换

        之前看过一些批判C++的文章,大致意思是它包含了太多的“奇技淫巧”,并不是一门好的语言。我对这个“奇技淫巧”的描述颇感兴趣,因为按照批判者的说法,C++的一些特性恰巧可以让一些炫耀技术...
  • breaksoftware
  • breaksoftware
  • 2017-02-08 12:33:46
  • 1552

关于C++里隐式调用带参构造函数

#include using namespace std; class B { public: B() { cout
  • zhu2695
  • zhu2695
  • 2013-03-03 15:17:39
  • 531

隐式类型转换及explicit构造函数

在C++语言中,某些类型之间有关联,即可以相互转换。这些类型转换有时是自动执行的,无须程序员的介入,有时甚至不需要程序要了解。被称为“隐式转换”。 在下面这些情况下,编译器会自动地转换运算对象的类型...
  • liminwang0311
  • liminwang0311
  • 2017-03-07 22:18:00
  • 198

单参数的构造函数带来的隐式转换

构造函数会引起一个不引人注意的问题: 用单个实参来调用的构造函数定义了从从形参类型到类类型的一个隐式转换。 举个例子说: class Sales_item { public: std::ist...
  • thefutureisour
  • thefutureisour
  • 2012-06-30 22:49:51
  • 3479

C++转换构造函数和隐式转换函数

源地址:http://www.2cto.com/kf/201311/258753.html
  • u013529907
  • u013529907
  • 2014-07-23 15:38:30
  • 310

转换构造函数和隐式构造函数

// converthiddenconstructor.cpp : Defines the entry point for the console application. // #include ...
  • g1ider
  • g1ider
  • 2016-04-25 23:25:37
  • 285

C++中的explicit作用功能(防止隐式转换)

C++中的explicit C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 C++中, 一...
  • SprintfWater
  • SprintfWater
  • 2013-04-03 18:44:14
  • 1575

C++中显式和隐式初始化和类型转换

1.显式和隐式初始化 有一个类的构造函数为: A(int i) : m_i(i){}1.1 C++显式初始化内置类型:int ival = 1024;string hello = "Hello wor...
  • ljq550000
  • ljq550000
  • 2011-06-22 16:20:00
  • 759

C++修饰构造函数的explicit关键字

C++ explicit关键字的作用主要是用来修饰类的构造函数,表明该构造函数是显式的,禁止单参数构造函数的隐式转换。 如果C++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作...
  • w418367716
  • w418367716
  • 2015-05-25 16:28:28
  • 756
收藏助手
不良信息举报
您举报文章:【C++基础之十七】抑制由构造函数定义的隐式转换
举报原因:
原因补充:

(最多只允许输入30个字)