2016-10-02 4 views
3

C++にはタイプセーフな機能とそうでない機能があります。 C++型の安全性のC++は部分型安全言語であると言うのは正確ですか?

例:型の安全性のC++不足の

char c = 'a'; 
int *p = &c; // this is not allowed (compiler error) 

例:

int *p;  // I don't have to initialize p, and so it will have some junk/random value 
*p = 12345; // this will probably lead to segmentation fault! 

私はC++がタイプセーフ言語ではありません記事のカップルで読んだことがあります。これを非安全な言語と見なすことができますか、それは部分的に型安全な言語であると言うのがより正確ですか?

+11

私はあなたの2番目の例は型の安全とは関係がないと言います。 – Hurkyl

+2

これは単なる未定義の未定義の動作です。 – user2296177

+3

C++はタイプセーフな言語です。概念を混在させないでください。型の安全性には型があり、無効なポインタの逆参照は型とは関係ありません。 – Jack

答えて

2

これは、C++が部分的に安全な言語を入力していると言うこと実質的に意味のある合理です。

C++は、高レベルのポータブルアセンブリ言語の一種として設計された1970年代半ばから後半までの拡張で、Unixの移植性を高め、保守しやすくしました。 C++は新しい機能のために型の安全性を追加しましたが、主にCと互換性があることを目標にしていました(特にヘッダを含む既存のCライブラリをすべて使用していました)。特に

、C++はCでCからポインタへの配列の崩壊を持っ++それは順番に索引付けが、未定義とすることができるBaseへのポインタにDerivedのアレイからの暗黙的な変換を可能にするためには、安全入力されていません動作。

1

あなたが与えている例は、「型の安全性」に全く違反していません。ここで:型の安全性のC++不足の

例:その例*p

int *p;  // I don't have to initialize p, and so it will have some junk/random value 
*p = 12345; // this will probably lead to segmentation fault! 

intであり、あなたはそれをintで数12345を割り当てています。

intに別のintを割り当てているため、コンパイラはタイプシステムに違反することを許可していません。

intにアクセスするために参照解除するポインタが初期化されていないという事実は、潜在的なクラッシュを引き起こしますが、型の安全性とは関係ありません。

これはクラッシュしません。

int* p = new int; 
*p = 12345; 

ここでは、別のint*p)にint12345を)書いているが、今回はあなたが(*p)に書いているintが実際に存在します。

コンパイラがポインタの完全性をチェックしていないタイプの安全性ではありません。

+0

'int'変数(' int i = 12345')があれば型の安全性について疑問があります。そして、 'int'変数を関数ポインタ(' i() ')、コンパイラは私がそうするのを妨げます。これは、私が関数ポインタとして 'i'を扱おうとしたときにタイプセーフティに違反したか、またはこれが型安全性に関係しないためですか? – Tom

+0

@Tomはい、タイプ違反です。タイプによって、オブジェクトに対して実行可能な操作が決まります。 – Galik

関連する問題