LINUX.ORG.RU

Передача по ссылке и модификатор const

 ,


0

3

Не могу понять следующую запись:

ConfigDialog(const QString & firstPageName)
{

}


Что она означает?

То, что внутри функции не будет меняться содержимое объекта firstPageName?

Или то, что внутри функции не будет меняться значение указателя на firstPageName (ведь ссылка - это по сути другая, более удобная для определений, форма записи указателя)?

★★★★★

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

Или то, что внутри функции не будет меняться значение указателя на firstPageName (ведь ссылка - это по сути другая, более удобная для определений, форма записи указателя)?

welcome to c++ world, в некоторых вещах логику лучше не искать

elijah_sd ()

Или то, что внутри функции не будет меняться значение указателя на firstPageName (ведь ссылка - это по сути другая, более удобная для определений, форма записи указателя)?

Ссылка — не указатель, и на что она указывает, ты изменить не можешь. Т.е. reference = smth; эквивалентно *pointer = smth;.

Ты бы почитал что-нибудь по крестам, как тебе уже неоднократно советовали, либо иди на SO с такими вопросами.

anonymous ()
Ответ на: комментарий от elijah_sd

Ты не можешь в кресты и написал полнейший бред.

anonymous ()
Ответ на: комментарий от elijah_sd

ссылка нужна для экономии памяти

Вы это серьезно?

andreyu ★★★★★ ()

Содержимое менять нельзя, компилятор сделает а-та-та.

#include <stdio.h>

class Mut {
        public:
                int i;
};

void mod(const Mut & m) {
        m.i = m.i + 5;
}

int main() {

        Mut m;

        m.i = 0;

        mod(m);

        printf("i=%d\n", m.i);

        return 0;
}

Ругается вот так:

t.cpp: In function ‘void mod(const Mut&)’:
t.cpp:10:6: error: assignment of member ‘Mut::i’ in read-only object
  m.i = m.i + 5;

anonymous ()

Данная запись означает, что не будет меняться сам объект - ссылка на константные данные.

m0rph ★★★★★ ()
Ответ на: комментарий от anonymous

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

Xintrea ★★★★★ ()
Ответ на: комментарий от anonymous

Да, и ты не пояснил, какого типа у тебя smth, поэтому твое объяснение ничего не объясняет.

Xintrea ★★★★★ ()

Есть альтернативная и эквивалентная форма записи для const-volatile модификаторов, которая может упростить понимание. А именно - константно то, что слева.

Примеры:

Object(Object const& object); //константен обьект
Object(Object & const object); //ошибка к ссылке не могут быть применены const/volatile модификаторы
Object(Object const* object); //константен обьект, указатель можно менять
Object(Object *const object); //Обьект можно менять, указатель константен
Object(Object const *const object); //Константен обьект, указатель константен

Но вообще почитай таки того же трупа или верёвку, а то ты своему продукту антирекламу создаёшь такими вопросами :)

pon4ik ★★★★★ ()
Ответ на: комментарий от m0rph

Данная запись означает, что не будет меняться сам объект - ссылка на константные данные.

Вот ты сам то понял что сказал?

Не будет меняться сам объект?

Не будет меняться ссылка на константные данные?

Не будет меняться и сам объект и ссылка на константные данные?

Что ты имел в виду?

Xintrea ★★★★★ ()
Ответ на: комментарий от pon4ik

Есть альтернативная и эквивалентная форма записи для const-volatile модификаторов, которая может упростить понимание. А именно - константно то, что слева.

Фак мой мозг! Слева ОТ ЧЕГО?

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

какого типа у тебя smth

Любого, который кастуется в тип reference/*pointer. Не в обиду будет сказано, но это какая-то глупость.

anonymous ()
Ответ на: комментарий от Xintrea

Ссылка вообще не может меняться и указывает всегда на один объект.

Не будет меняться сам объект?

да

Не будет меняться ссылка на константные данные?

да

Не будет меняться и сам объект и ссылка на константные данные?

чем это отличается от предыдущего?

anonymous ()
Ответ на: комментарий от Xintrea

Когда я был маленький, один умный дядя мне очень доступно, хоть и не совсем правильно приподнёс модель того как следует интерпретировать ссылки в крестах.

«Ссылка это второе имя обьекта». Имена в c++ менять нельзя.

Другой набор аналогий (из мира позиксовых fs понятий): hardlink - это ссылка, symlink - это указатель.

pon4ik ★★★★★ ()
Ответ на: комментарий от Xintrea

А вообще фу таким быть, отдай информацию обратно :)

pon4ik ★★★★★ ()
Ответ на: комментарий от Xintrea

Вот ты сам то понял что сказал?

Не будет меняться сам объект?

Не будет меняться ссылка на константные данные?

Не будет меняться и сам объект и ссылка на константные данные?

Что ты имел в виду?

Я же вроде бы конкретно написал: «Не будет меняться сам объект». Вторая часть предложения говорит о том что этот аргумет функции является «ссылкой на константные данные». Ссылка ссылается на что-то константное, неизменяемое, т.е. объет изменить нельзя.

m0rph ★★★★★ ()
Ответ на: комментарий от anonymous

Ссылка — не указатель, и на что она указывает, ты изменить не можешь. Т.е. reference = smth; эквивалентно *pointer = smth;.

Ты это говоришь в контексте использования const или вообще?

Xintrea ★★★★★ ()
Ответ на: комментарий от andreyu

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

elijah_sd ()
Ответ на: комментарий от pon4ik

Когда я был маленький, один умный дядя мне очень доступно, хоть и не совсем правильно приподнёс модель того как следует интерпретировать ссылки в крестах.

в какой-то книге по крестам предлагалось объяснить разницу между ссылкой и константным указателем 3х летнему ребёнку

и в самой книге объяснение ссылок вроде было похоже на

«Ссылка это второе имя обьекта».

уж не в С++ ли за 21 день это было

Bad_ptr ★★★★ ()
Ответ на: комментарий от anonymous

Содержимое менять нельзя, компилятор сделает а-та-та.

А можно добавить mutable, и тогда при компиляции с g++ -D_SHOOTING_YOURSELF_IN_THE_FOOT скомпилируется без ошибок.

i-rinat ★★★★★ ()

То, что внутри функции не будет меняться содержимое объекта firstPageName?

То, что внутри функции компилятор позволит вызывать только const-методы у firstPageName (при условии, что не будет приведений типов, снимающих с firstPageName константность).

Изменится ли при этом объект или нет, зависит от того, используются ли внутри QString mutable-поля.

eao197 ★★★★★ ()
Ответ на: комментарий от eao197

Изменится ли при этом объект или нет, зависит от того, используются ли внутри QString mutable-поля.

Не от этого зависит, константный объект может поменяться без mutable членов и без использования const_cast. Константность относится только непосредственно к полям класса, но не к объекту целиком.

mashina ★★★★★ ()
Ответ на: комментарий от mashina

Не от этого зависит, константный объект может поменяться без mutable членов и без использования const_cast.

Как это возможно при отсутствии других ссылок на этот объект?

Константность относится только непосредственно к полям класса, но не к объекту целиком.

Не распарсил.

eao197 ★★★★★ ()
Ответ на: комментарий от Bad_ptr

Мэй би умный дядька спёр приём оттуда. Я сиё чудо букинистической мысли не читал.

pon4ik ★★★★★ ()
Ответ на: комментарий от eao197

Как это возможно ... Не распарсил.

Засунь чего-нибудь в std::unique_ptr и меняй из константных методов сколдько хочешь.

mashina ★★★★★ ()
Ответ на: комментарий от mashina

Хотелось бы понять, что у объекта можно поменять кроме полей?

trex6 ★★★★★ ()
Ответ на: комментарий от trex6

Хотелось бы понять, что у объекта можно поменять кроме полей?

Для этого нужно понять чем структура отличается от объекта.

mashina ★★★★★ ()
Ответ на: комментарий от mashina

Засунь чего-нибудь в std::unique_ptr и меняй из константных методов сколдько хочешь.

Если вы про такой кейс:

class A {
  std::unique_ptr< B > b_;
public :
  void f() const {
    b_->non_const();
  }
};
То это вы слишком уж глубоко копнули. Заменить указатель в A::b_ внутри A::f() вы не сможете, если я правильно помню.

eao197 ★★★★★ ()

ты лучше спроси почему даже strlen объявлен как

size_t strlen(const char *s);

суть такая, что const в это случае означает, что результат функции будет правдив в том случае, если содержимое памяти не изменялось во время работы функции

думаю, в твоём случае аналогично

забей короче =)

reprimand ★★★★★ ()
Ответ на: комментарий от mashina

Хотелось бы конкретный ответ услышать. Или его нет?

trex6 ★★★★★ ()
Ответ на: комментарий от reprimand

суть такая, что const в это случае означает, что результат функции будет правдив в том случае, если содержимое памяти не изменялось во время работы функции

ересь

trex6 ★★★★★ ()
const QString & firstPageName

Такие вещи в плюсах нужно читать с конца. Т.е. firstPageName - это ссылка (&) на QString, который const. Таким образом константа тут переменная, на которую ссылается firstPageName.

Ну, а ссылка - это константный указатель, который автоматически разыменовывается компилятором. Поэтому firstPageName всегда ссылается на одну и ту же переменную. Т.е. ссылка всю свою жизнь ссылается туда, куда ей указали при рождении (создании).

anonymous ()
ConfigDialog(QString const& firstPageName)
{

}

так понять проще?

nikitos ★★ ()
Ответ на: комментарий от reprimand

Полный бред. Тут конст означает то, что strlen не поменяет то, что записано по этому указателю. Можно легко запомнить, что const относится к тому, что слева от него, а если слева ничего нет, то к тому, что справа. Тут слева ничего, а справа char. Вот эти char'ы функцией не изменятся.

hlebushek ()
Ответ на: комментарий от nikitos

так понять проще?

Конечно, нет. Почему бы не написать:

ConfigDialog(QString const &firstPageName)


Ведь с точки знрения компилятора никакой разницы.

Xintrea ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.