回答といえるかどうかは分かりませんが...
まず初めの例の、(int) + (int)
に暗黙の型変換をやってくれる例についてですが、こちらがエラーが出ない方がどちらかと言えば不思議な事だと思いますし、このようなコードを残しておくのは得策では無いと思います(C++のバージョン変更などで動かなくなる可能性が残っているので)
C#言語とかだと即コンパイルエラーですね😅
スクリプト系言語だったらコンパイルは通る上に、実行時に変な値になってエラー元が見つからない...なんてことにもなりかねません。
(例)PHPとかでは2 + "abc123"
の値が125
みたいにエラーにならずに実行されますからね😅
そして、推測ですいませんが、intには暗黙的に型変換してくれるのに、stringにはしてくれないのは、stringがクラスだからだと思います。intはデータ型なので推論が効くのかなぁ?といった感じですね👀
(中身はcharのコレクションでしょうね👀vector<char>なのかな?🤔)
次に、何故(string) + (string)
にしてくれないのか...なんですが、変換してくれない方が納得できる理由がいくつかあります。
例えば...convertクラスに型変換operatorが2種類あり、どちらの方にもoperator +
の定義があったらどうでしょう?
a + b
という所からどちらのoperator +
を使えば良いのか分からないですよね😅
なのでconvert
クラスにoperator int
とoperator float
を定義したらエラーが出るかもしれないですよ👀
ただ、実行コードが
C++
1convert a, b;
2int c = a + b;
ならもしかしたら大丈夫かもしれません(そんなにコンパイラ賢いかな🤔)。
でもこれでも良いコードとは思えません。
例えば将来的にconvert
がoperator TestClass
を実装することになった。
しかし、TestClass
にはint operator +(TestClass, TestClass)
が定義されていた。
となると、また(int) + (int)
なのか(TestClass) + (TestClass)
なのか分からなくなります。
単純に、convert
クラスにint operator +(convert, convert)
が追加されても挙動が変わってしまいますしね👀
実は私はC++でautoを使った経験が無いのですが、「型宣言の省略は右辺に型名がある場合」とした方が無難だと思います。自分でそのときは分かっていても可読性は下がってしまいますからね🥺
C++
1// 別ファイルでMyFloatの定義
2MyFloat a, b;
3auto c = a.Plus(b);
上記のように書かれていたら、99%の人はcがMyFloat
型だと推測するでしょうが、実質の所何型でもあり得るんですよね😅
別の人がこんなコード書いていて、「当然cはfloat型だよ!」とか言われたらイラッとしますよね😅
auto
と書かずにfloat
と書いていたならまだ少しは許せますがww
C++
1convert a, b;
2auto c = (int)a + (int)b;
やはり上記のように書くのが良いと思います(autoはintでもいい)。これなら(int) + (int) = (int)
であることは常識なのでautoを使っていても可読性は落ちません(autoの方が長いけど😅)。
C++
1int plus(int left, int right) {
2 return left + right;
3}
4
5convert a, b;
6int c = plus(a, b);
このように引数に渡すときに暗黙の型変換を使うならまだマシではあるんですが、関数をオーバーロードできる仕様上すこし微妙なところ👀(同一ファイルなら許されるかな🤔)
でも右辺にint型の明記がないので、私は左辺にautoは使わないです。
auto c = Color.Red;
みたいなときならautoは便利かもしれませんね😊
基本的に演算子のオーバーロードはかなり神経質に実装しないととても分かりにくいコードになりやすいのが注意です👀...とかいいながら私は学生時代ガンガン定義して、1年後に理解できずに撃沈してましたが😅
小ネタですがC#言語の型変換(例えばint型に変換)は...
Explicit
とImplicit
の2種類あるぐらいです。
前者は暗黙的な型変換を許さない(絶対キャストをつける)、後者は暗黙的な型変換を許す...という意味です。
おそらく暗黙的な型変換を許しすぎて、分かりづらいコードを書く人が多かったのでこのような使い分けが出てきたのだと思います👀(初めにPHPの例を挙げましたが"abc123"
を123
に暗黙的にキャストされちゃ嫌ですよね👀。そういうときはExplicitでintに変換できるようにしておくと言うことです。まぁ...キャストでやってよい処理かどうかはおいといて😅)
参考になれば幸いです😊
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/03/29 13:51
2022/03/29 14:13
2022/03/30 15:38