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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Tolias28
205 / 121 / 2
Регистрация: 18.08.2010
Сообщений: 1,011
#1

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

29.10.2011, 21:03. Просмотров 1754. Ответов 31
Метки нет (Все метки)

Посмотрите пожалуйста на следующий код (код сишный, но компилировался как 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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 21:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Где лучше эти переменные объявлять? (C++):

Где объявлять переменную: перед циклом, или внутри класса - C++
Подскажите, где правильно объявить переменную. Если объявить внутри цикла, то сузится область ее видимости, но она будет объявляться...

Вопрпос про const: в какой области памяти они находятся, и где это объявлять ? - C++
Приветствую. У меня вот такая задача - завести массив констант, причём он используется ТОЛЬКО одной функцией (не main), и поэтому,...

Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять. - C++
Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все...

Где найти эти книги? - C++
Подскажите где можно найти эти книги? http://www.ozon.ru/context/detail/id/26348781/ http://www.ozon.ru/context/detail/id/25217223/ ...

Где найти эти библиотеки? - C++
где найти эти библиотеки: SDKDDKVer.h targetver.h resource.h и для чего они нужны ?

Где инициализировать переменные класса? - C++
Почему я не могу инициализировать переменную непосредственно в описании класса? class Primer { publuc: Metod1() {...}; ...

31
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 14:48 #16
Bers,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
iterator begin()
        {   // return iterator for beginning of mutable sequence
        return (iterator(this->_Nextnode(this->_Myhead), this));
        }
 
    const_iterator begin() const
        {   // return iterator for beginning of nonmutable sequence
        return (const_iterator(this->_Nextnode(this->_Myhead), this));
        }
 
    iterator end()
        {   // return iterator for end of mutable sequence
        return (iterator(this->_Myhead, this));
        }
 
    const_iterator end() const
        {   // return iterator for end of nonmutable sequence
        return (const_iterator(this->_Myhead, this));
        }
Добавлено через 41 секунду
Bers, А по сабжу - создавать когда нужен.
0
Bers
Заблокирован
30.10.2011, 14:54 #17
Цитата Сообщение от ForEveR Посмотреть сообщение
(iterator(this->_Nextnode(this->_Myhead), this));
_Nextnode - эт что за гусь?

Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, А по сабжу - создавать когда нужен.
Изумительно! Все сразу стало ясно и понятно!
0
ForEveR
В астрале
Эксперт С++
7979 / 4738 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 14:58 #18
Bers, Вот _NextNode - объект, содержащийся в классе. Но итератор создается только когда нужен, при вызове begin к примеру.

Резоннее создавать объекты, тогда и только тогда, когда они нужны.

Добавлено через 2 минуты
Хотя нет. Я не прав.


C++
1
2
3
4
    static _Nodepref _Nextnode(_Nodeptr _Pnode)
        {   // return reference to successor pointer in node
        return ((_Nodepref)(*_Pnode)._Next);
        }
0
Bers
Заблокирован
30.10.2011, 15:06 #19
Цитата Сообщение от ForEveR Посмотреть сообщение
(iterator(this->_Nextnode(this->_Myhead), this));
Я так эту строчку понял - конструируется итератор, который инициализируется какими то внутренними данными..

Цитата Сообщение от ForEveR Посмотреть сообщение
Резоннее создавать объекты, тогда и только тогда, когда они нужны.
А пулы памяти, объектные пулы для чего придумали?
Служебные данные-члены выполняют по сути точно такую же задачу, как и пулы.
Хотя конечно, в примере с вектором сэкономить на итераторах явно не получится.
0
Сыроежка
Заблокирован
30.10.2011, 19:16 #20
Цитата Сообщение от Tolias28 Посмотреть сообщение
Посмотрите пожалуйста на следующий код (код сишный, но компилировался как 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;
}
Во-первых,вы уж как-то определитесь,то ли действительно у васкод, как вы пишите, "сишный", или же выпишите код С++.

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

Так что я усматриваюлишь одни минусы в вашем подходе!
2
Bers
Заблокирован
30.10.2011, 19:26 #21
Цитата Сообщение от Сыроежка Посмотреть сообщение
И к тому же запутываете пользователей вашего класса!
Пользователи класса ничего не знают о внутренней реализации класса. Данные-члены класса вне их компетенции.
0
Сыроежка
Заблокирован
30.10.2011, 19:29 #22
Цитата Сообщение от Bers Посмотреть сообщение
Пользователи класса ничего не знают о внутренней реализации класса. Данные-члены класса вне их компетенции.
Не смешите! Пользователи класса - это те программисты, которые читают объявление класса, и которые к тому же могут сопровождать программу и вносить в нее изменения.
0
Bers
Заблокирован
30.10.2011, 19:32 #23
Цитата Сообщение от Сыроежка Посмотреть сообщение
Не смешите! Пользователи класса - это те программисты, которые читают объявление класса, и которые к тому же могут сопровождать программу и вносить в нее изменения.
Не путайте пользователя класса, и разработчика класса.
Пользователи читают документацию.
0
Сыроежка
Заблокирован
30.10.2011, 19:34 #24
Цитата Сообщение от Bers Посмотреть сообщение
Не путайте пользователя класса, и разработчика класса.
Пользователи читают документацию.

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

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

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

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

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

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

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

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



Просто оригинальных разработчиков заменили свежим мясом.
От этого новые разработчики не становятся пользователями
Вы заблуждаетесь! Они становятся именно пользователями уже написанного кода. То естьони являются клиентами этого кода.
0
30.10.2011, 19:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 19:59
Привет! Вот еще темы с ответами:

У героя уходит |y2-y1| единиц энергии, где y1 и y2 – высоты, на которых расположены эти платформы - C++
Условие: У героя уходит |y2-y1| единиц энергии, где y1 и y2 – высоты, на которых расположены эти платформы. Кроме того, у героя есть...

Где в приведенном коде переменные хранят свои значения - C++
Друзья, помогите разобраться с объектами. Например, где, созданные в этом листинге 3 объекта - а, b и с, после инициализации с помощью...

Где лучше хранить данные таблиц? - C++
Собираюсь написать свой справочник ГОСТовского металлопроката. И вот возник вопрос, где хранить табличные данные. Прописать массивы прямо в...

какой с++ лучше и где можно скачать - C++
подскажите это какой С++? #include &lt;iostream&gt; using namespace std;


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

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

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