explicit 关键字的主要作用就是防止定义对象时的隐式转换。下面的代码如果去掉explicit则可以通过编译运行。
#include <iostream>
using namespace std;
class Explicit_learn {
public:
//explicit
explicit Explicit_learn(int parm = 0, double final = 0) {
score = parm;
final_score = final;
}
void outScore(ostream &out) const {
out << "score is : " << score << endl;
out << "final_score is : " << final_score << endl;
}
private:
int score;
double final_score;
};
int main() {
Explicit_learn huan = 25.9;
Explicit_learn jarek(13, 25);
jarek.outScore(cout);
huan.outScore(cout);
return 0;
}
如果对于一个需要类类型参数的函数,如果想传值时进行隐式转换,那么构造函数就不能用explicit进行声明。
还有一个需要注意的问题,就是如果想进行类似代码中的转换,需要通过传值调用(pass-by-value)或者是传常引用(pass-by-const reference),如代码中所示
#include <iostream>
using namespace std;
class Explicit_learn {
public:
//explicit
Explicit_learn(int parm = 0, double final = 0) {
score = parm;
final_score = final;
}
/*
Explicit_learn(double final = 0, int parm = 0) {
score = parm;
final_score = final;
}
*/
void outScore(ostream &out) const {
out << "score is : " << score << endl;
out << "final_score is : " << final_score << endl;
}
private:
int score;
double final_score;
};
void outExp(Explicit_learn rhs) {
rhs.outScore(cout);
}
//==========================================
//这个函数无法实现想要的结果
void outExp_ref(Explicit_learn &rhs) {
rhs.outScore(cout);
}
void outExp_cref(const Explicit_learn &rhs) {
rhs.outScore(cout);
}
int main() {
Explicit_learn huan = 25.9;
Explicit_learn jarek(50);
//huan.outScore(cout);
//jarek.outScore(cout);
outExp(huan);
outExp(13);
outExp_cref(huan);
outExp_cref(14);
outExp(jarek);
outExp(20);
outExp_cref(jarek);
outExp_cref(21);
return 0;
}