Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Разбираемся с основами


Автор: Ratman 4.7.2008, 01:42
Делаю, так сказать, очередной шаг в освоении ЯП. На этот раз шагнул в С и сразу по колено увяз.

Щас читаю книжку Бьярна Страустрапа "Введение в язык С++" (на самом деле лучшее, что я нашел из книжек)
И посути не всё так плохо, но я окончательно запутался в двух штуках:

Штука #1:
То-ли он так пишет, то-ли я так читаю (в пол-второго ночи), то-ли еще чего, но я не могу понять разницы в использовании      .        ->       ::
про все три варианта книжка говоритъ "сначало объект, потом символ(ы), потом член класса объекта". Пробовал методом научного тыка - закономерности не выяснил. Компилятор ругается абсолютно неожиданно.




Штука #2:
int* р  == объявление указателя
р+1  ==  воздействие на указатель
*р+1  == воздействие на объект по адресу.
При этом (р) - указатель - 32битное число, а (*р) - объект типа int

читаю далее и вижу:
&объект - адрес объекта в памяти - 32битное число
тип& s - объявление ссылки на объект
&s - адрес объекта

Думаю: создатели языка явно не дурные особи, значит это только я не вижу разницы в использовании "указателя" и "ссылки"




Итого: кому вечером охота написать в двух словах 
в чем разница точки, 2х двоеточий и -> стрелочки ?
в чем разница указателей * и ссылок & ?


Автор: mes 4.7.2008, 02:00
ссылка это адрес переменной, а указатель это переменная храняшая ссылка
если переменная объявлена как указатель то надо обрашаться к методам, через "->"
иначе через ".".  A "::" для обрашения к статическим методам/переменным класса,
только перед ними ставится имя класса, а не переменная обьекта

Автор: mrbrooks 4.7.2008, 07:47
Если доступ к элементам структур, классов и т.д осуществляется через объект, то используется операция точка.

Если доступ к элементам структур, классов и т.д осуществляется через указатель на объект, то используется операция стрелка.

:: - операция разрешения области видимости и к '.' и ->'' никакого отнощения не имеет.

* - указатель, переменная, значение которой равно аддреса памяти, по которому лежит значениенекоторой другой переменной. Указатели имеют широкое применение.

& - ссылка, специальный тип указателя, который позволяет работать с указателем как с объектом. Хороши при использовании в функциях.

Это все в кратце. Вообще с ходу старину Бьерна возможно читать не стоит. Поищи что нибудь попроще для начала. В смысле мануал.


Автор: bsa 4.7.2008, 16:58
Цитата(Ratman @ 4.7.2008,  01:42)
Штука #1:
То-ли он так пишет, то-ли я так читаю (в пол-второго ночи), то-ли еще чего, но я не могу понять разницы в использовании      .        ->       ::

Код
class MyClass
{
public:
    enum { someValue = 10 };
    void method1() {}
    static void method2() {}
};
оператор :: используется тогда, когда для операции не нужен сам объект класса. В данном случае, он применим для вызова method2() и получения значения someValue. Делается это так: MyClass::someValue и MyClass::method2().
Точка отличается от стрелки только тем, что вторая нужна для доступа к полям/методам объекта по указателю на него:
Код
MyClass mc;
MyClass *pMc = &mc;
mc.method1();
pMc->method1();


Цитата(Ratman @ 4.7.2008,  01:42)
в чем разница указателей * и ссылок & ?
Код
int x;
int *pointer = &x; //pointer - это указатель
int y;
int &reference = y; //reference - ссылка на y

*pointer = 10; //x = 10;
++*pointer; //x = 11
reference = 15; //y = 15;
++reference; //y = 16
pointer = &y; //ok
reference = x; //ошибка!!!

Автор: Ratman 4.7.2008, 20:40
спасибо всем за разъяснения

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)