#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
значение?
Ответы:
В
const
переменной определяет , является ли переменная изменяемым или нет. Присвоенное постоянное значение будет использоваться каждый раз при обращении к переменной. Присвоенное значение нельзя изменить во время выполнения программы.Объяснение Бьярна Страуструпа кратко резюмирует это:
const
Переменная должна быть объявлена в классе, но она не может быть в нем определены. Нам нужно определить переменную const вне класса.Здесь присвоение
t = 100
происходит в списке инициализаторов, задолго до инициализации класса.источник
Here the i = 10 assignment in initializer list happens much before the class initilizaiton occurs.
я не понял. И в основном такое разрешение определений внутри класса зависит от компилятора, верно?operator = function not found
в VC ++. В чем может быть проблема?Что ж, вы могли бы это сделать
static
:или вы можете использовать инициализатор члена:
источник
const member
должно быть доступно из функций / объектов, тогда почему статическое?Есть несколько способов инициализировать члены const внутри класса.
Определение константного члена в целом также требует инициализации переменной.
1) Внутри класса, если вы хотите инициализировать константу, синтаксис выглядит следующим образом
2) Второй способ может быть
3) Хорошо, если вы не хотите инициализировать при объявлении, тогда другой способ - через конструктор, переменная должна быть инициализирована в списке инициализации (а не в теле конструктора). Это должно быть так
источник
Если вы не хотите, чтобы
const
член данных в классе был статическим, вы можете инициализироватьconst
член данных с помощью конструктора класса. Например:если
const
в классе несколько членов данных, вы можете использовать следующий синтаксис для инициализации членов:источник
Вы можете обновить свой компилятор для поддержки C ++ 11, и ваш код будет работать отлично.
Используйте список инициализации в конструкторе.
источник
Другое решение
Таким образом, t инициализируется значением 100, не может быть изменен и является частным.
источник
Если член является массивом, он будет немного сложнее, чем обычно:
или
источник
Другой возможный способ - это пространства имен:
Недостатком является то, что другие классы также могут использовать константы, если они включают файл заголовка.
источник
Это правильный путь. Вы можете попробовать этот код.
если вы используете,
C++10 Compiler or below
вы не можете инициализировать член cons во время объявления. Итак, здесь необходимо создать конструктор для инициализации элемента данных const. Также необходимо использовать список инициализаторов,T1():t(100)
чтобы мгновенно получить память.источник
вы можете добавить,
static
чтобы сделать возможной инициализацию этой переменной-члена класса.Однако это не всегда является хорошей практикой для использования внутри объявления класса, потому что все объекты, созданные из этого класса, будут использовать одну и ту же статическую переменную, которая хранится во внутренней памяти за пределами области видимости созданных объектов.
источник