LINUX.ORG.RU

Разница между обращением к методу класса -> и .

 


0

0

Вот надо мне передать ссылку на экземпляр класса, но почему тогда к его методам надо обращаться через ->? В чем вообще разница между этими вещами? Что я делаю неправильно?

class C
{
	public:
		C(){};
		void Method(){};
};

int main()
{
	C c;
	c.Method();
	C *c_ptr = new C();
	c_ptr->Method();
}
★★★
Ответ на: комментарий от PolarFox

А вот допустим перегрузил я операторы, как тогда с ними в таком случае работать?

class C
{
	int array[5] = {1,2,3,4,5};
	public:
		C(){};
		void Method(){};
		const int operator [](unsigned int i) const    { return array[i]; }
		int & operator [](unsigned int i) {return array[i];}
};

nikolnik ★★★
() автор топика
Ответ на: комментарий от nikolnik

Да: возвращать const int смысла никакого нет. Это всё равно временный объект (rvalue). Либо константную ссылку (const int&), либо просто int.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Я понял, спасибо. А в данном случае, оператор -> как-то связан вообще со структурами и классами одновременно? Просто я знаю, что -> используется для обращения к полям структур, что между ними общее, что используется одинаковый оператор ->?

nikolnik ★★★
() автор топика
Ответ на: комментарий от nikolnik

А вот допустим перегрузил я операторы

и не сохранил семантику, значит добавляй новых методов и забудь про стандартную семантику операторов, а используй эти новые методы.

dimon555 ★★★★★
()
Ответ на: комментарий от nikolnik

В C++ структуры и классы — почти одно и то же.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Да: возвращать const int смысла никакого нет. Это всё равно временный объект (rvalue). Либо константную ссылку (const int&), либо просто int.

Для int смысл есть как минимум потому что у тебя sizeof(int) <= sizeof(int&). Плюс нет лишнего разыменования указателя.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Я же написал: "... либо просто int".

У GCC, вообще-то, даже варнинг есть на тему возврата из функции константного значения.

intelfx ★★★★★
()
Ответ на: комментарий от nikolnik

А в данном случае, оператор -> как-то связан вообще со структурами и классами одновременно?

это просто синтаксис языка, к структуре можно обращаться и struct.var и struct->var и т.д. структура в си++ если говорить по простому - это класс с публичными методами и полями.

jo_b1ack ★★★★★
()

Да тут все так же, как и с сишным доступом к членам структуры.

int v1 = foo.data; // Обращение к члену data при доступе через экземпляр структуры/ссылку.
int v2 = ptr->data; // Обращение к члену data при доступе через указатель на структуру.
Во втором случае оператор -> совмещает в себе сразу два действия: разыменовывание указателя и обращение к data через экземпляр структуры (мы его получили путем разыменовывания указателя). Поэтому, как уже написали, для второго случая существует более подробная эквивалентная запись:
int v3 = (*ptr).data;
Собственно с функциями членами C++ все тоже самое.

m0rph ★★★★★
()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от nikolnik

А вот допустим перегрузил я операторы, как тогда с ними в таком случае работать?

(*foo)[123]

slovazap ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ещё раз, для особо одарённых. Возврат из функции const-значения не имеет смысла, потому что это rvalue.

$ cat return_const.cpp
const int f()
{
	return 0;
}

int main()
{
	return f();
}

$ clang++ -Wall -Wextra return_const.cpp -o return_const
return_const.cpp:1:1: warning: 'const' type qualifier on return type has no effect [-Wignored-qualifiers]
const int f()
^~~~~~
1 warning generated.
intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.