Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
1

Интересное поведение нестатической функции класса, возвращающей свою статическую переменную

09.12.2010, 10:34. Показов 822. Ответов 5
Метки нет (Все метки)

В VS 2008 программа

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
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////////
class A
{
    int i_;    
public:
    A() : i_()
    {}
    //------------------------------------------------------------------------------
    A(const A&  a)
    {
        i_ = get_i();
        std::cout << "In copy A  i_ = "
                  << i_
                  << std::endl;
    }
private:
    //------------------------------------------------------------------------------
    int  get_i()
    {
        static int i = 0;
        return ++i;
    }
};
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    A a;
    A b(a);
    A c(a);
    A d(a);
}
выводит:

In copy A i_ = 1
In copy A i_ = 2
In copy A i_ = 3
Для продолжения нажмите любую клавишу . . .

Интересно, это стандартное поведение или косяк? Ведь функция get_i не статическая, т.е. по идее у каждого объекта она должна быть своя, и при первом вызове возвращать 1.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2010, 10:34
Ответы с готовыми решениями:

Реализовать подсчет количества объектов класса, используя статическую переменную-член класса
как реализовать подсчет количества объектов класса (используя статическую переменную-член класса),...

Как создать статическую переменную в Паскале? Переменную, которая сохраняет значение, при выходе из функции
Пробую так, но, естественно, ничего не получается: procedure a; var s : integer; begin s :=...

Как в VB сделать статическую переменную класса?
Всем привет, 1) Можно ли в VB сделать некоторую переменную единой для всех классов? Допустим, у...

Вызов нестатической функции класса в другом классе
Нужно вызвать нестатическую функцию одного класса в другом классе (указатель на функцию передаю в...

5
Эксперт С++
5053 / 3114 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
09.12.2010, 12:54 2
Хм. Всё-таки в памяти имеется только одна копия функции get_i, а, значит, и только одна копия всех её данных. Получается, что имеется только один экземпляр её статической переменной i. Это всё только догадка, но по логике вещей так и должно быть.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
11658 / 7171 / 1704
Регистрация: 25.07.2009
Сообщений: 13,142
09.12.2010, 14:38 3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Всё-таки в памяти имеется только одна копия функции get_i, а, значит, и только одна копия всех её данных.
не, по-моему функция-то у каждого объекта своя, но все они кивают на один и тот же участок памяти, в котором собственно переменная и хранится... Она просто инициализируется несколько не полит-корректно, что создаёт иллюзию того, что каждый объект должен создавать "свою" статическую переменную, ну или как минимум обнулять её...
1
274 / 175 / 12
Регистрация: 14.03.2010
Сообщений: 501
09.12.2010, 14:47 4
По-моему, функция всё-таки одна. Просто метод класса ещё неявно получает указатель на экземпляр, поэтому создаётся иллюзия, что функции разные.

Gcc, кстати, то же самое выдаёт.
0
Эксперт С++
3219 / 1746 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
09.12.2010, 16:03  [ТС] 5
Если это свойство справедливо, то можно им пользоваться для создания вектора, элементы которого знают свой индекс:

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
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <vector>
//////////////////////////////////////////////////////////////////////////////////////
class A
{
    int i_;    
public:
    A() : i_()
    {}
    //------------------------------------------------------------------------------
    A(const A&  a)
    {
        static int  i = 0;
        i_ = i++;
    }
    //------------------------------------------------------------------------------
    operator int()
    {
        return  i_;
    }    
};
//////////////////////////////////////////////////////////////////////////////////////
typedef std::vector<A>  T_A_vect;
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    T_A_vect  v(10);
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "\n"));
}
Также можно это использовать для создания статических переменных класса, которые при обычном объявлении требуется еще определять где-то вне класса.
0
easybudda
09.12.2010, 16:13     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную
  #6

Не по теме:

Цитата Сообщение от Mr.X Посмотреть сообщение
Также можно это использовать для создания статических переменных класса, которые при обычном объявлении требуется еще определять где-то вне класса.
Ну и довести до нервного тика того штрейхбрейхера, который после Вас эту программу переделывать возьмётся... ;)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2010, 16:13

Синтаксис объявления функции, возвращающей экземпляр класса
В общем, появилась необходимость создать функцию, возвращающую экземпляр класса TStrings. В чем...

Интересное поведение IAR
Итак, в наличии IAR 1.40.1/6.5.3.2581 для STM8. Есть функция inline void clrCS(void){...

USB интересное поведение
Есть старенький компьютер, который очень странным образом читает флешки. С момента включения все...

Интересное поведение cin.getline();
Доброго времени суток! Я не устаю терроризировать форум своими тупыми вопросами, но для этого он и...

Интересное поведение CListCtrl::InsertItem()
Приветствую! решиль в свое CListCtrl реализовать Drag-and-Drop. Всё получилось хорошо, в плане...

Не удается подключить к приложению gtest и свою статическую либу VS 2010
Здравствуйте, господа. Возникла проблема с линкером в VS 2010 после подключения к консольному...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru