組み込み型の変数は、次のように値を初期化できます。
int var = int();
int
このようにして、コードにゼロをハードコーディングせずにデフォルト値を取得します。
ただし、ポインターに対して同様のことをしようとすると:
int* ptr = int*();
コンパイラ(Visual C++ 10)はそれをコンパイルすることを拒否します(言うtype int unexpected
)。
同様の方法でポインタを値初期化するにはどうすればよいですか?
組み込み型の変数は、次のように値を初期化できます。
int var = int();
int
このようにして、コードにゼロをハードコーディングせずにデフォルト値を取得します。
ただし、ポインターに対して同様のことをしようとすると:
int* ptr = int*();
コンパイラ(Visual C++ 10)はそれをコンパイルすることを拒否します(言うtype int unexpected
)。
同様の方法でポインタを値初期化するにはどうすればよいですか?
typedef を使用して、ポインター型の名前を作成します。
typedef int *ip;
ip ptr = ip();
型の名前を定義するために複数の字句要素 (単語) を必要とする他の型 (例: 、 、 など) についても、同じ考え方が機能するはずunsigned long
です。long long
unsigned long long *
Type() のような構文を使用して Type* ポインターを値初期化するにはどうすればよいですか?
それはいけません。構文T()
は 5.2.3/1,2 で定義されています (C++03、C++11 FDIS ではわずかに異なる表現)。特に、第 2 段落は次のように述べています。
式 T() (T は非配列完全オブジェクト型または (おそらく cv 修飾された) void 型の単純型指定子 (7.1.5.2)) であり、指定された型 (値) の右辺値を作成します。 -初期化 (8.5);
つまりint()
、 は int 型の右辺値を作成し、それを値で初期化します。ここでの問題は、それint*
が単純な型指定子ではなく、精巧な型指定子であることです。文法における simple-type-specifier の定義は次のとおりです。
simple-type-specifier:
::opt nested-name-specifieropt type-name
::opt nested-name-specifier template template-id
char
wchar_t
bool
short
int
long
signed
unsigned
float
double
void
type-name は次のように定義されています。
type-name:
class-name
enum-name
typedef-name
これが、提案されたソリューションが機能する理由です。(直接またはテンプレートを介して) typedef を作成すると、単純型指定子 (最初の型) として使用できる型名 (3 番目の型) が作成されます。
を使用する必要はありませんtypedef
(ただし C++11 のみ)。これは、複数のポインター型を処理する場合に役立ちます。
template<typename T>
using alias = T;
それなら、そうしていただけalias<int*>
ます。int*
int* p = alias<int*>()
恒等メタ関数を使用して、C++03 で利用できる同様のソリューション:
template<typename T>
struct identity {
typedef T type;
};
int* p = identity<int*>::type();
やるだけ
int* x = int();
とにかく0であるintのデフォルト値でデフォルトを設定しているため、ポインターに0を割り当ててNULLアドレスを指すようにします。
実際には、すべてのタイプで問題なく機能します。
double* y = int();
アドレスはまだ 32 ビット (またはプラットフォームによっては 64 ビット) の整数であるため、= int() を実行すると、すべての型で問題なく動作するはずです。
1 つの方法を次に示します。
template <typename T>
T make_default()
{
return T();
}
int main()
{
int *p = make_default<int*>();
}
機能しない理由は、ポインターにコンストラクターがないためです。
構文
int ()
コール(理論上)
int::int ()
変数を初期化します。(多くの場合、コンパイラは変数をゼロにするだけですが、それは int について「知っている」ためです)。
C++11 では、nullptr を使用できます。
int *ptr = nullptr;
それ以外の場合は、NULL を使用する必要があります。
int *ptr = NULL;
これがあなたのやり方です int* ptr = new int;