14

組み込み型の変数は、次のように値を初期化できます

int var = int();

intこのようにして、コードにゼロをハードコーディングせずにデフォルト値を取得します。

ただし、ポインターに対して同様のことをしようとすると:

int* ptr = int*();

コンパイラ(Visual C++ 10)はそれをコンパイルすることを拒否します(言うtype int unexpected)。

同様の方法でポインタを値初期化するにはどうすればよいですか?

4

7 に答える 7

9

typedef を使用して、ポインター型の名前を作成します。

typedef int *ip;

ip ptr = ip();

型の名前を定義するために複数の字句要素 (単語) を必要とする他の型 (例: 、 、 など) についても、同じ考え方が機能するはずunsigned longです。long longunsigned long long *

于 2011-11-09T15:54:01.633 に答える
4

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 番目の型) が作成されます。

于 2011-11-09T16:35:33.367 に答える
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();
于 2011-11-09T16:08:51.980 に答える
1

やるだけ

int* x = int();

とにかく0であるintのデフォルト値でデフォルトを設定しているため、ポインターに0を割り当ててNULLアドレスを指すようにします。

実際には、すべてのタイプで問題なく機能します。

double* y = int();

アドレスはまだ 32 ビット (またはプラットフォームによっては 64 ビット) の整数であるため、= int() を実行すると、すべての型で問題なく動作するはずです。

于 2011-11-09T15:53:32.663 に答える
1

1 つの方法を次に示します。

template <typename T>
T make_default()
{
    return T();
}

int main()
{
    int *p = make_default<int*>();
}
于 2011-11-09T15:53:37.490 に答える
0

機能しない理由は、ポインターにコンストラクターがないためです。

構文

int ()

コール(理論上)

int::int ()

変数を初期化します。(多くの場合、コンパイラは変数をゼロにするだけですが、それは int について「知っている」ためです)。

C++11 では、nullptr を使用できます。

int *ptr = nullptr;

それ以外の場合は、NULL を使用する必要があります。

int *ptr = NULL;

于 2011-11-09T15:55:45.220 に答える
-1

これがあなたのやり方です int* ptr = new int;

ヒープ ポインター

于 2011-11-09T15:54:41.240 に答える