2016-01-02 2 views
0

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

Пример кода:

#include <iostream> 
using namespace std; 

class test{ 
    const string name; 
public: 
    test(const string &nam) : name(nam) {} 

    string get_name() { return name; } 
}; 

int main() 
{ 
    test a("Tom"); 
    cout << a.get_name(); 

    // const string t1; 
    // string t2 = "changing"; this causes an error 
    // t1 = &t2; 

    return 0; 
} 
+2

Вы не меняете его, вы его инициализируете. Если бы вы не могли этого сделать, члены-члены были бы бесполезны ... –

ответ

7

Вы не изменяете const string. Вы его инициализируете.

const означает, что после инициализации переменной ее нельзя изменить. Это не означает constexpr (что означает выражение постоянной времени компиляции).

const значения могут быть установлены во время выполнения. Например:

#include <iostream> 

int main() { 
    int x; 
    std::cin >> x; 

    const int y = x; // This is totally fine. 
    std::cout << "You entered the number " << y; 
} 

В приведенном выше примере, значение y определяется во время выполнения (после считывания значения x). Он инициализируется значением x, и после его инициализации мы не можем изменить его значение. *

Это то же самое с членом const.

Изменение переменная подразумевает, что она существует, имеет значение, а затем вы устанавливаете ее на новое значение. Здесь дело не в этом. Переменная/member не существует, пока не будет вызван конструктор. Поскольку он не существует, он не может иметь какое-то предыдущее значение. Вместо этого вы создаете переменную/член и даете ей ее (первое и единственное) значение, все в одно и то же время (это то, что мы имеем в виду, когда говорим об инициализации). В этом процессе нет .

* const_cast позволяет нам изменить значение ссылки const на переменную, которая первоначально не была const. Таким образом, обходные пути существуют. Но если исходная переменная (а не только ссылка) равна const, вы будете вызывать неопределенное поведение, если вы ее измените. К счастью, вам нужно уйти с дороги, чтобы сделать это, поэтому, если вы делаете это, вероятно, не случайно.

+0

Я думал о создании строки, например, «const string name» - это то, где она была бы инициализирована, если это не так, не следует комментировать код компилируется, поскольку я еще не инициализировал его? – Wolf

+1

@Wolf: Но это член класса, а не переменная. Это не существует, пока вы не создадите экземпляр этого класса (вызовите конструктор). Поэтому имеет смысл инициализировать const member в конструкторе. Если вы хотите, чтобы константный член был одинаковым для всех экземпляров одного и того же класса, для этого используется ключевое слово 'static'. –

+0

@Wolf: Действительно, поскольку Jaa-c сказал, переменная 'name' не создается, пока вы не создадите экземпляр класса' test', что вы делаете, когда вы создаете и создаете этот объект 'a' в своем коде , Прокомментированный код отличается тем, что он фактически * был * уже инициализирован. 't1' инициализируется в этой первой строке, потому что запускается его конструктор по умолчанию (что приводит к пустой строке). – Cornstalks

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