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

Методы доступа - как это работает? - C++

Восстановить пароль Регистрация
 
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
13.10.2012, 15:18     Методы доступа - как это работает? #1
Здравствуйте, я изучаю С++ по книге Джесс Либерти: Освой самостоятельно C++ за 21 день. Мой вопрос, наверное, глупый, но хочется просто понять, как это работает.
Вот такой код:
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
27
28
29
30
31
32
33
34
35
36
#include <iostream>
using namespace std;
 
class Cat
{
public:
    int GetAge();
    void SetAge (int age);
    void Meow();
private:
    int itsAge;
};
 
int Cat::GetAge()
{
    return itsAge;
}
void Cat::SetAge(int age)
{ 
itsAge = age;
}
 
void Cat::Meow()
{
    cout << "Meow!" <<endl;
}
int main()
{
    Cat Frisky;
    Frisky.SetAge(5);
    Frisky.Meow();
    cout << "Frisky is a cat who is ";
    cout <<Frisky.GetAge() << " years old.\n";
    Frisky.Meow();
    return 0;
}
Вопрос заключается в следующем. Ранее в книге было написано, что аргументы, переданные функции, локальны по отношению к данной функции, то есть они действуют только в пределах той функции, в которой определены. Тут же получается, что мы передаем в функцию Frisky.SetAge значение "5", а потом это же значение возвращается функцией Frisky.GetAge(). Почему это происходит, ведь по идее после выхода из функции Frisky.SetAge локальные значения должны удаляться из памяти?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2012, 15:18     Методы доступа - как это работает?
Посмотрите здесь:

C++ Как это работает
Как это работает? C++
C++ Как это работает?
Как это работает? C++
Русификация.Работает-супер! Обьяснитте, как это работает? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.10.2012, 15:33     Методы доступа - как это работает? #2
http://ru.wikipedia.org/wiki/%D0%9F%...BD%D0%B8%D0%B5)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
13.10.2012, 15:40     Методы доступа - как это работает? #3
У Вас в классе есть закрытая переменная
C++
1
2
private:
int itsAge;
В функции
C++
1
2
3
4
void Cat::SetAge(int age)
{
itsAge = age;
}
в нее записывается значение
а функция
C++
1
2
3
4
int Cat::GetAge()
{
return itsAge;
}
возвращает значение переменной itsAge
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
13.10.2012, 22:14  [ТС]     Методы доступа - как это работает? #4
Цитата Сообщение от Croessmah Посмотреть сообщение
У Вас в классе есть закрытая переменная
C++
1
2
private:
int itsAge;
В функции
C++
1
2
3
4
void Cat::SetAge(int age)
{
itsAge = age;
}
в нее записывается значение
а функция
C++
1
2
3
4
int Cat::GetAge()
{
return itsAge;
}
возвращает значение переменной itsAge
Это-то как раз я понимаю, мне непонятно, почему присвоенное переменной itsAge значение сохраняется даже после выхода из функции SetAge. Это же локальное значение, ее видимость ограничивается областью определения функции SetAge
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
13.10.2012, 22:19     Методы доступа - как это работает? #5
Цитата Сообщение от svpol Посмотреть сообщение
itsAge
эта переменная в области видимости всего класса а не функции, так как она описана в классе

Добавлено через 1 минуту
поэтому после изменения значения она сохраняет его
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
13.10.2012, 22:23     Методы доступа - как это работает? #6
Цитата Сообщение от svpol Посмотреть сообщение
Это-то как раз я понимаю, мне непонятно, почему присвоенное переменной itsAge значение сохраняется даже после выхода из функции SetAge. Это же локальное значение, ее видимость ограничивается областью определения функции SetAge
Переменная itsAge описана в объявлении класса и является членом класса.
Еще раз прочитайте про то, что такое класс. И кстати, читал я эту книгу - я бы по ней не стал учиться =)
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
13.10.2012, 22:59  [ТС]     Методы доступа - как это работает? #7
Цитата Сообщение от SergProgC++ Посмотреть сообщение
эта переменная в области видимости всего класса а не функции, так как она описана в классе

Добавлено через 1 минуту
поэтому после изменения значения она сохраняет его
Спасибо, вот об этом нюансе в учебнике, честно говоря, ни слова.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 00:55     Методы доступа - как это работает? #8
svpol, у вас объект Frisky создан в функци main(), поэтому все поля этого объекта, в том числе поле itsAge, с которым работают методы, находится в области видимости функции main().
warchief
 Аватар для warchief
36 / 36 / 3
Регистрация: 09.08.2012
Сообщений: 114
14.10.2012, 07:09     Методы доступа - как это работает? #9
Цитата Сообщение от Croessmah Посмотреть сообщение
И кстати, читал я эту книгу - я бы по ней не стал учиться =)
Зря, я вот по ней как раз начинал учиться, это единственная книга по С++ которую я полностью прочел (дальше я только подбивал пробелы в знаниях материалом из других книг). Синтаксис вбился в мою голову так, что даже год в армии на это не повлиял(sic), хотя говорят что армия убивает программиста

По теме, автор вы кстати правильно мыслите. Поясню, как это работает.
вы вызываете метод класса SetAge(), передавая ему число 5. Создается локальная переменная age со значением 5. В методе вы приравниваете член класса itsAge к переменной age. Что значит приравнивание? itsAge не является подобием age, это две разные ячейки памяти просто теперь они хранят число 5, но в памяти они расположены в разных местах. То есть здесь:
itsAge = age;
itsAge не становится age. Здесь происходит копирование значения age в переменную itsAge.
Что есть копирование? Просто зайти в любую папку на компьютере и создай копию любого файла, затем удали оригинал, копия ведь при этом не удалилась? Вот и тут тоже, ты скопировал 5 в itsAge и теперь спокойно можешь удалить (точнее само удалиться) age.
Об этом ты должен был узнать из тем про оператор приравнивания
operator = ()
и копирующий конструктор
MyClass(const MyClass &)

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

И вот тут есть решение - указатели и ссылки, которые не копируют объект а являются (по аналогии с операционной системой) "ярлыком" этого объекта.
И вот здесь если бы itsAge был указателем, то при удалении age у тебя бы возникли проблемы, так как age больше не существует и itsAge содержит мусор. То есть также в проводнике Windows создай ярлык любого файла и удали файл. Ярлык больше не работает (тогда как копия выше работала)
Но при этом ярлык экономит память и позволяет быстрее получить объект, так и указатель или ссылка делают тоже самое.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 09:38     Методы доступа - как это работает? #10
Насколько я понял, вопрос у ТС не про локальную переменную age. Вопрос о том, почему GetAge() возвращает то же значение, что передаётся в SetAge(), а к локальной переменной age, метод GetAge() не имеет никакого отношения. Ответ: потому что в методе SetAge(), значение локальной переменной age сохраняется в поле itsAge объекта Frisky. Само это поле создаётся не в методе SetAge(), а вместе с объектом Frisky в функции main(). Поэтому и возврат значения этого поля происходит из объекта Frisky, созданного в main().
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
14.10.2012, 11:01     Методы доступа - как это работает? #11
Цитата Сообщение от warchief Посмотреть сообщение
Зря, я вот по ней как раз начинал учиться, это единственная книга по С++ которую я полностью прочел
На вкус и цвет. Это единственная книга, которую я не до читал =)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 16:24     Методы доступа - как это работает?
Еще ссылки по теме:

Методы доступа. Как именно метод привязывается к определённой переменной C++
C++ Как это работает?
Как это работает? Я хочу спросить как работает C++ и где можно про него почитать C++

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

Или воспользуйтесь поиском по форуму:
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
14.10.2012, 16:24  [ТС]     Методы доступа - как это работает? #12
Цитата Сообщение от warchief Посмотреть сообщение
Об этом ты должен был узнать из тем про оператор приравнивания
operator = ()
Насколько я помню "=" - это оператор присваивания, а не приравнивания. Ну в любом случае спасибо, я в общем и целом принцип понял
Yandex
Объявления
14.10.2012, 16:24     Методы доступа - как это работает?
Ответ Создать тему
Опции темы

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