Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
1

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

13.10.2012, 15:18. Просмотров 1032. Ответов 11
Метки нет (Все метки)

Здравствуйте, я изучаю С++ по книге Джесс Либерти: Освой самостоятельно 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 локальные значения должны удаляться из памяти?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2012, 15:18
Ответы с готовыми решениями:

Методы доступа. Как именно метод привязывается к определённой переменной
Привет,форумчане. Изучаю с++ по Либерти. Дошёл до классов,точнее до...

Как это работает? Я хочу спросить как работает C++ и где можно про него почитать
Привет, котоны. Заранее благодарю. Это будет моих общих вопросов нить, т.к....

Русификация.Работает-супер! Обьяснитте, как это работает?
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; using...

Методы доступа к данным Get и Set
Доброе время суток! Мне нужна информация по Get та Set, а точнее по методам...

Как это работает?
Здравствуйте, можете, пожалуйста, поэтапно объяснить как работает приведенный...

11
Jupiter
Каратель
Эксперт С++
6570 / 3991 / 400
Регистрация: 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)
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 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
1
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
0
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,382
13.10.2012, 22:19 5
Цитата Сообщение от svpol Посмотреть сообщение
itsAge
эта переменная в области видимости всего класса а не функции, так как она описана в классе

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

Добавлено через 1 минуту
поэтому после изменения значения она сохраняет его
Спасибо, вот об этом нюансе в учебнике, честно говоря, ни слова.
0
alsav22
5445 / 4840 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 00:55 8
svpol, у вас объект Frisky создан в функци main(), поэтому все поля этого объекта, в том числе поле itsAge, с которым работают методы, находится в области видимости функции main().
1
warchief
36 / 36 / 0
Регистрация: 09.08.2012
Сообщений: 128
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 создай ярлык любого файла и удали файл. Ярлык больше не работает (тогда как копия выше работала)
Но при этом ярлык экономит память и позволяет быстрее получить объект, так и указатель или ссылка делают тоже самое.
0
alsav22
5445 / 4840 / 831
Регистрация: 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().
0
Croessmah
++Ͻ
14777 / 8453 / 1605
Регистрация: 27.09.2012
Сообщений: 20,803
Записей в блоге: 2
Завершенные тесты: 1
14.10.2012, 11:01 11
Цитата Сообщение от warchief Посмотреть сообщение
Зря, я вот по ней как раз начинал учиться, это единственная книга по С++ которую я полностью прочел
На вкус и цвет. Это единственная книга, которую я не до читал =)))
0
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
14.10.2012, 16:24  [ТС] 12
Цитата Сообщение от warchief Посмотреть сообщение
Об этом ты должен был узнать из тем про оператор приравнивания
operator = ()
Насколько я помню "=" - это оператор присваивания, а не приравнивания. Ну в любом случае спасибо, я в общем и целом принцип понял
0
14.10.2012, 16:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 16:24

Как это работает?
#include &lt;iostream&gt; int *fun() { int a = 5; return &amp;a; } int main() {...

Как это работает?
Читаю я кое какой &quot;учебник&quot;, и в нём появился такой вот кусок кода int input...

Как это работает
Здравствуйте уважаемые форумчане!Как это работает? Как например предотвратить...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru