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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 56, средняя оценка - 4.66
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
#1

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

08.08.2011, 21:09. Просмотров 7018. Ответов 64
Метки нет (Все метки)

Упражняюсь по книге Липпмана, выполняю задания по теме классы.
Необходимо реализовать класс 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++
Константные методы и объекты класса C++
Константные функции-члены C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
An1ka
65 / 70 / 2
Регистрация: 30.06.2011
Сообщений: 176
12.08.2011, 13:51     Константные функции-члены класса, возвращающие ссылку на константу #61
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Итератор становится недействительными только если элемент на который он указывал был удален или перемещен, поэтому инвалидация итератора и изменение контейнера слабо связанные события. Да и итератор, как возвращаемое значение метода, довольно редкое явление, в отличии от указателей и ссылок.
Если есть несколько контейнерных классов, то взаимодействие между ними будет происходить как раз через итераторы (актуально при поиске элемента). Но тут суть в другом. Ссылки сами по себе уже являются более опасными, чем указатели. Указатель и итератор всегда можно проверить на валидность, а у ссылки происходит автоматическое разыменование адреса без каких либо проверок.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Эксперт С++
 Аватар для easybudda
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
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
3021 / 1677 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
12.08.2011, 14:41     Константные функции-члены класса, возвращающие ссылку на константу #63
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Итератор становится недействительными только если элемент на который он указывал был удален или перемещен, поэтому инвалидация итератора и изменение контейнера слабо связанные события.
Ну почему же. При некоторых изменениях последовательных контейнеров (исключая список) иногда часть, а иногда и все их итераторы становятся недействительными. Например, вставка в начало или в конец дека делает недопустимыми все его итераторы.
grizlik78
Эксперт С++
 Аватар для grizlik78
1890 / 1422 / 104
Регистрация: 29.05.2011
Сообщений: 2,977
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++ В каких случаях компилятор делает функции-члены класса встроенными (inline)?
C++ Константные указатели и указатели на константу
Использование указателей на функции-члены внутри самого класса C++

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

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

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

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