Форум программистов, компьютерный форум CyberForum.ru

Константные функции-члены класса, возвращающие ссылку на константу - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.66
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 21:09     Константные функции-члены класса, возвращающие ссылку на константу #1
Упражняюсь по книге Липпмана, выполняю задания по теме классы.
Необходимо реализовать класс person, который способен хранить имя и адрес человека, а также создать функции, возвращающие при обращении имя и адрес.
Вопрос, который ставит автор книги: "Должны ли эти функции быть константными? Объясните почему."
Вот тут я начал путаться. Вот моя реализация:
файл person.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#ifndef PERSON_H_
#define PERSON_H_
 
class person {
public:
    //конструктор, принимающий две строки типа string
    person( std::string &_name, std::string &_addres ) :
        name( _name ), addres( _addres ) {
    }
    //метод, возвращающий addres
    const std::string &get_addres() const {
        return addres;
    }
    //метод, возвращающий name
    const std::string &get_name() const {
        return name;
    }
 
private:
    //поле для хранения имени
    std::string name;
    //поле для хранения адреса
    std::string addres;
};
 
#endif /* PERSON_H_ */
Для тестирования класса, файл test_class_person.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "person.h"
using namespace std;
 
int main() {
    string str1 = "Alexander";
    string str2 = "Zelenogradsk";
    person pers( str1, str2 );
    cout << pers.get_name() << " " << pers.get_addres() << endl;
    
    string str3 = pers.get_name();
    str3 += "222";
    cout << str3 << " " << pers.get_name();
    return 0;
}
Я решил так
1) Константными эти функции должны быть, так как они не меняют значений переменных-членов объекта.
2) Возвращать они должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования.
Прав ли я? Если нет, то объясните почему.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2011, 21:09     Константные функции-члены класса, возвращающие ссылку на константу
Посмотрите здесь:

C++ Константные статические объекты класса.
класс «Строка» (данные-члены класса – строчка, функции-члены класса – операции) C++
C++ Константные функции-члены ?
константные поля класса C++
Почему нехорошо себя ведёт конструктор класса (не компилится ничё), если ему параметром ссылку на константу? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
08.08.2011, 22:18     Константные функции-члены класса, возвращающие ссылку на константу #2
Да, Вы правы
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
08.08.2011, 22:42     Константные функции-члены класса, возвращающие ссылку на константу #3
Цитата Сообщение от Roof Посмотреть сообщение
1) Константными эти функции должны быть, так как они не меняют значений переменных-членов объекта.
В противном случае их нельзя будет вызвать для константных объектов. Например:
C++
1
2
3
4
void func(const person& p)
{
    p.get_addres(); // ошибка, если get_addres() не является константным методом
}
Т.е. для константного this вызываются константные методы, а для неконстантного соответственно неконстантные(либо константные, если неконстантные не объявлены).
Цитата Сообщение от Roof Посмотреть сообщение
2) Возвращать они должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования.
Да.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.08.2011, 22:44     Константные функции-члены класса, возвращающие ссылку на константу #4
Цитата Сообщение от Roof Посмотреть сообщение
Возвращать они должны лишь константную ссылку на строку, а не просто тип string, дабы избежать ненужного копирования.
Нет .
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.08.2011, 22:49     Константные функции-члены класса, возвращающие ссылку на константу #5
Цитата Сообщение от PointsEqual Посмотреть сообщение
Нет .
почему нет? где-то на глаза мне попадалась статья где объяснялось почему в Qt отказались от возвращения ссылки на константу и возвращают просто объект, но я уж непомню детали той статьи, а ссылка утеряна
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.08.2011, 22:52     Константные функции-члены класса, возвращающие ссылку на константу #6
Цитата Сообщение от Maxwe11 Посмотреть сообщение
почему нет?
потому что возвращенная ссылка может пережить свой объект.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 23:03  [ТС]     Константные функции-члены класса, возвращающие ссылку на константу #7
2 rangerx - твой пример проверил, действительно, так и есть. Спасибо, за информацию.
А про второй пункт мнения, гляжу, разные.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.08.2011, 23:06     Константные функции-члены класса, возвращающие ссылку на константу #8
кстати Roof, конструктор лучше записать так
C++
1
person( const std::string &_name, const std::string &_addres )...
Добавлено через 18 секунд
Цитата Сообщение от PointsEqual Посмотреть сообщение
потому что возвращенная ссылка может пережить свой объект.
а пример можно?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.08.2011, 23:11     Константные функции-члены класса, возвращающие ссылку на константу #9
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а пример можно?
например так
C++
1
string sss = (person(s1,s2).get_name());
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 23:11  [ТС]     Константные функции-члены класса, возвращающие ссылку на константу #10
Цитата Сообщение от Maxwe11 Посмотреть сообщение
кстати Roof, конструктор лучше записать так
C++
1
person( const std::string &_name, const std::string &_addres )...
Нну да, согласен. Ведь данный конструктор не меняет значений параметров.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.08.2011, 23:23     Константные функции-члены класса, возвращающие ссылку на константу #11
Maxwe11, если ссылка утерена, об этом можно у Мэйерса почитать (28 правило, 55сов.)
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.08.2011, 23:37     Константные функции-члены класса, возвращающие ссылку на константу #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
да, но у Майерса пример с ссылкой на локальный объект
а такой код например отрабатывает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const std::string & person::get_addres() const
{
     return addres;
}
 
const std::string & person::get_name() const
{
     return name;
}
 
int main()
{
    std::string name, addr;
 
    {
        person per(std::string("Vasya"), std::string("world"));
        name = per.get_name();
        addr = per.get_addres();
    }
 
    std::cout << name << '\n' << addr;
    return 0;
}
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
08.08.2011, 23:40  [ТС]     Константные функции-члены класса, возвращающие ссылку на константу #13
2 PointsEqual
1) Т.е., насколько я понимаю - в методах моего класса нужно вернуть объект типа string, а не ссылку на константу?
2) Желаю разобраться, что же в этом примере "плохого".
Я его понимаю так - sss присваивается значение, возвращаемое методом get_name(), а этот метод вызвал временный объект типа person. Т.е. объект исчез, а ссылка так и осталась висеть в памяти? Если бы метод get_name() возвращал объект типа string, то этот возвращаемый объект исчезнет вместе с временным объектом типа person?
C++
1
2
3
4
string str1 = "Alexander";
string str2 = "Zelenogradsk";
string sss = ( person( str1, str2 ).get_name() );
cout << sss << endl; //выводит Alexander
Я правильно понял?
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
08.08.2011, 23:48     Константные функции-члены класса, возвращающие ссылку на константу #14
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а такой код например отрабатывает
да отрабатывает. Но все равно, я бы не стал возвращать ссылку.

Добавлено через 4 минуты
Цитата Сообщение от Roof Посмотреть сообщение
Я правильно понял?
да .
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
08.08.2011, 23:51     Константные функции-члены класса, возвращающие ссылку на константу #15
Цитата Сообщение от Maxwe11 Посмотреть сообщение
name = per.get_name();
так тут обычный
string& operator= ( const string& str );
ссылка не живет дольше времени
Сыроежка
Заблокирован
09.08.2011, 01:25     Константные функции-члены класса, возвращающие ссылку на константу #16
Цитата Сообщение от PointsEqual Посмотреть сообщение
Maxwe11, если ссылка утерена, об этом можно у Мэйерса почитать (28 правило, 55сов.)
Забавный случай. Вы не правильно поняли Майерса и, делая неправильные рекомендации, при этом ссылаетесь на Майерса. Приведенный вами пример, якобы, демонстрирующий ваше утверждение, как раз демонстрирует противоположное вашему утверждение. То есть приведенный вами пример корректно работае и не является подтверждением вашего утверждения.

Так что вам еще раз придется перечитать Майерса..

Добавлено через 4 минуты
Цитата Сообщение от Roof Посмотреть сообщение
2 PointsEqual
1) Т.е., насколько я понимаю - в методах моего класса нужно вернуть объект типа string, а не ссылку на константу?
2) Желаю разобраться, что же в этом примере "плохого".
Я его понимаю так - sss присваивается значение, возвращаемое методом get_name(), а этот метод вызвал временный объект типа person. Т.е. объект исчез, а ссылка так и осталась висеть в памяти? Если бы метод get_name() возвращал объект типа string, то этот возвращаемый объект исчезнет вместе с временным объектом типа person?
C++
1
2
3
4
string str1 = "Alexander";
string str2 = "Zelenogradsk";
string sss = ( person( str1, str2 ).get_name() );
cout << sss << endl; //выводит Alexander
Я правильно понял?
Нет, вы все правильно делали. Просто данный советчик еще сам плавает в понимании С++.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
09.08.2011, 02:50  [ТС]     Константные функции-члены класса, возвращающие ссылку на константу #17
2 Сыроежка - спасибо за комментарий.
Желаю разобраться в этом вопросе досконально, потому буду ждать еще комментарии форумчан.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.08.2011, 13:43     Константные функции-члены класса, возвращающие ссылку на константу #18
C++
1
string sss = ( person( str1, str2 ).get_name() );
Тогда уж
C++
1
const string & sss = ( person( str1, str2 ).get_name() );
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
09.08.2011, 16:10  [ТС]     Константные функции-члены класса, возвращающие ссылку на константу #19
2 Deviaphan - а почему это будет лучше? Или правильней? По-моему это лишь другой вариант, ничем не лучше первого.
Хочу обоснование.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2011, 17:38     Константные функции-члены класса, возвращающие ссылку на константу
Еще ссылки по теме:

Константные методы и объекты класса C++
Константные функции-члены C++
Где инициализировать константные данные класса? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.08.2011, 17:38     Константные функции-члены класса, возвращающие ссылку на константу #20
Цитата Сообщение от Roof Посмотреть сообщение
Хочу обоснование.
Я не говорю, что лучше. Я продемонстрировал реальное появление ошибки. Последующее использование sss приведёт к ошибке.
Yandex
Объявления
09.08.2011, 17:38     Константные функции-члены класса, возвращающие ссылку на константу
Ответ Создать тему
Опции темы

Текущее время: 23:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru