2

重複の可能性:
C++ の「構造体」と「typedef 構造体」の違い?

この質問に対する答えは、次のことについて疑問に思いました。

クラスを次のように定義するとします。

typedef class {int i;} C;

従来の方法で定義するのと完全に同等です。

class C
{
   int i;
};

この推定は正しいですか?

4

5 に答える 5

4

この孤立した例では、少なくとも外部からは機能的に同じです。

ただし、違いがあります。struct特に1つのインスタンスでは、aのコンストラクターを宣言したり、classこの方法で宣言したりすることはできません。これは、classが名前が付けられていないためです。同様に、クラスの名前を含む関数を宣言することはできません。ここではいくつかの例を示します。

typedef class
{
public:
  Gizmo() : n_(42) {}; // NOT OK
  ~Gizmo();
  Gizmo& operator<<(int n);    
private:
  int n_;
} Gizmo;

また、匿名クラスを前方宣言することはできません。

class Gizmo;

C ++では、名前が付けられたaまたはaを単に宣言するよりもtypedef、匿名structまたはaを使用する方が望ましい場合は見たことがありません。場合によっては、従来の方法が間違いなく好まれます。話の教訓は次のとおりです。C++では使用しないでください。それはあなたに何も買わず、あなたに何かを要します。classclassstructtypedef class {} Name;

于 2012-10-30T12:53:41.873 に答える
2

標準では (9.1/5)

クラス型を指定する typedef-name (7.1.3)、またはその cv 修飾バージョンも、> クラス名です。クラス名が必要な場所で、cv 修飾されたクラス型を指定する typedef-name が使用されている場合、cv 修飾子は無視されます。

7.1/3 言います:

typedef 指定子で宣言された名前は、typedef 名になります。その宣言の範囲内では、typedef-name は構文的にキーワードと同等であり、8 節で説明されている方法で識別子に関連付けられた型に名前を付けます。したがって、typedef-name は別の型の同義語です。

理論的な観点からはいいえ、7.1/3 は私が断ったところから続いているため、どのバージョンが使用されたかに応じて、有効または無効なプログラムをドラフトすることができます (実際、人々は既に持っているようです)。

typedef-name は、クラス宣言 (9.1) または enum 宣言のように新しい型を導入しません。

于 2012-10-30T12:46:51.880 に答える
2

これは重複した質問 (見つかりません) だと思いますが、そうでない場合は、これがコンパイルされることを確認してください。

class C
{
   int i;
};
void C() {}

class C x;

これはしませんが:

typedef class
{
   int i;
} C;
void C() {}

C x;

名前空間が異なります。

于 2012-10-30T12:49:45.253 に答える
0

さらに別の違いがあります。後者は前方宣言できますが、前者はできません。

于 2012-10-30T12:54:26.473 に答える
0

それらは同等ではありません。特に、

int main()
{
    class C c;
}

2 つの定義のうちの 1 つに対してのみコンパイルされます。

于 2012-10-30T12:49:41.513 に答える