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

Где лучше эти переменные объявлять? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
29.10.2011, 21:03     Где лучше эти переменные объявлять? #1
Посмотрите пожалуйста на следующий код (код сишный, но компилировался как C++, так как в чистом Си нет ООП... Но не это меня в данном случае интересует). А интересует следующее. В классе есть 8 функций, в которых в циклах используется переменная i. В данном коде я ее объявил в классе, как приватную, которая одна для всех функций. Но так, как учили делать, говорят, что эта переменная должна быть у каждой функции своя и объявляться типа так: for(int i=0; бла-бла-бла). Но я не пойму одного момента... Ведь получается, что если делать так, как в последнем случае, то за всю работу программы эта переменная i будет десятки раз создаваться, потом удаляться десятки раз при выходе из функции. Разве это оптимально?

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <stdio.h>
#include <alloc.h>
#include <stdlib.h>
#include <conio.h>
 
#define SIZE_ARR1 7;
 
class Arr{
    private:
        int *arr;
        int i, j, n, num;
    public:
        Arr()
        {
            n=SIZE_ARR1;
            arr=(int*)malloc(n*sizeof(int));
        }
        Arr(int nums)
        {
            n=nums;
            arr=(int*)malloc(n*sizeof(int));
        }
        ~Arr()
        {
            free(arr);
        }
        void InputArr()
        {
            for(i=0;i<n;i++)
            {
                printf("arr[%d] = ",i);
                scanf("%d",&arr[i]);
            }
        }
        void ShowArr()
        {
            for(i=0;i<n;i++)
                printf("arr[%d] = %d\n", i, arr[i]);
        }
        int NumberNegative()
        {
            num=0;
            for(i=0;i<n;i++)
                if(arr[i]<0)
                    num++;
            return num;
        }
        int NumberPositive()
        {
            num=0;
            for(i=0;i<n;i++)
                if(arr[i]>0)
                    num++;
            return num;
        }
        int NumberZero()
        {
            num=0;
            for(i=0;i<n;i++)
                if(arr[i]==0)
                    num++;
            return num;
        }
        int SumNegative()
        {
            num=0;
            for(i=0;i<n;i++)
                if(arr[i]<0)
                    num+=arr[i];
            return num;
        }
        int SumPositive()
        {
            num=0;
            for(i=0;i<n;i++)
                if(arr[i]>0)
                    num+=arr[i];
            return num;
        }
        float AverageNegative()
        {
            return (float)SumNegative()/(float)NumberNegative();
        }
        float AveragePositive()
        {
            return (float)SumPositive()/(float)NumberPositive();
        }
        void DeleteNegativeZero()
        {
            int np = NumberPositive();
            if(!np)
                return;
            for(i=0,j=0;i<n;i++)
            {
                if(arr[i]>0)
                {
                    arr[j]=arr[i];
                    j++;
                }
            }
            n=np;
            arr=(int*)realloc(arr,n*sizeof(int));
        }
};
 
int main()
{
    Arr Arr1;
    Arr1.InputArr();
    puts("\nThe contents of the array:");
    Arr1.ShowArr();
    printf("The number of negative elements: %d\n", Arr1.NumberNegative());
    printf("The number of positive  elements: %d\n", Arr1.NumberPositive());
    printf("The number of zero  elements: %d\n", Arr1.NumberZero());
    printf("The sum of negative elements: %d\n", Arr1.SumNegative());
    printf("The sum of positive elements: %d\n", Arr1.SumPositive());
    if(Arr1.NumberNegative())
        printf("The average of negative  elements: %.2f\n", Arr1.AverageNegative());
    if(Arr1.NumberPositive())
        printf("The average of positive  elements: %.2f\n", Arr1.AveragePositive());
    Arr1.DeleteNegativeZero();
    puts("Array after the removal of negative and zero elements:");
    Arr1.ShowArr();
    puts("Complete.");
    getch();
    puts("\nDo you want to create another array? (y or n)");
    if(getch()!='y')
        return 0;
    int number;
    puts("Enter the number of array elements");
    scanf("%d",&number);
    Arr Arr2(number);
    Arr2.InputArr();
    puts("\nThe contents of the array:");
    Arr2.ShowArr();
    puts("\nPress any key to exit...");
    getch();
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 21:03     Где лучше эти переменные объявлять?
Посмотрите здесь:

C++ Вопрпос про const: в какой области памяти они находятся, и где это объявлять ?
C++ Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять.
C++ Где объявлять переменную: перед циклом, или внутри класса
Где инициализировать переменные класса? C++
C++ Где найти эти книги?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
30.10.2011, 19:26     Где лучше эти переменные объявлять? #21
Цитата Сообщение от Сыроежка Посмотреть сообщение
И к тому же запутываете пользователей вашего класса!
Пользователи класса ничего не знают о внутренней реализации класса. Данные-члены класса вне их компетенции.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
30.10.2011, 19:29     Где лучше эти переменные объявлять? #22
Цитата Сообщение от Bers Посмотреть сообщение
Пользователи класса ничего не знают о внутренней реализации класса. Данные-члены класса вне их компетенции.
Не смешите! Пользователи класса - это те программисты, которые читают объявление класса, и которые к тому же могут сопровождать программу и вносить в нее изменения.
Bers
Заблокирован
30.10.2011, 19:32     Где лучше эти переменные объявлять? #23
Цитата Сообщение от Сыроежка Посмотреть сообщение
Не смешите! Пользователи класса - это те программисты, которые читают объявление класса, и которые к тому же могут сопровождать программу и вносить в нее изменения.
Не путайте пользователя класса, и разработчика класса.
Пользователи читают документацию.
Сыроежка
Заблокирован
30.10.2011, 19:34     Где лучше эти переменные объявлять? #24
Цитата Сообщение от Bers Посмотреть сообщение
Не путайте пользователя класса, и разработчика класса.
Пользователи читают документацию.

Молодой человек,не пудрите мне мозги! Когда будете сопровождать чужие программы, тогда ипоймете, о чем идет речь!

Начитались книг, а опыта программирования никакого нет!

Когда вы сопровождаете чью-то программу,то вы и пользователь класса, и разработчик этого класса, и, вообще, слесарь-сантехник: смотрите,чтобы ни где не потекло!
Bers
Заблокирован
30.10.2011, 19:37     Где лучше эти переменные объявлять? #25
Цитата Сообщение от Сыроежка Посмотреть сообщение
Молодой человек,не пудрите мне мозги! Когда будете сопровождать чужие программы, тогда ипоймете, о чем идет речь!
См в сторону "инкапсуляция".

Пользователи не сопровождают код. Сопровождают разработчики.
Сопровождение чужого кода предполагает изучение внутреннего устройства поставщика услуг.
Сыроежка
Заблокирован
30.10.2011, 19:42     Где лучше эти переменные объявлять? #26
Цитата Сообщение от Bers Посмотреть сообщение
См в сторону "инкапсуляция".

Пользователи не сопровождают код. Сопровождают разработчики.
Сопровождение чужого кода предполагает изучение внутреннего устройства поставщика услуг.
Включите мозги и отойдите от штампов! Разработать программу могут одни, а сопровождать программу другие! И где эти разработчики, которые писали такой вычурный код, никому не известно!

Понятие пользователь программы - это значительно более широкое понятие, чем вы себе представляете! Когда вы попадете в проект, которому уже более 20 лет, и вам скажут,что писатькодне не надо, а надо лишь исправлять ошибки, о которых вам сообщат по мере эксплуатации, то вы поймете, что такое пользователь кода!

У вас абстрактные представления о написании программ и их поддержке.
Bers
Заблокирован
30.10.2011, 19:45     Где лучше эти переменные объявлять? #27
Цитата Сообщение от Сыроежка Посмотреть сообщение
Включите мозги и отойдите от штампов! Разработать программу могут одни, а сопровождать программу другие! И где эти разработчики, которые писали такой вычурный код, никому не известно!
Не удивительно, если чужой код покажется диковатым. Только к пользователям инструмента это не имеет ни малейшего отношения.
Сыроежка
Заблокирован
30.10.2011, 19:47     Где лучше эти переменные объявлять? #28
Цитата Сообщение от Bers Посмотреть сообщение
Не удивительно, если чужой код покажется диковатым. Только к пользователям инструмента это не имеет ни малейшего отношения.
Мы же все же говорим о пользователях кода, а не инструмента, не так ли? А пользователями кода могут быть программисты, поддерживающие программу, программисты развивающие программу, писатели документации, которым нужно полное определение класса.
Bers
Заблокирован
30.10.2011, 19:49     Где лучше эти переменные объявлять? #29
Цитата Сообщение от Сыроежка Посмотреть сообщение
И к тому же запутываете пользователей вашего класса!
о пользователях инструмента

Цитата Сообщение от Сыроежка Посмотреть сообщение
Разработать программу могут одни, а сопровождать программу другие! И где эти разработчики, которые писали такой вычурный код, никому не известно!
Просто оригинальных разработчиков заменили свежим мясом.
От этого новые разработчики не становятся пользователями
Сыроежка
Заблокирован
30.10.2011, 19:59     Где лучше эти переменные объявлять? #30
Цитата Сообщение от Bers Посмотреть сообщение
о пользователях инструмента



Просто оригинальных разработчиков заменили свежим мясом.
От этого новые разработчики не становятся пользователями
Вы заблуждаетесь! Они становятся именно пользователями уже написанного кода. То естьони являются клиентами этого кода.
Bers
Заблокирован
30.10.2011, 20:14     Где лучше эти переменные объявлять? #31
Цитата Сообщение от Сыроежка Посмотреть сообщение
Вы заблуждаетесь! Они становятся именно пользователями уже написанного кода. То естьони являются клиентами этого кода.
Формулировка "пользователь кода" не конкретная. Все что угодно можно при желании посчитать "пользователем кода". От разработчика, и до собственно клиентского кода.

Однако речь шла не о "пользователях кода", а о "пользователях класса".

Пользователь класса - любой клиентский код, пользующийся услугами данного класса, и работающий с ним исключительно через его интерфейс. Действует правило инкапсуляции.

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

То, что вы не развиваете кардинально класс, а лишь исправляете части его внутренней реализации, не делает вас пользователем.

И мне уже надоело говорить одно и тоже по не скольку раз.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 22:26     Где лучше эти переменные объявлять?
Еще ссылки по теме:

C++ Где в приведенном коде переменные хранят свои значения
C++ Где найти эти библиотеки?

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

Или воспользуйтесь поиском по форуму:
Tolias28
202 / 117 / 2
Регистрация: 18.08.2010
Сообщений: 1,006
30.10.2011, 22:26  [ТС]     Где лучше эти переменные объявлять? #32
Цитата Сообщение от Сыроежка Посмотреть сообщение
Во-первых,вы уж как-то определитесь,то ли действительно у васкод, как вы пишите, "сишный", или же выпишите код С++.

Теперь что касается вашего вопроса. Ваша переменная i, никакой полезной информации о классе не несет. Вы лишь засоряете объявление своего класса рабочими переменными, которые нужны лишь кратковременно. Но зато вы при этом увеличиваете размер своего класса! И к тому же запутываете пользователей вашего класса!
К тому же вы ничего на самомделе не оптимизируете! Еслибыэта переменная была былокальной переменной каждой функции, то компилятор мог бьпоместитьее в один регистр, икодбыл быкомпактным, так как никакие дополнительные машинные инструкции пообращению к этой переменной не требовались! Другое дело, когдаэта переменная - член класса. Теперь к ней можнообратиться лишьчерез указатель this. То естьпоявляютсядополнительные машинные команды по обращению к этой переменной.

Так что я усматриваюлишь одни минусы в вашем подходе!
Спасибо за ответ. После вашего сообщения у меня больше не осталось ни малейших сомнений, которые у меня были по поводу этой темы. Благодарю за разъяснение!
Yandex
Объявления
30.10.2011, 22:26     Где лучше эти переменные объявлять?
Ответ Создать тему
Опции темы

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