C'est mon code
#include <iostream>
using namespace std;
int x = 5;
int main()
{
int x = 1;
cout << "The variable x: " << x << endl;
}
J'obtiens en sortie 1
, mais j'aimerais avoir 5
, comme pour accéder à la variable globale x
.
Est-ce possible?
Vous devez utiliser ::x
afin d'accéder à la variable globale dans la portée locale. L'opérateur ::
est un opérateur de résolution de portée unaire. Votre code doit donc être:
#include <iostream>
using namespace std;
int x = 5;
int main()
{
int x = 1;
cout << "The variable x: " << ::x << endl;
}
Remarque: ::
L'opérateur a deux significations en C++:
Presque pendant toutes vos heures de codage, vous utiliseriez l'opérateur de résolution de portée binaire. Ainsi, bien que la réponse à cette question soit un opérateur de résolution de portée unaire; juste pour des références futures, j'enrôle quelques cas d'utilisation typiques de l'opérateur de résolution de portée binaire.
1. Pour définir vos fonctions en dehors de la classe.
Nous organisons notre code en fichiers d'en-tête avec . H extension et fichiers de code avec . Cpp extension. Lors de la définition de nos fonctions dans les fichiers de code, nous utilisons le ::
Opérateur de résolution de portée binaire.
Par exemple, un fichier Car.h ressemble à:
class Car
{
private:
int model;
int price;
public:
void drive();
void accelerate();
};
Et Car.cpp ressemblerait à:
void Car :: drive()
{
// Driving logic.
}
void Car :: accelerate()
{
// Logic for accelerating.
}
Ici, comme nous pouvons facilement le constater, ::
agit sur deux opérandes:
Par conséquent, il définit essentiellement la portée de la fonction, c'est-à-dire qu'il informe le compilateur que la fonction drive () appartient à la classe Car.
2. Pour résoudre l'ambiguïté entre deux fonctions avec le même modèle qui sont dérivées de classes différentes.
Considérez le code suivant:
#include <iostream>
using namespace std;
class Vehicle
{
public:
void drive()
{
cout << "I am driving a Vehicle.\n";
}
};
class Car
{
public:
void drive()
{
cout << "I am driving a Car.\n";
}
};
class BMW : public Car, public Vehicle
{
// BMW specific functions.
};
int main(int arc, char **argv)
{
BMW b;
b.drive(); // This will give compile error as the call is ambiguous.
b.Car::drive(); // Will call Car's drive method.
b.Vehicle::drive(); // Will call Vehicle's drive method.
}
Comme les deux fonctions dérivées de la classe BMW ont le même modèle, l'appel b.drive
entraînera une erreur de compilation. Par conséquent, pour spécifier quel lecteur () nous voulons, nous utilisons le ::
opérateur.
. Pour remplacer la fonction remplacée.
L'opérateur de résolution d'étendue binaire permet d'appeler la fonction de la classe de base qui est remplacée dans une classe dérivée à l'aide de l'objet de la classe dérivée. Voir le code ci-dessous:
#include <iostream>
using namespace std;
class Car
{
public:
void drive()
{
cout << "I am driving Car.\n";
}
};
class BMW : public Car
{
public:
void drive()
{
cout << "I am driving BMW\n";
}
};
int main(int argc, char** argv)
{
BMW b;
b.drive(); // Will call BMW's drive function.
b.Car::drive(); // Will call Car's drive function.
}
4. Pour accéder aux membres de données statiques.
Comme nous le savons, les membres de données statiques sont partagés par classe par les objets de cette classe. Par conséquent, nous ne devrions pas (bien que nous puissions) utiliser des objets pour définir les variables statiques. Voir le code suivant:
#include <iostream>
using namespace std;
class Car
{
public:
static int car_variable;
};
int Car :: car_variable;
int main(int argc, char** argv)
{
Car :: car_variable = 10;
cout << "Car variable: " << Car :: car_variable << '\n';
return 0;
}