Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.10.2015, 13:59
Ответы с готовыми решениями:

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

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

Статическое поле,количество экземпляров класса
Помогите понять,статическое поле stcount считает количество созданных экземпляров класса...

Статическое поле класса: подсчет количества созданных объектов
Задание: Дополнить один из классов статическим полем, которое будет считать количество созданных...

7
2333 / 1820 / 753
Регистрация: 27.07.2012
Сообщений: 5,372
30.10.2015, 14:34 2
Цитата Сообщение от daiwud Посмотреть сообщение
Почему третий метод funk(); затирает статическую переменную
Потому что там создаётся объект класса maxim, в конструкторе которого b устанавливается в 0.
0
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
30.10.2015, 16:23  [ТС] 3
Т.е. если вызов класса за пределами функции main происходит , то статическая переменная затирается и не сохраняет своего значения?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
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
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
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
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
76 / 76 / 32
Регистрация: 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
1 / 1 / 1
Регистрация: 04.08.2015
Сообщений: 13
03.11.2015, 13:01  [ТС] 8
Спасибо. Теперь я понял смысл.
Локальный объект с не продолжает прибавлять данные в static, а перезатирает на то, что указано в конструкторе при вызове из другой функции.

Нужно мне еще раз перечитать про static более подробнее.
0
03.11.2015, 13:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.11.2015, 13:01
Помогаю со студенческими работами здесь

Статическое поле абстрактного класса в как наследуемое поле и преведение его типа
public abstract class BaseManager : BaseClass { public static BaseManager Instance {...

Статическое поле класса
Если у меня есть класс Book и в нем объявлено какое то поле private static. И есть внутренний класс...

Статическое поле класса
Господа, подскажите пожалуйста. Если в некотором классе есть статическое поле, например public...

Статическое поле из производного класса
Есть три класса public class Птицы { public static Int32 ДлинаКрыльев; } public class Орлы...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru