[解決済み] explicit キーワードの意味は?
2022-03-16 15:37:37
質問
とは何ですか?
explicit
キーワードはC++でどういう意味ですか?
どのように解決するのですか?
コンパイラは、関数へのパラメータを解決するために、1つの暗黙の変換を行うことが許されています。これはどういうことかというと、コンパイラは関数へのパラメータを解決するために、暗黙のうちに1つの変換を行うことが許されています。 シングルパラメータ を使用して、ある型から別の型に変換し、パラメータとして正しい型を取得します。
暗黙の変換に使用できるコンストラクタを持つクラスの例を示します。
class Foo
{
private:
int m_foo;
public:
// single parameter constructor, can be used as an implicit conversion
Foo (int foo) : m_foo (foo) {}
int GetFoo () { return m_foo; }
};
以下は
Foo
オブジェクトを作成します。
void DoBar (Foo foo)
{
int i = foo.GetFoo ();
}
で、ここで
DoBar
関数が呼び出されます。
int main ()
{
DoBar (42);
}
引数は
Foo
オブジェクトではなく
int
. しかし
Foo
は
int
というわけで、このコンストラクタを使ってパラメータを正しい型に変換することができます。
コンパイラは、各パラメータに対して一度だけこの処理を行うことが許されています。
をプレフィックスとする
explicit
キーワードをコンストラクタに追加すると、コンパイラがそのコンストラクタを暗黙の変換に使用できなくなります。上記のクラスにこのキーワードを追加すると、関数呼び出しの際にコンパイラ・エラーが発生します。
DoBar (42)
. のように、明示的に変換を呼び出す必要があります。
DoBar (Foo (42))
このようにしたい理由は、バグを隠してしまうような偶発的な構築を避けるためです。
工夫された例
-
あなたが持っているのは
MyString
クラスは、指定されたサイズの文字列を構築するコンストラクタを備えています。 また、関数print(const MyString&)
(また、オーバーロードprint (char *string)
を呼び出すとprint(3)
(あなたが 実際に を呼び出すつもりだった。print("3")
). 3"と表示されるかと思いきや、長さ3の空の文字列が表示されます。
関連
-
[解決済み] テスト
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ 非推奨の文字列定数から「char*」への変換について
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる