在c++种explicit关键字只能用来修饰构造函数。
使用explicit可以禁止编译器自动调用拷贝初始化,
还可以禁止编译器对拷贝函数的参数进行隐式转换。
以下是编译器自动调用拷贝初始化:
#include<stdio.h>
#include<iostream>
//在c++种explicit关键字只能用来修饰构造函数。使用explicit可以禁止编译器自动调用拷贝初始化,还可以禁止编译器对拷贝函数的参数进行隐式转换。
namespace MyTest {
class ClassA
{
public:
explicit ClassA(int a);
~ClassA();
private:
};
ClassA::ClassA(int a)
{
std::cout << "ClassA" << std::endl;
}
ClassA::~ClassA()
{
}
void fun(ClassA a)
{
std::cout << "fun" << std::endl;
}
}
int main() {
MyTest::fun(1);
//如果在ClassA的构造函数声明前面不加explicit 被隐式转换为f(ClassA(1)) ,本来是1却被自动调用了ClassA(1)这就是拷贝初始化
//输出:"ClassA" "fun"
//如果在ClassA的构造函数声明前面加上explicit 则会报错:无法将参数 1 从“int”转换为“MyTest::ClassA”
system("pause");
return 0;
}
对拷贝函数进行隐式转换:
namespace MyTest2 {
class ClassB
{
public:
ClassB(int b) {
std::cout << "把整数转换成字符串" << std::endl;
};
ClassB(const char* b)
{
std::cout << "把字符数组转换成字符串" << std::endl;
};
~ClassB();
private:
};
ClassB::~ClassB()
{
}
}
int main() {
MyTest2::ClassB B = 'c';
//输出 把整数转换成字符串
//导致输出这个的原因
// 它把'c'的ASCII码传进去了,如果这样变成字符串那就得到一个数字,
// 而我们期待的是把'c'变成字符串。
system("pause");
return 0;
}