В C ++ спецификаторы доступа не управляют видимостью статических членов? - PullRequest
2 голосов
/ 20 февраля 2012

Пример кода от http://www.learncpp.com/cpp-tutorial/812-static-member-functions/:

class Something
{
private:
    static int s_nValue;
};

int Something::s_nValue = 1;

Этот код компилируется без предупреждений или ошибок. Я не понимаю, почему.

Разве мы не должны получить предупреждение за попытку доступа к s_nValue, потому что это личное сообщение? Или эти спецификаторы доступа не применяются к статическим элементам?

Ответы [ 3 ]

8 голосов
/ 20 февраля 2012

Определение s_nValue - это не «доступ» к члену извне класса, а его реализация.Думайте об этом как о реальной реализации функции-члена, если она помещена в исходный файл за пределами объявления для включающего класса.

Другими словами, спецификаторы доступа абсолютно одинаково применимы к статическим членам.

2 голосов
/ 20 февраля 2012

Это определение статического члена private класса, и поэтому оно разрешено.Поскольку определение статических членов класса должно выходить за пределы класса, независимо от того, является ли оно private или public.

Короче говоря, это не доступ к члену, это определение его, точно так же как вы определение private функций вне класса,

1 голос
/ 20 февраля 2012

Также обратите внимание: не путайте между Заданием и Конструкторами. Линия:

int Something::s_nValue = 1;

Это не «присвоение» значения, это конструирование объекта. В общем, его:

ClassA Something::s_nValue(...parameters...);

C ++ допускает синтаксис стиля «назначение» для Contructors. Пример:

class A
{
public: 
    A(int i) { m_i = i; }

    int getI() { return m_i; }

private:
    int m_i;
};

class B
{
public: 
    static int getAI() { return a.getI(); }
private:
    static A a;
};

A B::a = 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...