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

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

Войти
Регистрация
Восстановить пароль
 
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
#1

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

13.10.2012, 15:18. Просмотров 944. Ответов 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++):

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

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

Русификация.Работает-супер! Обьяснитте, как это работает? - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; using namespace std; char* Rus(const char* text); int main () ...

Как это работает? - C++
Доброго времени суток. Граждане программисты, подскажите пожалуйста как работает данный кусок кода??? А точнее дружественные функции...

Как это работает? - C++
Читаю я кое какой &quot;учебник&quot;, и в нём появился такой вот кусок кода int input (tank&amp; t, char map) { char act; int ch; int e =...

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

11
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 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
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 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,361
13.10.2012, 22:19 #5
Цитата Сообщение от svpol Посмотреть сообщение
itsAge
эта переменная в области видимости всего класса а не функции, так как она описана в классе

Добавлено через 1 минуту
поэтому после изменения значения она сохраняет его
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 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
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
14.10.2012, 00:55 #8
svpol, у вас объект Frisky создан в функци main(), поэтому все поля этого объекта, в том числе поле itsAge, с которым работают методы, находится в области видимости функции main().
1
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 создай ярлык любого файла и удали файл. Ярлык больше не работает (тогда как копия выше работала)
Но при этом ярлык экономит память и позволяет быстрее получить объект, так и указатель или ссылка делают тоже самое.
0
alsav22
5421 / 4816 / 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().
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2012, 16:24
Привет! Вот еще темы с ответами:

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

Как это работает? - C++
Здравствуйте, можете, пожалуйста, поэтапно объяснить как работает приведенный ниже фрагмент кода? Что такое floor, return, ceil? double...

Как это работает? - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; int main() { char* s=new char; ...

Методы доступа к данным Get и Set - C++
Доброе время суток! Мне нужна информация по Get та Set, а точнее по методам доступа. Начал гуглить, но ничего нормального не нашел. ...


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

Или воспользуйтесь поиском по форуму:
12
Yandex
Объявления
14.10.2012, 16:24
Ответ Создать тему
Опции темы

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