您的位置:首页 > 编程语言 > C语言/C++

1.默认构造函数和explicit关键字的使用

2016-06-04 09:26 381 查看
1.默认构造函数

C++里面有默认的构造函数,这样的构造函数要么不带有参数,要么每个参数都有相应的缺省值。下面我们来看一个例子:

#include <iostream>

using namespace std;

class A
{
public:
A()
{

}
};

int main()
{
A aObj1();
return 0;
}


上面的我们定义了一个A类型的对象,使用了默认的构造函数。下面我们再来看一段代码:

#include <iostream>

using namespace std;

class A
{
public:
A(int i = 0, bool b = true)
{

}
};

int main()
{
A aObj1();
return 0;
}


2.explicit关键字

explicit关键字可以阻止对象被隐形类型转换,有些时候编译器会做一些人们无法预知的类型转换,下面我们来看一段代码:

#include <iostream>
using namespace std;

class B{

public:
B(int x = 0, bool b = true)
{
}
};

void doSomething(B bObject)
{
}

int main()
{
B bObj1;
doSomething(bObj1); // 没有问题
B bObj2(28);        // 也没有问题

// 我去,竟然也没有问题,但是默认发生了隐式的转换(把一个整形隐式的转换成的一个B类型),但是这个是我们不想要
doSomething(28);

doSomething(B(28));  // 没有问题

return 0;
}
红色加粗的代码在编译的时候没有出错是因为 int 和 B隐式的发生了类型转换,是不是很可怕,我们可以使用explicit关键字来阻止,看下面代码:

#include <iostream>
using namespace std;

class B{

public:
explicit B(int x = 0, bool b = true)
{
}
};

void doSomething(B bObject)
{
}

int main()
{
B bObj1;
doSomething(bObj1); // 没有问题
B bObj2(28);        // 也没有问题

// 报错:error C2664: 'doSomething' : cannot convert parameter 1 from 'const int' to 'class B'
doSomething(28);

doSomething(B(28));  // 没有问题

return 0;
}
所以一般构造函数之前添加一个 explicit 关键字会使得程序安全性更高,不会发生类型的隐式转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息