функция объявленная в классе, реализация за пределами класса
Пытаюсь разобрать классы. Скажите почему на такую конструкцию компилятор пишет что в файле obj уже есть get_hidden()?
private:
float first, second;
public:
float get_hidden();
make_hidden(CString f, CString s) {
first = _wtof(f.GetBuffer(f.GetLength()));
second = _wtof(s.GetBuffer(f.GetLength()));
}
};
float make_hidden::get_hidden() {
return second / first * 100 - 100;
}
Учебник который я читаю там написано что вот так можно объявлять внешние функции
А еще переменные ссылочного типа
int &n = r;
n = 5;
Эквивалентно r=5;.
Так вот переменная n существует только для компилятора? После компиляции ее не будет?
int *p = &n
станет адресом в памяти, который может содержать адрес переменной n
а
int &p = n
после компиляции станет просто числом-адресом n
А еще переменные ссылочного типа
int &n = r;
n = 5;
Эквивалентно r=5;.
Так вот переменная n существует только для компилятора? После компиляции ее не будет?
Что ты подразумеваешь под "После компиляции ее не будет" ?
'r' тоже "существует только для компилятора", после компиляции её не будет, останется лишь та сущность которая была названа 'r', а имени 'r' после компиляции не будет.
'n' - это псевдоним для той сущности, которая названа r.
т.е. по сути 'r' и 'n' - это два имени одного и того же объекта.
И здесь не надо концентрироваться на адресах или указателях.
Представь себе толпу людей. До компиляции у них были имена и даже псевдонимы, клички (ссылки), а после компиляции люди остались а имен у них нет... толпа.
Имена и ссылки в общем случае это нефизические сущности, которые помогают идентифицировать физические объекты.
Поэтому говоря 'r' имеется в виду не само имя, а объект, которым оно названо.
С ссылкой так же,- когда используется ссылка подразумевается именно объект, на который она ссылается, а не она сама.
Поэтому
n = 5;
значит, что некоторому объекту, с именем 'r', известному так же под именем 'n', присваевается значение 5.
Реализации принято писать в файлах .c/.cpp, т.к. именно с ними принято ассоциировать единицы трансляции. А файлы .h могут (и обычно так и происходит) включаться в несколько .c/.cpp.
Это же очевидно.