Jak uzyskać dostęp do zmiennej globalnej w zakresie lokalnym?

To jest mój kod

#include <iostream>
using namespace std;
int x = 5;
int main()
{
    int x = 1;
    cout << "The variable x: " << x << endl;
}   

Dostaję jako wyjście 1, ale chciałbym mieć 5, jak w dostępie do zmiennej globalnej x.

Czy to możliwe?
Author: Rakete1111, 2013-12-08

1 answers

Powinieneś używać ::x, aby uzyskać dostęp do zmiennej globalnej w zasięgu lokalnym. Operator :: jest operatorem jednoargumentowym. Więc Twój kod powinien być:

   #include <iostream>
   using namespace std;
   int x = 5;
   int main()
   {
       int x = 1;
       cout << "The variable x: " << ::x << endl;
   }   

Uwaga: :: operator ma w C++dwa znaczenia:

  1. Operator rozdzielczości zakresu binarnego.
  2. operator rozdzielczości Jednoargumentowej.

Prawie przez całe Godziny Kodowania, używałbyś binarnego operatora rozdzielczości zakresu. Więc chociaż odpowiedź na to pytanie jest jednolita zakres Operator rozdzielczości; tylko do późniejszego wykorzystania podaję kilka typowych przypadków użycia operatora rozdzielczości domeny binarnej.

Przypadki użycia binarnego operatora rozdzielczości zakresu:

1. Aby zdefiniować swoje funkcje poza klasą.

Organizujemy nasz kod w pliki nagłówkowe za pomocą .h pliki rozszerzeń i kodów z .cpp rozszerzenie. Definiując nasze funkcje w plikach kodu, używamy operatora :: Binary scope resolution.

Na przykład, samochód.h plik wygląda następująco:

class Car
{
    private:
        int model;
        int price;

    public:
        void drive();
        void accelerate();
};

I Samochód.cpp wyglądałoby następująco:

void Car :: drive()
{
    // Driving logic.
}
void Car :: accelerate()
{
    // Logic for accelerating.
}

Tutaj, jak łatwo zauważyć, :: działa na dwóch operandach:

  1. nazwa klasy
  2. nazwa funkcji

Stąd zasadniczo definiuje zakres funkcji, tzn. informuje kompilator, że funkcja napęd() należy do klasy Samochód.


2. Aby rozwiązać wieloznaczność między dwiema funkcjami z tym samym szablonem, które pochodzą z różnych klas.

Rozważ następujący kod:

#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.
}

Ponieważ obie pochodne funkcje klasy BMW mają ten sam szablon, wywołanie {[11] } spowoduje błąd kompilacji. Stąd, aby określić, który dysk () chcemy, używamy operatora ::.


3. Aby nadpisać nadpisane funkcja.

Operator rozdzielczości zakresu binarnego pomaga wywołać funkcję klasy bazowej, która jest nadpisywana w klasie pochodnej za pomocą obiektu klasy pochodnej. Zobacz poniższy kod:

#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. Aby uzyskać dostęp do statycznych członków danych.

Jak wiemy, statyczne elementy danych są współdzielone według klasy przez obiekty tej klasy. Dlatego nie powinniśmy (chociaż możemy) używać obiektów do zakresu zmiennych statycznych. Zobacz następujący kod:

#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;
}
 37
Author: KodingKid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 23:06:24