Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
12.08.2011, 13:51     Константные функции-члены класса, возвращающие ссылку на константу #61
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Итератор становится недействительными только если элемент на который он указывал был удален или перемещен, поэтому инвалидация итератора и изменение контейнера слабо связанные события. Да и итератор, как возвращаемое значение метода, довольно редкое явление, в отличии от указателей и ссылок.
Если есть несколько контейнерных классов, то взаимодействие между ними будет происходить как раз через итераторы (актуально при поиске элемента). Но тут суть в другом. Ссылки сами по себе уже являются более опасными, чем указатели. Указатель и итератор всегда можно проверить на валидность, а у ссылки происходит автоматическое разыменование адреса без каких либо проверок.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
12.08.2011, 14:41     Константные функции-члены класса, возвращающие ссылку на константу #62
Цитата Сообщение от An1ka Посмотреть сообщение
Указатель и итератор всегда можно проверить на валидность
да ну?
C
1
2
3
4
char * ptr = strdup("bla bla bla");
free(ptr);
if ( ptr != NULL )
  strcpy(ptr, "BLA BLA BLA");
угадайте, что получится?
Mr.X
Эксперт С++
 Аватар для Mr.X
2802 / 1578 / 247
Регистрация: 03.05.2010
Сообщений: 3,666
12.08.2011, 14:41     Константные функции-члены класса, возвращающие ссылку на константу #63
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Итератор становится недействительными только если элемент на который он указывал был удален или перемещен, поэтому инвалидация итератора и изменение контейнера слабо связанные события.
Ну почему же. При некоторых изменениях последовательных контейнеров (исключая список) иногда часть, а иногда и все их итераторы становятся недействительными. Например, вставка в начало или в конец дека делает недопустимыми все его итераторы.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
12.08.2011, 14:45     Константные функции-члены класса, возвращающие ссылку на константу #64
Цитата Сообщение от Mr.X Посмотреть сообщение
Например, вставка в начало или в конец дека делает недопустимыми все его итераторы.
Зато ссылки и указатели на элементы в этом случае остаются действительными.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2011, 01:26     Константные функции-члены класса, возвращающие ссылку на константу
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
14.08.2011, 01:26     Константные функции-члены класса, возвращающие ссылку на константу #65
Цитата Сообщение от Mr.X Посмотреть сообщение
Ну почему же. При некоторых изменениях последовательных контейнеров (исключая список) иногда часть, а иногда и все их итераторы становятся недействительными. Например, вставка в начало или в конец дека делает недопустимыми все его итераторы.
Все верно, я просто уточнил, что не обязательно при изменении контейнера итераторы становятся невалидными, все зависит от типа контейнера и как именно он изменяется.

Цитата Сообщение от An1ka Посмотреть сообщение
Указатель и итератор всегда можно проверить на валидность
Единственное на что можно проверить указатель не специфичными для ОС средствами так это на ноль, указуемый же объект так или иначе може умереть без ведома указателя. Итератор же вы вообще никак не проверите.
Yandex
Объявления
14.08.2011, 01:26     Константные функции-члены класса, возвращающие ссылку на константу
Ответ Создать тему
Опции темы

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