it-swarm.com.ru

Объявление указателя C ++ Const

Я просматриваю код и наткнулся на код, с которым я не знаком. После некоторых поисков я не смог придумать ни одного примера того, почему это сделано, или выгоды от этой декларации.

myClass const * const myPtr = myClass->getPointer();

Это объявление константного указателя или что-то совсем другое?

17
Wesley

Это означает, что "myPtr - это const указатель на constmyClass". Это означает, что вы не можете ни изменить на что указывает указатель через этот указатель, ни вы не можете сделать указатель куда-то еще после его инициализации (возвращаемым значением myClass->getPointer()) , Так что да, вы в основном правы, с добавлением, что он также указывает на объект const (насколько вы знаете; на самом деле это может быть не -const внизу).

Помните, что const применяется к элементу слева (или, если нет элемента слева, элемент справа). Первое const создает myClassconst (где вы не можете изменить то, на что указывает указатель), а второе const делает * const (где вы не можете изменить сам указатель).

26
Seth Carnegie

В некоторых случаях вы можете увидеть это так:

const myClass * const myPtr = myClass->getPointer(); 

Эти два эквивалента, а именно постоянный указатель на постоянный объект. Я предпочитаю синтаксис, который вы показали, потому что его легче понять новичкам при чтении справа налево:

Object * const obj;        // read right-to-left:  const pointer to Object
Object const * obj;        // read right-to-left:  pointer to const Object
Object const * const obj;  // read right-to-left:  const pointer to const Object 
20
Matt Davis

Правило состоит в том, что ключевое слово const применяется к "Слову" слева от него, если только это не первое Слово в строке, и в этом случае оно применяется к "Слову" справа от него. Итак: myClass const * const: myClass <- const, указатель <- const, постоянный указатель на const myClass.

По какой-то причине в большинстве кода (по крайней мере, тот, который я видел) это будет объявлено как const myClass * const. Почему я понятия не имею, потому что теперь вы должны принять во внимание исключение "const относится к Word слева, если это не первое слово в строке". То есть, писать строки так, как это делается в коде, который вы просматриваете, намного понятнее.

4
Darhuuk

Это объявляет постоянный указатель на постоянное значение, возвращаемое путем вызова функции-члена указателя разыменования myClass

1
111111

Сет на деньги. Есть еще кое-что, что может оказаться полезным для Duramecho .

1
Jon Cage

Первое const является допустимым использованием, в то время как второе const является излишним IMO.

Когда вы используете

myClass const * const myPtr = myClass->getPointer();

Вы не можете изменить объект, на который указывает myPtr.
Вы не можете изменить место, на которое указывает myPtr.

myPtr->SomeMember = SomeValue; // Not allowed. That's OK.
                               // The state of myClass is protected.

myPtr = nullptr; // That's not allowed either.
                 // I don't think it is necessary to disallow this.

Вы должны быть в состоянии использовать

myClass const * myPtr = myClass->getPointer();

без какого-либо вреда.

0
R Sahu