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

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

Войти
Регистрация
Восстановить пароль
 
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
#1

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

30.10.2015, 13:59. Просмотров 234. Ответов 7
Метки нет (Все метки)

Добрый день Я учу самостоятельна с++. Сейчас разбираю тему классы. Вот у меня возник вопрос по коду:

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(); , а результат разный.

Сам код ничего не делает , я просто разбираюсь в логике. Помогите понять что не так Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2015, 13:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему метод класса затирает статическое поле (C++):

Только константное статическое поле НЕ МОЖЕТ быть поле членом класса ! - C++
class CCoords { static const float rate = 1.0f; // ОШИБКА !!! bool IsComputed; float x,y; POINT2D ...

Статическое поле класса, имеющее тип того же класса - C++
Всем доброго времени суток. Как известно, поля класса могут быть ссылками, либо указателями на тот же класс, в котором объявляются, но не...

Статическое поле,количество экземпляров класса - C++
Помогите понять,статическое поле stcount считает количество созданных экземпляров класса (объектов),я объявляю всего два объекта а он...

В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! - C++
Друзья! Почему так? #include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; //Вот главный класс class A{ ...

Статическое поле - C++
Помогите с такой проблемой. Программа нормально компилится, но возвращается, вот такая ошибка при объявлении статического поля,...

Указатель на метод и на поле класса - C++
Суть такова, нужно создать класс студент, определить метод доступа к скрытым полям уровень знаний и курс. Создать открытое поле стипедия....

7
John Prick
803 / 736 / 145
Регистрация: 27.07.2012
Сообщений: 2,108
Завершенные тесты: 3
30.10.2015, 14:34 #2
Цитата Сообщение от daiwud Посмотреть сообщение
Почему третий метод funk(); затирает статическую переменную
Потому что там создаётся объект класса maxim, в конструкторе которого b устанавливается в 0.
0
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
30.10.2015, 16:23  [ТС] #3
Т.е. если вызов класса за пределами функции main происходит , то статическая переменная затирается и не сохраняет своего значения?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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; убрать 
}
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

Но Вам отдельное спасибо за разъяснение, как можно привязать одну переменную ко всем методам Я честно говоря не понимал этого. Теперь буду знать.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
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. Одна функция сначала увеличивает значение, потом его печатает, а другая - наоборот, сначала печатает, потом увеличивает.
0
Fallenworld
76 / 76 / 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 итп) но она тоже одна
0
daiwud
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
03.11.2015, 13:01  [ТС] #8
Спасибо. Теперь я понял смысл.
Локальный объект с не продолжает прибавлять данные в static, а перезатирает на то, что указано в конструкторе при вызове из другой функции.

Нужно мне еще раз перечитать про static более подробнее.
0
03.11.2015, 13:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2015, 13:01
Привет! Вот еще темы с ответами:

почему игнорируется метод класса - C++
#include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; class Vect { private: double **p; double **p1; double **p2; int size1; int...

Как передать нестатическое поле в статический метод класса? - C++
есть статическая фукция static LRESULT CALLBACK WndProc ( HWND,UINT,WPARAM,LPARAM); в ней нужно использоавть поля класса, вопрос -...

Написать метод, чтобы получить ссылку на строку - поле класса - C++
Есть класс,назову его Test. В нем элемент типа строка(простите за мой французкий) Test.Name .Надо с помощью какого нибудь метода, получить...

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


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

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

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