引言
本文介绍了 C++ 中 explicit
关键字的用法.
原文地址: C++ explicit 用法
欢送拜访我的博客: http://blog.duhbb.com/
explicit 作用
在 C++中, explicit
关键字用来润饰类的构造函数, 被润饰的构造函数的类, 不能产生相应的隐式类型转换, 只能以显式的形式进行类型转换.
explicit
应用注意事项:
explicit
关键字只能用于类外部的构造函数申明上.explicit
关键字作用于单个参数的构造函数 (多个参数也实用, 但必须只有一个参数须要赋值, 其余的参数有默认值).- 在 C++ 中,
explicit
关键字用来润饰类的构造函数, 被润饰的构造函数的类, 不能产生相应的隐式类型转换. - it cannot be used for
implicit conversions
andcopy-initialization
多个参数的状况
其实对于下面的第二点我是存疑的, 因为 CPP Reference explicit specifier 中的例子表明 explicit
是能够用于多个参数的.
例子
例 1 根底例子
#include <bits/stdc++.h>using namespace std;class Test1 {public: Test1(int n) { m_num = n; }private: int m_num;};class Test2 {public: explicit Test2(int n) { m_num = n; }private: int m_num;};int main() { Test1 t1 = 12; // 隐式调用构造函数胜利 Test2 t2 = 12; // 编译谬误, 不能隐式调用其构造函数 Test2 t2(12); // 显式调用胜利 return 0;}
例 2 CPP Reference 中的例子
上面是 CPP Reference explicit specifier 中的例子, 感觉更全面一点:
struct A{ A(int) { } // converting constructor A(int, int) { } // converting constructor (C++11) operator bool() const { return true; }};struct B{ explicit B(int) { } explicit B(int, int) { } explicit operator bool() const { return true; }};int main(){ A a1 = 1; // OK: copy-initialization selects A::A(int) A a2(2); // OK: direct-initialization selects A::A(int) A a3 {4, 5}; // OK: direct-list-initialization selects A::A(int, int) A a4 = {4, 5}; // OK: copy-list-initialization selects A::A(int, int) A a5 = (A)1; // OK: explicit cast performs static_cast if (a1) ; // OK: A::operator bool() bool na1 = a1; // OK: copy-initialization selects A::operator bool() bool na2 = static_cast<bool>(a1); // OK: static_cast performs direct-initialization// B b1 = 1; // error: copy-initialization does not consider B::B(int) B b2(2); // OK: direct-initialization selects B::B(int) B b3 {4, 5}; // OK: direct-list-initialization selects B::B(int, int)// B b4 = {4, 5}; // error: copy-list-initialization does not consider B::B(int,int) B b5 = (B)1; // OK: explicit cast performs static_cast if (b2) ; // OK: B::operator bool()// bool nb1 = b2; // error: copy-initialization does not consider B::operator bool() bool nb2 = static_cast<bool>(b2); // OK: static_cast performs direct-initialization}
总结
C++ explicit
还是比拟好了解的, 次要就是防止隐式转换, C++ 中的转化真的是太灵便了, 容易搞出 bug 来.
原文地址: C++ explicit 用法
欢送拜访我的博客: http://blog.duhbb.com/