web-dev-qa-db-ja.com

クラスと名前空間の違いは?

私は名前空間を調べていますが、これらとクラスの違いは実際にはわかりません。私は自分でc ++を教えています。オンラインで数冊の本を手に入れました。とにかく、この2つの違いと、クラスでネームスペースを使用するのに最適な時期を教えてください。また、私が読んでいる本には構造体についてはあまり見ていません。

これはフォーマットですか?

struct go
{

  goNow(){ cout << "go Now"};

}

ご協力ありがとうございます。

36
TimothyTech

クラスと構造体は型を定義します。タイプのオブジェクトを作成できます。名前空間は、他の型、関数、オブジェクト、または名前空間が存在できるスコープを宣言するだけです。タイプstdのオブジェクトを作成することはできません(もちろん、stdという名前のタイプを作成すると、std名前空間が非表示になります)。

構造体/クラス(メソッド)内で関数を定義するとき、「この関数は関連データの基本的な操作です」と言っています。名前空間内で関数を定義すると、「この関数は、名前空間内の他の関数、型、およびオブジェクトに論理的に関連しています」と言っています

編集

JavaやC#のような「すべてがオブジェクト」である言語は、「フリー」関数を許可しないため、名前空間であるかのようにクラスを定期的に使用することを指摘する価値があります。混乱の原因:静的メンバーのみを含む別の言語のクラスがある場合は、C++バージョンで名前空間と無料関数を使用する必要があります。

68
Cogwheel

あなたはウェブ上で違いを検索することができ、私はあなたが多くを見つけると確信しています。しかし、以下は重要な私見です-

  • 名前空間を再度開き、翻訳ユニット全体にコンテンツを追加できます。クラスでこれを行うことはできません。
  • クラスを使用すると、そのクラスのインスタンスを作成できることを意味しますが、名前空間ではそうではありません。
  • Using宣言は名前空間で使用できますが、クラスから派生しない限り、クラスでは使用できません。
  • 名前のない名前空間を持つことができます。

名前空間は新しいスコープを定義し、名前空間のメンバーは名前空間スコープを持つと言われます。これらは、ネストされたクラスを処理する不便なしに(変数、型、クラス、または関数の)名前の衝突を回避する方法を提供します。

26
Abhay

classはデータ型です。 Fooという名前のクラスがある場合、クラスFooのオブジェクトを作成して、さまざまな方法で使用できます。

namespaceは、アイテムをグループ化する抽象的な方法です。通常、プログラムにbar()という名前の2つの関数を含めることはできません。それらを別々の名前空間に配置すると、共存できます(たとえば、A::bar()B::bar())。名前空間はオブジェクトとして作成できません。それをより命名規則と考えてください。

定義して変数として使用できるオブジェクトに関連付けたいコードを書いている場合は、クラス。 APIまたはライブラリを記述していて、ユーザーが記述したものと名前が衝突しないようにすべての関数と定数をラップしたい場合は、namespace

11
bta

ネームスペースは、衝突しないように識別子をグループ化する方法です。

クラスは、(通常)インスタンス化でき、機能性と状態をカプセル化するオブジェクトの定義です。

名前空間とクラスは完全に異なり、異なる目的に使用されます。構文的に類似しています。

構造体はクラスであり、デフォルトのアクセス指定子は異なります(構造体の場合はパブリック、クラスの場合はプライベート)-他のすべての面では同じです。

8
Ragster

大きな違いの1つは、名前空間を再度開くことができますが、クラスは次のようにできないことです。

namespace A {
    int f1();
}

namespace A {
    int f2();
}

正当ですが、:

class A {
    int f1();
};

class A {
    int f2();
};

ではありません

7
anon

ウィキペディアから

一般に、名前空間は、保持するアイテム(名前、技術用語、または単語)のコンテキストを提供し、同じ名前(異なる名前空間にある)の同音異義語アイテムの曖昧さをなくすことができる抽象コンテナです。 原則として、名前空間の名前は複数のスペルを持つことはできません。つまり、そのコンポーネントは同じ名前を共有できません。名前空間はコンテキストとも呼ばれます。名前の有効な意味は、どの名前空間が適用されるかによって変わる可能性があるためです。その中の名前は、自然言語または民族言語、構築言語、職業の専門用語、方言、社会言語、または人工言語(プログラミング言語など)であるかどうかにかかわらず、オブジェクトと概念を表すことができます。

一方 A class defines a type

名前空間には複数のクラスが含まれる場合があります。

[〜#〜] edit [〜#〜]

1つの違いは次のとおりです。

名前のない名前空間を持つことはできますが、名前のないクラスを持つことはできません

    namespace{    //fine

           //some code....
    }

    class{   //illegal
    }
0
Prasoon Saurav