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

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

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

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

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

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

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

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

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

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

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

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

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

Не по теме:

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2010, 16:13
Привет! Вот еще темы с ответами:

Собственная реализация strtok, стоит ли применить статическую переменную? - C++
Добрый день! Пришла мысль реализовать свою strtok. Хотел проконсультироваться. Следует ли в этой strtok применять статическую...

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

std::bind и указатель на статическую функцию член класса - C++
Биндинг простых функций класса-это понятно, а вот как быть, если функция статическая?

Выход из функции, возвращающей значение - C++
Всем привет! Если функция не возвращает значение выхожу с помощью return, а как быть если надо выйти из функции, которая возвращает...


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

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

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