web-dev-qa-db-fra.com

Différence entre les classes et les espaces de noms?

Je regarde les espaces de noms et je ne vois pas vraiment de différence entre ceux-ci et les classes. Je m'enseigne le c ++ J'ai plusieurs livres en ligne, donc je sais que je n'apprends pas le plus efficacement. Quoi qu'il en soit, quelqu'un peut-il me dire la différence entre les deux et quel serait le meilleur moment pour utiliser un espace de nom sur une classe. De plus, je ne vois pas grand chose aux structures dans le livre que je lis.

Est-ce le format?

struct go
{

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

}

merci d'avance pour votre aide.

36
TimothyTech

Les classes et les structures définissent des types. Vous pouvez créer un objet d'un type. Les espaces de noms déclarent simplement une étendue à l'intérieur de laquelle d'autres types, fonctions, objets ou espaces de noms peuvent exister. Vous ne pouvez pas créer un objet de type std (à moins bien sûr que vous ayez créé un type appelé std, qui masquerait l'espace de noms std).

Lorsque vous définissez une fonction à l'intérieur d'une structure/classe (une méthode), vous dites "Cette fonction est une opération fondamentale sur les données associées". Lorsque vous définissez une fonction à l'intérieur d'un espace de noms, vous dites "Cette fonction est logiquement liée à d'autres fonctions, types et objets de l'espace de noms"

Modifier

Il vaut probablement la peine de souligner que les langages "tout est un objet" comme Java et C # utilisent régulièrement des classes comme s'ils étaient des espaces de noms car ils n'autorisent pas les fonctions "libres". la confusion vient de. Si vous avez une classe dans un autre langage qui ne contient que des membres statiques, vous voudrez utiliser un espace de noms et des fonctions libres dans la version C++.

68
Cogwheel

Vous pouvez rechercher sur le Web les différences et je suis sûr que vous en trouverez beaucoup; mais les éléments suivants sont importants à mon humble avis: -

  • Vous pouvez rouvrir un espace de noms et ajouter des éléments dans les unités de traduction. Vous ne pouvez pas faire cela avec des cours.
  • L'utilisation d'une classe implique que vous pouvez créer une instance de cette classe, pas vrai avec des espaces de noms.
  • Vous pouvez utiliser des déclarations using avec des espaces de noms, et ce n'est pas possible avec des classes, sauf si vous en dérivez.
  • Vous pouvez avoir des espaces de noms sans nom.

Un espace de noms définit une nouvelle étendue et les membres d'un espace de noms auraient une étendue d'espace de noms. Ils fournissent un moyen d'éviter les collisions de noms (de variables, types, classes ou fonctions) sans l'inconvénient de gérer les classes imbriquées.

26
Abhay

Un classe est un type de données. Si vous avez une classe nommée Foo, vous pouvez créer des objets de la classe Foo et les utiliser de plusieurs façons.

Un namespace est simplement une façon abstraite de regrouper des éléments. Normalement, vous ne pouvez pas avoir deux fonctions dans votre programme nommées bar(). Si vous les placez dans des espaces de noms distincts, ils peuvent coexister (par exemple, sous la forme A::bar() et B::bar()). Un espace de noms ne peut pas être créé en tant qu'objet; pensez-y plutôt comme une convention de dénomination.

Si vous écrivez du code que vous souhaitez associer à un objet que vous pouvez définir et utiliser comme variable, écrivez une classe. Si vous écrivez une API ou une bibliothèque et que vous souhaitez encapsuler toutes les fonctions et constantes afin que leurs noms n'entrent pas en conflit avec tout ce que l'utilisateur aurait pu écrire, utilisez un espace de noms.

11
bta

Un espace de noms est un moyen de regrouper les identifiants afin qu'ils ne s'affrontent pas.

Une classe est la définition d'un objet qui peut être instancié (généralement) et qui encapsule la fonctionnalité et l'état.

Les espaces de noms et les classes sont entièrement différents et servent à des fins différentes. Ils ont une certaine similitude syntaxique.

Les structures sont des classes, avec un spécificateur d'accès par défaut différent (public pour struct, privé pour classe) - sous tous les autres aspects, elles sont identiques.

8
Ragster

Une différence majeure est que les espaces de noms peuvent être rouverts, mais les classes ne peuvent pas être:

namespace A {
    int f1();
}

namespace A {
    int f2();
}

est légal, mais:

class A {
    int f1();
};

class A {
    int f2();
};

n'est pas

7
anon

De wikipedia

En général, un espace de noms est un conteneur abstrait fournissant un contexte pour les éléments (noms, ou termes techniques ou mots) qu'il contient et permettant la désambiguïsation des éléments homonymes ayant le même nom (résidant dans des espaces de noms différents). En règle générale, les noms dans un espace de noms ne peuvent pas avoir plus d'une orthographe, c'est-à-dire que ses composants ne peuvent pas partager le même nom. Un espace de noms est également appelé contexte, car la signification valide d'un nom peut changer en fonction de l'espace de noms qui s'applique. Les noms qu'il contient peuvent représenter des objets ainsi que des concepts, qu'il s'agisse d'un langage naturel ou ethnique, d'un langage construit, de la terminologie technique d'une profession, d'un dialecte, d'un sociolect ou d'un langage artificiel (par exemple, un langage de programmation).

D'autre part A class defines a type.

Un espace de noms peut contenir plusieurs classes.

MODIFIER

Une différence serait la suivante:

Vous pouvez avoir des espaces de noms sans nom mais vous ne pouvez pas avoir de classe sans nom

    namespace{    //fine

           //some code....
    }

    class{   //illegal
    }
0
Prasoon Saurav