当前位置:天才代写 > tutorial > C语言/C++ 教程 > 要害字explicit的用法

要害字explicit的用法

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:356

大概是我的C++基本欠好,记不得explicit是干嘛用的了,所以网上搜了下,想想照旧写下来,以免再忘,先来个例子,说明一下问题:

test.cc:
class A
{
public:
A(int a) : data(a){}
int data;
};
class B
{
public:
explicit B(int b) : data(b){}//就是这个了
int data;
};
void func_a()
{
A a = 0;
a = 1;
}
void func_b()
{
B b = 0;
b = 1;
}
int main()
{
func_a();
func_b();
return 0;
}

& gcc test.cc -o test

编译信息:

test.cc: In function 'void func_b()'
test.cc:29 error: no match 为 'operator='在 'b = 1'中
test.cc:14 B& B::operator=(const B&)

也就是说在func_b()中的语句 ‘b = 1;’ 错误,没有在类B中找到’=’的操纵符重载。而与类B沟通界说的类A中没有错误的原因就是因为类A的constructor没有声明为explicit,这就是所谓的隐式转换。

阐明一下:

A a = 0;

其实正确的写法应该是A a(0);

编译器认为这种写法是不类型的,但通过搜索,发明A中有一个没有被explicit修饰过的A(int a),可以举办隐式转换,这样的一句话酿成了

A tmp(0);
A a = tmp;//挪用默认的copy constructor

一句变两句了,所以提高效率要记得用A a(0); 而不要用A a = 0;

那么语句 a = 1; 也就相当于:

A tmp(1);
a = tmp;

这种转换不只产生于assignment,也大概产生于函数挪用,譬喻

func(A a){}
int main()
{
func(1);
}

雷同地,这个挪用func(1);也被隐式转换成了

A tmp(1);
fun(tmp);

class B的constructor被声明为了expcilit,编译器就认为你不想让编译器为你做隐式转换,所以func_b就error了。

so, explicit的浸染就是克制结构函数隐式转换。

 

    关键字:

天才代写-代写联系方式