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

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

Войти
Регистрация
Восстановить пароль
 
Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
#1

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

09.12.2010, 10:34. Просмотров 567. Ответов 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.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2010, 10:34     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную
Посмотрите здесь:

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

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

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

Функция содержащая статическую переменную - C++
Начал разбираться с статическими ф-циями, и прикидывал простые примеры. Но дошел до того, что никак не могу понять как там получается: ...

почему линковщик не видит статическую переменную: - C++
почему линковщик не видит статическую переменную: файл aaa.h class aaa { protected: static CStringArray...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
09.12.2010, 12:54     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #2
Хм. Всё-таки в памяти имеется только одна копия функции get_i, а, значит, и только одна копия всех её данных. Получается, что имеется только один экземпляр её статической переменной i. Это всё только догадка, но по логике вещей так и должно быть.
easybudda
Эксперт CЭксперт С++
9461 / 5474 / 927
Регистрация: 25.07.2009
Сообщений: 10,498
09.12.2010, 14:38     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Всё-таки в памяти имеется только одна копия функции get_i, а, значит, и только одна копия всех её данных.
не, по-моему функция-то у каждого объекта своя, но все они кивают на один и тот же участок памяти, в котором собственно переменная и хранится... Она просто инициализируется несколько не полит-корректно, что создаёт иллюзию того, что каждый объект должен создавать "свою" статическую переменную, ну или как минимум обнулять её...
volovzi
267 / 169 / 8
Регистрация: 14.03.2010
Сообщений: 501
09.12.2010, 14:47     Интересное поведение нестатической функции класса, возвращающей свою статическую переменную #4
По-моему, функция всё-таки одна. Просто метод класса ещё неявно получает указатель на экземпляр, поэтому создаётся иллюзия, что функции разные.

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

Не по теме:

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

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

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