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

Почему метод класса затирает статическое поле - C++

Восстановить пароль Регистрация
 
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
30.10.2015, 13:59     Почему метод класса затирает статическое поле #1
Добрый день Я учу самостоятельна с++. Сейчас разбираю тему классы. Вот у меня возник вопрос по коду:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<iostream>
using namespace std;
 
class maxim{
    int a; 
    static int b;
    
    public:
    maxim();
    ~maxim();
    void daiwud();
    void daiwud1();
};
 
int maxim::b;
 
maxim::maxim()
{
    a=4;
    b=0;
}
 
maxim::~maxim()
{
    cout << "razryw;\n";
}
 
void maxim::daiwud()
{
    a=a+1;
    b=b+2;
    
    cout << a << " - eto a;\n";
    cout << b << " - eto b;\n\n";
}
 
void maxim::daiwud1()
{
    cout << a << " - eto a;\n";
    cout << b << " - eto b;\n\n";
    b=b+2;
}
 
void funk();
 
int main()
 {
    maxim a, b;
    
    a.daiwud();
    b.daiwud1();
    
    funk();
    
    
    return 0;
 }
 
void funk()
{
    maxim c;
    
    c.daiwud1();
}

Почему третий метод funk(); затирает статическую переменную, если при вызове void maxim::daiwud1() стоит условие b=b+2; ? То есть этот метод ничем не отлич. от b.daiwud1(); , а результат разный.

Сам код ничего не делает , я просто разбираюсь в логике. Помогите понять что не так Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2015, 13:59     Почему метод класса затирает статическое поле
Посмотрите здесь:

C++ Статическое поле
почему игнорируется метод класса C++
C++ Указатель на метод и на поле класса
C++ Статическое поле класса, имеющее тип того же класса
Статическое поле,количество экземпляров класса C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
30.10.2015, 14:34     Почему метод класса затирает статическое поле #2
Цитата Сообщение от daiwud Посмотреть сообщение
Почему третий метод funk(); затирает статическую переменную
Потому что там создаётся объект класса maxim, в конструкторе которого b устанавливается в 0.
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
30.10.2015, 16:23  [ТС]     Почему метод класса затирает статическое поле #3
Т.е. если вызов класса за пределами функции main происходит , то статическая переменная затирается и не сохраняет своего значения?
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
30.10.2015, 19:17     Почему метод класса затирает статическое поле #4
Цитата Сообщение от daiwud Посмотреть сообщение
Т.е. если вызов класса за пределами функции main происходит , то статическая переменная затирается и не сохраняет своего значения?
Статическая переменная одна, а объектов много. Каждый вызов конструктора для нового объекта перепишет ее значение. Где находится объект роли не играет.

Наверняка тебе что-то такое нужно:
Цитата Сообщение от daiwud Посмотреть сообщение
C++
1
2
3
4
5
6
int maxim::b = 0; // добавить 
maxim::maxim() 
{ 
    a=4; 
    //b=0; убрать 
}
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
02.11.2015, 14:13  [ТС]     Почему метод класса затирает статическое поле #5
Подскажите пожалуйста, почему тогда b.daiwud1(); при вызове отображает статическую переменную как 2.
Ведь я в конструкторе поставил такое условие b=0;
Т.е. у меня перем. a=4; перезаписалась с первого вызова обратно на 4, а статическая перем. осталась - 2.
Потом при вызове третьего метода статическая переменная перезаписалась на 0 обратно.

Так вот, в чем отличие вызова метода b.daiwud1(); и с.daiwud1(); ?

Добавлено через 8 минут
DrOffset

Но Вам отдельное спасибо за разъяснение, как можно привязать одну переменную ко всем методам Я честно говоря не понимал этого. Теперь буду знать.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,626
02.11.2015, 19:25     Почему метод класса затирает статическое поле #6
Цитата Сообщение от daiwud Посмотреть сообщение
Подскажите пожалуйста, почему тогда b.daiwud1(); при вызове отображает статическую переменную как 2.
Ведь я в конструкторе поставил такое условие b=0;
Т.е. у меня перем. a=4; перезаписалась с первого вызова обратно на 4, а статическая перем. осталась - 2.
Потом при вызове третьего метода статическая переменная перезаписалась на 0 обратно.
1) Сначала вызывались два конструктора для объектов a и b. (строка 48)
2) В каждом из этих конструкторов было присвоено переменной maxim::b - ноль. Сначала конструктор "а" присвоил переменной maxim::b ноль, потом конструктор b присвоил переменой maxim::b ноль. Напоминаю, переменная эта одна и та же. (строка 20)
Идем далее.
3) Вызываем функцию maxim::daiwud() у объекта a. Увеличение maxim::b на 2. Т.е. b = b + 2; (b = 0 + 2) (строка 31). Затем вывод этого значения на экран (2) (строка 34).
4) Вызываем функцию maxim::daiwud1() у объекта b. В ней сначала выводится на экран значение переменной maxim::b, т.е. выводится 2 (строка 40). Затем выполняется увеличение переменной (строка 41) еще раз на 2, т.е. b = b + 2; (b = 2 + 2). В maxim::b число 4.
5) Потом вызывается функция funk();, которая создает локальный объект с, конструктор этого объекта выполняет присваивание нуля переменной maxim::b, затирает ее. Функция c.daiwud1(); вызванная позже, сначала выводит ноль из переменой maxim::b, затем выполняет увеличение на 2, т.е. в переменной maxim::b опять 2.

Цитата Сообщение от daiwud Посмотреть сообщение
Так вот, в чем отличие вызова метода b.daiwud1(); и с.daiwud1(); ?
Отличие в том, что эти функции по разному работают с maxim::b. Одна функция сначала увеличивает значение, потом его печатает, а другая - наоборот, сначала печатает, потом увеличивает.
Fallenworld
75 / 75 / 9
Регистрация: 14.04.2014
Сообщений: 408
02.11.2015, 20:07     Почему метод класса затирает статическое поле #7
мне кажется ТС не понимает смысла static. итак записи вида

C++
1
2
3
class a{
static int a;
}
эквивалентна записи
C++
1
2
int a;
class a{}
с точностью до доступа. К глобальной пеерменной есть доступ у всех и она одна на всю программу
к статической переменной(в нашем случае в privat секции) есть доступ у класса a(и пр friend, derived privat итп) но она тоже одна
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 13:01     Почему метод класса затирает статическое поле
Еще ссылки по теме:

C++ Написать метод, чтобы получить ссылку на строку - поле класса
Как передать нестатическое поле в статический метод класса? C++
Наследование: почему вызывается метод базового класса, а не производного? C++

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

Или воспользуйтесь поиском по форуму:
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
03.11.2015, 13:01  [ТС]     Почему метод класса затирает статическое поле #8
Спасибо. Теперь я понял смысл.
Локальный объект с не продолжает прибавлять данные в static, а перезатирает на то, что указано в конструкторе при вызове из другой функции.

Нужно мне еще раз перечитать про static более подробнее.
Yandex
Объявления
03.11.2015, 13:01     Почему метод класса затирает статическое поле
Ответ Создать тему
Опции темы

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