Как инициализировать переменную-член const в классе?
#include <iostream>
using namespace std;
class T1
{
const int t = 100;
public:
T1()
{
cout << "T1 constructor: " << t << endl;
}
};
когда я пытаюсь инициализировать переменную-член const t С 100. Но это дает мне следующую ошибку:
test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static
как я могу инициализировать const значение?
9 ответов:
The
constпеременная указывает, является ли переменная изменяемой или нет. Назначенное постоянное значение будет использоваться каждый раз, когда на переменную ссылаются. Присвоенное значение не может быть изменено во время выполнения программы.Бьярне Страуструп объяснение резюмирую кратко:
класс обычно объявляется в файле заголовка, и файл заголовка обычно включается во многие единицы перевода. Однако, чтобы избежать сложного линкера правила, C++ требует, чтобы каждый объект имел уникальное определение. Это правило будет нарушено, если C++ разрешит определение в классе сущностей, которые должны храниться в памяти как объекты.
A
constпеременная должна быть объявлена внутри класса, но она не может быть определена в нем. Нам нужно определить переменную const вне класса.T1() : t( 100 ){}здесь
t = 100происходит в списке инициализаторов, задолго до инициализации класса.
Ну, вы могли бы сделать это
static:static const int t = 100;или вы можете использовать инициализатор члена:
T1() : t(100) { // Other constructor stuff here }
есть несколько способов инициализации членов const внутри класса..
определение члена const в общем случае также требует инициализации переменной..
1) внутри класса, если вы хотите инициализировать const синтаксис выглядит так
static const int a = 10; //at declaration2) Второй способ может быть
class A { static const int a; //declaration }; const int A::a = 10; //defining the static member outside the class3) Ну если вы не хотите инициализировать при объявлении, то другой способ-через конструктор, переменная должна быть инициализирована в списке инициализации(не в теле конструктора). Это должно быть так
class A { const int b; A(int c) : b(c) {} //const member initialized in initialization list };
вы можете обновить компилятор для поддержки C++11 и ваш код будет работать отлично.
использовать список инициализации в конструкторе.
T1() : t( 100 ) { }
другое решение -
class T1 { enum { t = 100 }; public: T1(); };таким образом, t инициализируется до 100, и его нельзя изменить, и он является частным.
Если элемент является массивом, он будет немного сложнее, чем обычный:
class C { static const int ARRAY[10]; public: C() {} }; const unsigned int C::ARRAY[10] = {0,1,2,3,4,5,6,7,8,9};или
int* a = new int[N]; // fill a class C { const std::vector<int> v; public: C():v(a, a+N) {} };
если вы не хотите, чтобы сделать
constчлен данных в классе static, вы можете инициализироватьconstэлемент данных с помощью конструктора класса. Например:class Example{ const int x; public: Example(int n); }; Example::Example(int n):x(n){ }если есть несколько
constэлементы данных в классе для инициализации элементов можно использовать следующий синтаксис:Example::Example(int n, int z):x(n),someOtherConstVariable(z){}
другим возможным способом являются пространства имен:
#include <iostream> namespace mySpace { static const int T = 100; } using namespace std; class T1 { public: T1() { cout << "T1 constructor: " << mySpace::T << endl; } };недостатком является то, что другие классы также могут использовать константы, если они включают файл заголовка.
вы можете добавить
staticчтобы сделать возможной инициализацию этой переменной-члена класса.static const int i = 100;однако это не всегда хорошая практика для использования внутри объявления класса, потому что все объекты, созданные из этого класса, будут совместно использовать одну и ту же статическую переменную, которая хранится во внутренней памяти за пределами области памяти экземпляров объектов.
Comments