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

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

Восстановить пароль Регистрация
 
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
09.12.2010, 10:34     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #1
В 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2010, 10:34     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную
Посмотрите здесь:

C++ неопредилить статическую переменную
C++ Интересное поведение cin.getline();
C++ почему линковщик не видит статическую переменную:
Выход из функции, возвращающей значение C++
C++ std::bind и указатель на статическую функцию член класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.12.2010, 12:54     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #2
Хм. Всё-таки в памяти имеется только одна копия функции get_i, а, значит, и только одна копия всех её данных. Получается, что имеется только один экземпляр её статической переменной i. Это всё только догадка, но по логике вещей так и должно быть.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
09.12.2010, 14:38     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Всё-таки в памяти имеется только одна копия функции get_i, а, значит, и только одна копия всех её данных.
не, по-моему функция-то у каждого объекта своя, но все они кивают на один и тот же участок памяти, в котором собственно переменная и хранится... Она просто инициализируется несколько не полит-корректно, что создаёт иллюзию того, что каждый объект должен создавать "свою" статическую переменную, ну или как минимум обнулять её...
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
09.12.2010, 14:47     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #4
По-моему, функция всё-таки одна. Просто метод класса ещё неявно получает указатель на экземпляр, поэтому создаётся иллюзия, что функции разные.

Gcc, кстати, то же самое выдаёт.
Mr.X
Эксперт С++
 Аватар для Mr.X
2799 / 1575 / 246
Регистрация: 03.05.2010
Сообщений: 3,656
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"));
}
Также можно это использовать для создания статических переменных класса, которые при обычном объявлении требуется еще определять где-то вне класса.
easybudda
09.12.2010, 16:13     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную
  #6

Не по теме:

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

Yandex
Объявления
09.12.2010, 16:13     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную
Ответ Создать тему
Опции темы

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