Другие языки программирования и технологии
Помогите разобраться в програмном коде на С++
цифры в столбик от 0 до 34 - это № строки, и в програмный код не входит. 1 #include <iostream> 2 3 class Counter 4 { 5 public: 6 Counter(); 7 Counter(int a); 8 ~Counter(){} 9 int GetItsVal () const {return itsVal;} 10 void SetItsVal (int X) {itsVal = x;} 11 Counter Add (const Counter &); 12 13 private: 14 int itsVal; 15 } 16 17 18 Counter :: Counter(int a): 19 itsVal (a) {} 20 21 Counter :: Counter(): 22 itsVal(0) 23 24 Counter Counter :: Add (const Counter & rhs) 25 { 26 return Counter (itsVal + rhs.GetItsVal()); 27 } 28 29 int Main() 30 { 31 Counter varOne(2), varTwo(4), varThree; 32 varThree = varOne.Add(varTwo); 33 return 0; 34 } Мне не понятна как работает функция Add : 1) Какую именно переменную представляет параметр rhs, почему этот параметр обозначен как ссылка и как константа? На сколько мне известно rhs - это переменная стоящая справо от знака = . Где же этота переменная которая стоит справо от = ? 2) Особенно мне непонятна строчка № 26 . Вот если бы после return была бы переменная в которой находитсься значение для возвращения, то мне было бы понятно. Но в этой строчке после return стоит тип (в данном случаи Counter). Но ведь сам тип не может содержать значение которое надо возратить. 3)К какому объекту относиться переменная-член itsVal в 26-й строчке, (varOne или varTwo), и почему именно к этому объекту? Можно ли в 32 строчке вместо слова itsVal написать this->GetItsVal ? 4) Почему у одних функциях-членах, {тело функции} пишеться сразу после объявления, и при этом определение функции отсутствует. (как например функция GetItsVal) А у других функуиях-членах {тело функции} при объявлении отсутствует, но потом пишеться определение этой же функции и, {тело функции} пишеться там в конце. (как например функция Add). Чем-же отличаются эти два варианта? Этот вопрос относиться и к обычным функциям.
1)rhs-это ссылка на объект класса Counter.Она не должна стоять слева или справа. Справа стоят только при перегрузке операторов. Это не твой случай. Как const он указан для того, чтоб его нельзя было изменять в ф-ции.
2)В return стоит не тип. Там стоит конструктор с параметром. Создайтся новый объект, который и возвращает ф-ция.
3)itsVal относится к varOne,так как этот объект вызывает ф-цию Add().Можно записать и this->GetitsVal(),можно this- > itsVal,так как внутри методов класса privat-члены доступны.
4)Если ф-ция коротенькая, типа GetitsVal(),то её можно описать прямо в описании класса. В таком случае она становится inline-ф-цией. Это значит, что при компиляции программы, в машинный код будет добавлен весь код этой ф-ции, а не её имя. При этом тело ф-ции будет отработано как обычная последовательность инструкций. Не нужно будет организовывать вызов ф-ции, размещение передаваемых параметров в регистрах процессора или в стеке вызывающей ф-ции. Так работает намного быстрее. inline-ф-цией может быть не только метод класса, а и обычные ф-ции. Но inline-ф-цией может быть не любая. Об этом почитай сам.
2)В return стоит не тип. Там стоит конструктор с параметром. Создайтся новый объект, который и возвращает ф-ция.
3)itsVal относится к varOne,так как этот объект вызывает ф-цию Add().Можно записать и this->GetitsVal(),можно this- > itsVal,так как внутри методов класса privat-члены доступны.
4)Если ф-ция коротенькая, типа GetitsVal(),то её можно описать прямо в описании класса. В таком случае она становится inline-ф-цией. Это значит, что при компиляции программы, в машинный код будет добавлен весь код этой ф-ции, а не её имя. При этом тело ф-ции будет отработано как обычная последовательность инструкций. Не нужно будет организовывать вызов ф-ции, размещение передаваемых параметров в регистрах процессора или в стеке вызывающей ф-ции. Так работает намного быстрее. inline-ф-цией может быть не только метод класса, а и обычные ф-ции. Но inline-ф-цией может быть не любая. Об этом почитай сам.
здесь класс описан большее сказать не могу забываю язык на другой перешёл))))))))
Сначала нужно попробывать скомпилить представленый код и увидеть что он нескомпилится. Вот я сделал несколько исправлений, ничего кардинально не меняя:
Главные замечания:
1) Незабываем в конце обьявления класса ставить точку с зяпятой!
2) Функция main в C++ пишется в нижнем регистре, а не у тебя как в шарпе с большой!
3) Обьявление и реализацию класса желательно разделить например в Counter.h и Counter.cpp файлах, а потом подключить #include "Counter.h " и радоватся жизни.
А по вопросам очень долго обьяснять - нужно учить теорию и пробывать на практике все. Лудше сесть самому попробывать что то написать чем разбиратся в чужом, тем более с ошибками.

Главные замечания:
1) Незабываем в конце обьявления класса ставить точку с зяпятой!
2) Функция main в C++ пишется в нижнем регистре, а не у тебя как в шарпе с большой!
3) Обьявление и реализацию класса желательно разделить например в Counter.h и Counter.cpp файлах, а потом подключить #include "Counter.h " и радоватся жизни.
А по вопросам очень долго обьяснять - нужно учить теорию и пробывать на практике все. Лудше сесть самому попробывать что то написать чем разбиратся в чужом, тем более с ошибками.
Counter Counter :: Add (const Counter & rhs)
{
return Counter (itsVal + rhs.GetItsVal());
}
add суммирует два обїекта типа коунтер и возвращает значение типа каунтер.
itsVal <=> this->itsVal - это поля объекта котоым ты вызвал функцию
соответственно в твоём случае это varOne. а в скобках уже varTwo( в функции оно rhs)
rhs.GetItsVal() = значение прайвета итсВал.
itsVal + rhs.GetItsVal() - суммировали 2 значения полей itsVal для двух переменных типа Counter
{
return Counter (itsVal + rhs.GetItsVal());
}
add суммирует два обїекта типа коунтер и возвращает значение типа каунтер.
itsVal <=> this->itsVal - это поля объекта котоым ты вызвал функцию
соответственно в твоём случае это varOne. а в скобках уже varTwo( в функции оно rhs)
rhs.GetItsVal() = значение прайвета итсВал.
itsVal + rhs.GetItsVal() - суммировали 2 значения полей itsVal для двух переменных типа Counter
ты мля у препода своего спроси
Похожие вопросы
- Пожалуйста помогите разобраться с даним кодом C++. Тема : Односвязание списки
- Помогите разобраться в старом коде Фортрана...
- Помогите разобраться с кодом. Ошибка в строчке for (int i = 0, i > 100, i++) {
- нужна помощь с указателями!надо написать этот програмный код,используя указатели(
- Прошу помочь разобраться, пояснить некоторые пункты требования ТИПОГРАФИИ.
- Помогите разобраться в коде. Язык Фортран
- Про С++ .Не получается явное преобразование типов. Помогите разобраться. Код внутри.
- Помогите разобраться с эллементарной задачей, нужно чуть-чуть доработать код.
- Помогите разобраться с кодом Delphi
- Помогите разобраться с кодом