C++においてexplicitについて調べると
explicit <エクスプリシット>
「明示的」
引数をひとつだけ受け取るコンストラクタに付けることのできる C++ 言語のキーワード。
クラスを関数の引数として使う場合、その関数には、クラスのコンストラクタの引数になっているものも渡すことができてしまう。これは暗黙的にコンストラクタが呼び出されるからである。このとき、「コンストラクタの引数」がまるで「関数の引数」であるかのように振る舞ってしまい、本来ならコンパイルエラーとなって欲しい場面でも、見えない部分でコンストラクタが呼ばれることでコンパイルが通ってしまう。その結果、想定していない動作をする可能性がある。
そこで、コンストラクタには「暗示的に呼び出せない」ようにするためのキーワードがある。それが explicit である。このキーワードを付けたコンストラクタは、必ず明示的に呼び出される必要があり、前述のようなことをしようとするとコンパイル時にエラーが発生する。
となっていました
「クラスを関数の引数として使う場合、その関数には、クラスのコンストラクタの引数になっているものも渡すことができてしまう。」
のところが分かりません
具体例で説明してください
例えば
template<class CharType,class Attr=char_traits<CharType>,
Class Allocator=allocator<T> >class basic_string
クラスのコンストラクタが
explicit basic_string(const Allocator &a=Allocator());
ですがこのケースについて説明していただければ幸いです
No.2
- 回答日時:
> explicit basic_string(const Allocator &a=Allocator());
> ですがこのケースについて説明していただければ幸いです
explicitでないと、Allocatorからbasic_stringへの暗黙の変換が起こってしまうことになります。
std::allocator<char> a;
std::string str = a; // できちゃう
basic_stringの実装者はその変換を望まないのでexplicitにしたのでしょう。
No.3
- 回答日時:
> f(3)はf(A(3))を意味するということですか?
YES
> これで何かまずい例はありますか?
int から A に明示的に変換して欲しくないとき。
class A { public: A(int); };
class B { public: B(int); };
void f(const A&);
void f(const B&);
int main() {
f(3); // エラー:どっちを呼ぶか決定できない
return 0;
}
この回答への補足
A a=b;//(1)
が
A a(b);//(2)
を意味するのはaとbが厳密に同じA型であるときだけにしていればこのような混乱は発生しなかったのに柔軟性を求めすぎた結果ですね
aとbが厳密に同じ型でなくても(1)と(2)が同じということにすることによるメリットはあるのでしょうか?
basic_string str="moji";
などは
basic_string str("moji");
としないといけないという風にしたからといってそれほど不便はないと思うのですが
むしろexplicitなるキーワードを追加しなくてすみ混乱しなくなりバグも少なくなるような気がします
なにか意見をいただければ幸いです
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語初心者です、、、お助けください 2 2023/03/14 20:08
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c++,ある関数のクラスから別の...
-
クラス間でのデータ参照
-
内部クラスのインスタンスを外...
-
Java リフレクションについて
-
リフレクション
-
Java
-
java-別クラスの変数の使い方を...
-
関数内の変数に<summary>コメン...
-
整数値を任意のオブジェクトを...
-
リレーションエンティティクラ...
-
RPGの主人公、町人、敵キャラの...
-
Javaアプリケーションについて
-
違うクラスからの変数の共有化
-
二つの変数の値を入れ替えるメ...
-
C# log4netの使い方
-
エクセルVBAで、条件に一致する...
-
3年間同じクラスになる確率
-
インスタンス参照でアクセスで...
-
ワイルドカード<?>と型パラメー...
-
「天声人語」をインターネット...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
C#でほかのファイルにある自作...
-
C++でfriendクラスにしているの...
-
java-別クラスの変数の使い方を...
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
ひとつのファイルにクラスは1つ?
-
Java
-
import と extends について
-
継承したクラス側のクラス名の取得
-
SwingでgetContentPaneのエラー...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
アップキャスト、ダウンキャス...
-
C# インターフェイスの実装
-
visual studioのデザイナ画面で...
おすすめ情報