2010-09-25 2 views
6
#include<iostream> 
using namespace std; 
class A 
{ 
     private: 
       const int a=9; 
     public: 
       void display() 
       { 
        cout<<a; 
       } 
}; 
int main() 
{ 
     A a; 
     a.display(); 
     return 0; 
} 

Почему инициализация const int a = 9 не разрешена. Но где, как если бы я писал постоянный статический int a = 9, компилятор не обнаружил ошибок. В чем смысл записи const static int a = 9? Когда я должен писать так?
Константные и статические спецификации в C++

ответ

5

Используйте конструктор список инициализатора для инициализации нестатических постоянных членов.

ISO C++ 03 описывает следующие вещи о статических элементах данных.

[class.static.data]

9.4.2 Static data members

1 Статический член данных не является частью подобъектов класса. Существует только одна копия элемента статических данных, совместно используемого всеми объектами класса.

2 Объявление статического элемента данных в его определении класса не является определением и может быть неполным, кроме cv -qualified void. Определение для члена staticdata должно появляться в области пространства имен, охватывающей определение класса участника. В определении в области пространства имен имя статического члена данных должно быть присвоено его именем класса с помощью оператора ::. `

Если статический член данных имеет сопзЬ интеграл или Const перечислимого типа, его объявление в определении класса можно указать константу-инициализатор, который является неотъемлемым константным выражением (5.19). В этом случае член может фигурировать в интегральных постоянных выражениях. Элемент все еще должен быть определен в области пространства имен, если он используется в программе, и определение области пространства имен не должно содержать инициализатор *.

class A 
{ 
     private: 

       const int a=9; //incorrect 
       static const int b = 10; //declaration (correct) 
       static const double c = 1.3 //incorrect (Only const-static int members can be initialized like that) 


     public: 

       A(): a(9){} 
}; 

const int A::b; //definition of const-static int member 

Вы можете взять адрес статического члена, если (и только если) it has an out-of-class definition:

class AE { 
    // ... 
public: 
    static const int c6 = 7; 
    static const int c7 = 31; 
}; 

const int AE::c7; // definition 

int f() 
{ 
    const int* p1 = &AE::c6; // error: c6 not an lvalue 
    const int* p2 = &AE::c7; // ok 
    // ... 
} 
+0

Без записи Const int A :: b я мог бы скомпилировать этот код успешно !!!!! Зачем ? – Jagan

+0

Если только я не инициализирую static const int b с некоторым значением, он дает ошибку (если я не записываю определение)? Зачем ? – Jagan

+1

Успешная компиляция не имеет ничего общего с правильностью вашего кода -> 'Член все еще должен быть определен в области пространства имен, если он используется в программе, а определение области пространства имен не должно содержать инициализатор' –

2

Чтобы инициализировать объект const, вам нужно сделать это внутри конструктора, потому что это экземпляр объекта для каждого объекта. С другой стороны, переменная static const отличается тем, что она разделяется между всеми объектами этого типа. Это означает, что он выделяется в сегменте данных в отдельном месте для переменных внутри объекта. Он должен быть определен вне конструктора, потому что он будет установлен только один раз, когда-либо, а не один раз на объект.

редактировать: фиксированный «в стек», как на предложение Касабланки

+0

+1 хотя «сидит» в стеке "неверно: статические переменные обычно выделяются в сегменте данных, а не в стеке. – casablanca

0

static это ключевое слово, используемое, например, меньше переменных/методов класса. Поэтому заявка:

static int a=9; 

означает, что жизнь на протяжении всего срока службы приложения. Ключевое слово const означает, что значение не может измениться. Поэтому const static int a=9; объявляет переменную, которая является как статической (живет для приложения), так и не изменяет значение.

Причина вы не можете состояние:

const int a=9; 

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

EDIT: Также обратите внимание, что нестатический элемент const не нужен. Поскольку ваш член никогда не изменит значение, сделав его статическим, чтобы обойти ошибки, не будет иметь никакого значения для вашего кода, кроме того, что вы можете получить к нему доступ с помощью A::a, вместо того, чтобы создавать экземпляр A.

Смежные вопросы