Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Классы C++  (Прочитано 842 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Классы C++
« : 14 Августа 2012, 19:09:25 »
Стыдно спрашивать, но всеже ...
всегда с объектами классов и структур общался через синтаксис вида:
nameClass.func();
но тут недавно, изучая qt, в очередной раз встретился с непонятным ситаксисом, вида:
nameClass->setProperty( ... );
bool b = nameClass->property( ... ).toBool();
Объясните пожалуйста, что обозначает "->" между названием класса и его элементом(и чем отличается от точки)?

P.S. в Прате копался, но объяснений не нашел

Оффлайн sash23

  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Re: Классы C++
« Ответ #1 : 14 Августа 2012, 19:27:28 »
Во втором случае переменная nameClass это указатель.


ClassName v;
v.member();


или


ClassName *v;// указатель
v->member();


Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Классы C++
« Ответ #2 : 14 Августа 2012, 19:46:42 »
Т.е. получается так, что:
class ClassName
  {
  public:
  int *v;
  };

int main()
  {
  Classname C;

  ...

  int k = C->v;
  }

последняя строчка выдаст в k адрес памяти или значение в этом адресе? или же это будет вообще указатель на указатель?

----

А, вроде разобрался ... если не так, прошу поправить ...
"->" - применимо только к указателям на классы
и в данном случае *С->v выдаст значение в по данному адресу, а C->v сам адрес
так?
« Последнее редактирование: 14 Августа 2012, 20:06:44 от dronte »

Оффлайн FluffyMan

  • Активист
  • *
  • Сообщений: 276
  • Debian 6
    • Просмотр профиля
Re: Классы C++
« Ответ #3 : 15 Августа 2012, 20:11:29 »
насколько я понимаю, если объект класса создается в стеке, то обращение к методам и свойствам класса происходит через оператор точка.
MyClass MyObject;
MyObject.someMethod();

если создавать объект динамически, в куче, то обращение к методам и свойствам объекта происходит через оператор "->"
MyClass *MyObject = new MyClass;
MyObject->someMethod();

честно говоря не помню почему так (стыдно). мне, в смысле стыдно


Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Классы C++
« Ответ #4 : 15 Августа 2012, 20:56:20 »
ну да ... спасибо за уточнение :)

PetrovSE

  • Гость
Re: Классы C++
« Ответ #5 : 15 Августа 2012, 22:03:52 »
"->" или "." используются в зависимости от того что в вас: объект или указатель на объект.
Например:
MyClass MyObject; // это объект
MyClass *pObject1 = &MyObject; // pObject1 указатель на объект MyObject
MyClass *pObject2 = new MyClass; // pObject2 указатель на объект созданный в куче

MyObject.someMethod(); // т.к. это объект

// А это указатели на объекты
pObject1->someMethod();
pObject2->someMethod();

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Классы C++
« Ответ #6 : 16 Августа 2012, 13:51:48 »
В двух соснах заблудились
Добавлю третью. Вообще еще есть ссылки.

Код: (cpp) [Выделить]
#include <iostream>

struct A {
   int b;
};

int get_b(const A &a)
{
    return a.b;
}

int main()
{
    A *obj = new A;
    obj->b = 10;
    std::cout << get_b(*obj) << std::endl;
    delete obj;
}

PetrovSE

  • Гость
Re: Классы C++
« Ответ #7 : 16 Августа 2012, 18:17:19 »
To Yurror:
Ссылки это бесовщина :)

Вот у меня есть чисто космологический вопрос:
зачем нужно было вводить два разных способа обращения - через "." и через "->"?
Кажется, что можно было обойтись чем-то одним.
Как может возникнуть ситуация когда компилятор не в состоянии определить что перед ним: указатель, объект или ссылка?

Оффлайн mastepaner

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Классы C++
« Ответ #8 : 16 Августа 2012, 18:23:28 »
"выбор оператора . или -> зависит от типа переменной и не имеет отношения к атрибутам самого объекта. Раз уж мы заговорили об этом, правильные названия этих операторов (. и ->) — селекторы членов класса (member selectors). Если вы назовете их «точкой» или «стрелкой» на семинаре с коктейлями, наступит гробовая тишина, все повернутся и презрительно посмотрят на вас, а в дальнем углу кто-нибудь выронит свой бокал."
Как может возникнуть ситуация когда компилятор не в состоянии определить что перед ним: указатель, объект или ссылка?
Насколько мне известно, вопрос про возникновение ситуации невозможности определить тип вообще не ставился - давным-давно жил-был язык С, в котором люди писали примерно вот такой код:
struct tag *st_ptr;
st_ptr = &my_struct;
(*st_ptr).age = 63;

И людей НАСТОЛЬКО утомляли эти (*st_ptr).age что они сдались и ДОБАВИЛИ возможность написать "st_ptr->age" просто чтобы не писать "(*st_ptr).age":

st_ptr->age = 63;

А когда наступил С++ то программы на С должны были оставаться валидными программами и на С++. Так что всё вот так и оставили.
« Последнее редактирование: 16 Августа 2012, 18:52:32 от mastepaner »

Оффлайн dronte

  • Автор темы
  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Классы C++
« Ответ #9 : 16 Августа 2012, 21:32:43 »
Хм ... сколько всего высказано, да в общем все одно и тоже ;D
А так по теме, всем спасибо ...   :)

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.