2015-04-07 3 views
1

Я изучаю указатели, константы. Я в какой-то момент смущен. Я узнал, что назначение C++ указателю nonconst запрещено в C++, но его можно решить с помощью const_cast. Все нормально.Назначение адреса nonconst указателю const

Однако присвоение адреса переменной nonconst указателю const допускается. Я не понимал, почему это разрешено. Посмотрите приведенный ниже пример. В этом примере ptr является указателем на const int. Однако значение, которое ptr указывает на изменения. Здесь есть противоречие, потому что значение const int, которое ptr указывает на изменения. Можете ли вы объяснить это противоречие, или если я ошибаюсь, можете ли вы объяснить, почему?

#include <iostream> 
using namespace std; 

int main() { 

    int year = 2012; 
    const int* ptr = &year; 
    year=100; 
    year=101; 
    cout << *ptr; 
    // 101 is printed, the value ptr points to change whenever year changes 

    return 0; 
} 
+0

'Const INT * ptr', просто означает, не может изменить значение с помощью' ptr', вы не можете предотвратить другие модификации пути ... – songyuanyao

+0

OMG, на самом деле ? то это означает, что он запрещает только модификацию через разыменование ptr – metis

+0

Да, это запрещает только разыменование ptr для записи. BTW: проверка const выполняется в кратчайшие сроки, а в качестве компилятора невозможно проверить другие модификации. – songyuanyao

ответ

3

Если вы знаете о доступе к файлам, указание указателя на константу похоже на открытие файла только для чтения. Вам предоставляется дескриптор файла, который можно использовать только для чтения, но это не означает, что файл не может быть изменен каким-либо другим способом.

Аналогичным образом, если у вас есть указатель на константу, у вас есть способ чтения объекта, но не записи. Однако это не означает, что объект не может быть записан каким-либо другим способом.

1

Посмотрите на этот пример:

int year=5; // is allowed 
//const int year=5; // is also allowed 

const int* ptr = &year;   // ptr points to const data, but has nonconst address 
*ptr = 141;      // its not allowed 
++ptr;       // allowed 

int* const constPointer = &year; // ptr points to nonconst data, but has const adress 
*constPointer = 8;    // allowed 
++constPointer;     // not allowed 

// pointed value and pointer are const 
const int* const constDataAndPointer = &year; // ptr points to const data, also has const adress 
*constDataAndPointer = 124;  // not allowed 
++constDataAndPointer;   // not allowed 
+0

Я не понял ваши комментарии, не могли бы вы его обновить? – metis

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