#include <iostream>
using namespace std;
class T1
{
const int t = 100;
public:
T1()
{
cout << "T1 constructor: " << t << endl;
}
};
Kiedy próbuję zainicjować zmienną składową const wartością t
100. Ale powoduje to następujący błąd:
test.cpp:21: error: ISO C++ forbids initialization of member ‘t’
test.cpp:21: error: making ‘t’ static
Jak mogę zainicjować const
wartość?
Odpowiedzi:
Plik
const
zmienna określa czy zmienna jest modyfikowalny czy nie. Przypisana stała wartość będzie używana przy każdym odwołaniu do zmiennej. Przypisanej wartości nie można modyfikować podczas wykonywania programu.Wyjaśnienie Bjarne Stroustrupa podsumowuje to krótko:
const
Zmienna musi zostać zadeklarowana w klasie, ale to nie może być zdefiniowana w nim. Musimy zdefiniować zmienną const poza klasą.Tutaj przypisanie
t = 100
odbywa się na liście inicjalizatorów, dużo wcześniej niż inicjalizacja klasy.źródło
Here the i = 10 assignment in initializer list happens much before the class initilizaiton occurs.
Nie rozumiem. I zasadniczo tego rodzaju dopuszczanie definicji w klasie jest specyficzne dla kompilatora, prawda?operator = function not found
w VC ++. Jaki może być problem?Cóż, możesz to zrobić
static
:lub możesz użyć inicjatora członka:
źródło
const member
powinien być dostępny z funkcji / obiektów, to dlaczego statyczny?Istnieje kilka sposobów na zainicjowanie elementów stałych wewnątrz klasy.
Definicja elementu const w ogóle wymaga również inicjalizacji zmiennej.
1) Wewnątrz klasy, jeśli chcesz zainicjować const, składnia jest następująca
2) Drugi sposób może być
3) Cóż, jeśli nie chcesz inicjalizować w deklaracji, to w przeciwnym razie za pomocą konstruktora zmienna musi zostać zainicjalizowana na liście inicjalizacyjnej (a nie w treści konstruktora). Tak musi być
źródło
Jeśli nie chcesz, aby element
const
członkowski danych w klasie był statyczny, możesz zainicjować elementconst
członkowski danych przy użyciu konstruktora klasy. Na przykład:jeśli
const
w klasie jest wielu członków danych, możesz użyć następującej składni, aby zainicjować członków:źródło
Możesz zaktualizować swój kompilator do obsługi C ++ 11, a Twój kod będzie działał idealnie.
Użyj listy inicjalizacyjnej w konstruktorze.
źródło
Innym rozwiązaniem jest
Więc t jest inicjalizowane na 100 i nie można go zmienić i jest prywatne.
źródło
Jeśli element członkowski jest tablicą, będzie nieco złożony niż normalnie:
lub
źródło
Innym możliwym sposobem są przestrzenie nazw:
Wadą jest to, że inne klasy mogą również używać stałych, jeśli zawierają plik nagłówkowy.
źródło
To jest właściwy sposób. Możesz wypróbować ten kod.
jeśli używasz
C++10 Compiler or below
, nie możesz zainicjować członka przeciwnika w momencie deklaracji. Więc tutaj należy utworzyć konstruktor, aby zainicjować składową danych const. Konieczne jest również użycie listy inicjatorów,T1():t(100)
aby natychmiast uzyskać pamięć.źródło
możesz dodać,
static
aby umożliwić inicjalizację tej zmiennej składowej klasy.Jednak nie zawsze jest to dobra praktyka w użyciu wewnątrz deklaracji klasy, ponieważ wszystkie obiekty instacowane z tej klasy będą współdzieliły tę samą zmienną statyczną, która jest przechowywana w pamięci wewnętrznej poza pamięcią zakresu obiektów, dla których utworzono instancję.
źródło