реклама на сайте
подробности

 
 
> C++ доступ к членам класса через this->, чем чревато злоуотребление?
sigmaN
сообщение May 14 2018, 07:23
Сообщение #1


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Один мой товарищ( как говорится, не к ночи будет помянут сей язык, бывший PHPшник) в C++ коде для AVR8 везде лепит this->

Вот пример его кода https://pastebin.com/hqyYcQYh

Аргументирует он это тем, что так якобы понятнее, что это член класса.
Хотя, конечно-же, это решается нэймингом.

В общем-то на C++ так никто не пишет, но хотелось бы привести весомые аргументы почему именно.

Первый аргумент, который я привел: this это указатель. Используя его мы подрезаем ноги оптимизатору, который, как я понимаю, на много аккуратнее относится к оптимизации indirect access
И может быть в каких-то простых случаях он этот this и упразднит, но тем не менее.

Может быть у кого-то еще есть аргументы? Мне даже самому стало интересно. Уже который год эта тема у нас с ним регулярно поднимается. Прям холливар Сишника и бывшего ПХПшника biggrin.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
tabr
сообщение May 14 2018, 09:50
Сообщение #2





Группа: Участник
Сообщений: 8
Регистрация: 4-08-11
Пользователь №: 66 568



Объясню, почему я так делаю...
Код:
Код
class ClassA
{
public:
void Set(uint8_t some_var)
{
//some actions
}
}
class ClassB
{
public:
void Set(uint8_t some_var)
{
//some actions
}
void BlaBlaBla(*ClassA var, uint8_t some_var)
{
if (/*something*/)
{
var->Set(some_var);
this->Set(some_var);//вот тут правильнее в целом смотрится именно this, а не "Set(some_var);"
}
}
}

Так же если в методе я буду всё-таки вынужден использовать this для доступа к членам текущего класса, то комбинация
Код
void SomeFunction(void)
{
//some code
}
class SomeClass
{
void SomeFunction(void)
{
//some another code
}
void SomemethodA(void)
{
}
void SomemethodB(void)
{
}
void SomemethodC(void)
{
this->SomeFunction();
SomemethodA();
SomemethodB();
SomeFunction();//чё происходит?
}
}

выглядит не очень. Как-то не читаемо, т.к. оно означает что где-то (НАВЕРНОЕ) есть функция с таким же названием, но это не точно.
Такая ситуация может возникнуть, если оспользуешь какие-нить сишные либы, к примеру (мне неизвестные), и имя твоего метода ВНЕЗАПНО совпало с именем... ну вы поняли...
ИМХО чем использовать ИНОГДА this (что я и делал сначала), я принял волевое xD решение использовать его ВСЕГДА - именно для повышения удобочитаемости кода.

Сообщение отредактировал tabr - May 14 2018, 10:08
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 14 2018, 17:33
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(tabr @ May 14 2018, 12:50) *
Код: . . .

Код
void SomeFunction(void)
{
..//some code  AAAA
}

class SomeClass
{
...void SomeFunction(void)
...{
...//some another code  BBBB
...}
...void SomemethodA(void)
...{
...}
...void SomemethodB(void)
...{
...}
...void SomemethodC(void)
...{
.....this->SomeFunction();
.....SomemethodA();
.....SomemethodB();
.....SomeFunction();//чё происходит?   - тоже, что и this->SomeFunction();  some code  BBBB
---------------
    ::SomeFunction();   // +++   some code  AAAA
---------------
...}

}
Y/N ?
Go to the top of the page
 
+Quote Post
Forger
сообщение May 14 2018, 19:35
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Если не ошибаюсь, то локальные методы/поля имеют приоритет над глобальными методами (функциями)/переменными.
Другими словами: чем уже область видимости, тем больше преимущество (если тут можно применить такой термин).
Речь про одинаковые названия.
Но дабы не гадать как себя поведет тот или иной компилятор, стоит вообще избегать таких ситуаций.
Поскольку найти потом подобные ошибки будет крайне сложно!


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sigmaN   C++ доступ к членам класса через this->   May 14 2018, 07:23
- - AlexRayne   Цитата(sigmaN @ May 14 2018, 10:23) Может...   May 14 2018, 07:45
- - novikovfb   ИМХО, ставить везде this-> равносильно избыточн...   May 14 2018, 07:47
- - Сергей Борщ   Согласен со всеми - с одной стороны защищает от со...   May 14 2018, 08:09
- - Kabdim   расскажите ему о (*this).something .   May 14 2018, 09:10
- - k155la3   Видать человек при переходе на С(++) походил по с...   May 14 2018, 09:17
|- - jcxz   Цитата(Forger @ May 14 2018, 22:35) Если ...   May 15 2018, 05:28
|- - Forger   Цитата(jcxz @ May 15 2018, 08:28) Очень о...   May 15 2018, 05:35
|- - AlexandrY   Цитата(jcxz @ May 15 2018, 08:28) Очень о...   May 15 2018, 05:42
- - Forger   © "Масло масляное" В крайне редких случ...   May 14 2018, 10:49
- - esaulenka   Цитата(sigmaN @ May 14 2018, 10:23) Может...   May 14 2018, 11:50
- - Nixon   Да какие аргументы, в первой же строчке написано п...   May 14 2018, 14:02
- - jcxz   Цитата(sigmaN @ May 14 2018, 10:23) Первы...   May 14 2018, 14:06
- - Сергей Борщ   QUOTE (jcxz @ May 15 2018, 08:28) Стараюс...   May 15 2018, 07:51
|- - Forger   Цитата(Сергей Борщ @ May 15 2018, 10:51) ...   May 15 2018, 10:00
|- - Сергей Борщ   QUOTE (Forger @ May 15 2018, 13:00) Судя ...   May 15 2018, 11:08
|- - Forger   Цитата(Сергей Борщ @ May 15 2018, 14:08) ...   May 15 2018, 11:19
- - k155la3   Эт не мы. Все с англичан началось, с ихним This_IS   May 15 2018, 11:07
|- - Сергей Борщ   QUOTE (k155la3 @ May 15 2018, 14:07) Эт н...   May 15 2018, 21:28
- - sigmaN   Никакого троллинга и холливара У меня с другом сос...   May 15 2018, 15:42
- - Forger   Цитата(sigmaN @ May 15 2018, 18:42) Никак...   May 15 2018, 16:07


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01402 секунд с 7
ELECTRONIX ©2004-2016