В классе C ++, в чем разница между доступом к переменной-члену с помощью "this" - PullRequest
5 голосов
/ 04 ноября 2011

Я сделал простой класс для представления двери.Чтобы вернуть переменные, я обращаюсь к ним с помощью указателя this.Что касается простого доступа к переменным, в чем разница между доступом к ним с помощью указателя this и без него?

class Door
{
protected:
    bool shut; // true if shut, false if not shut
public:
    Door(); // Constructs a shut door.
    bool isOpen(); // Is the door open?
    void Open(); // Opens the door, if possible. By default it
    // is always possible to open a generic door.
    void Close(); // Shuts the door.
};
Door::Door()
{}
bool Door::isOpen()
{
    return this->shut;
}
void Door::Open()
{
    this->shut = false;
}
void Door::Close()
{
    if(this->isOpen()) this->shut = true;
}

Здесь может быть или не быть разница, но как насчет более сложных классов?1006 *

Ответы [ 5 ]

10 голосов
/ 04 ноября 2011

Ничего. Указатель this добавляется автоматически, если вы его исключаете.

Вы должны использовать его, только если вы делаете что-то вроде этого:

void Door::foo(bool shut)
{
    this->shut = shut; // this is used to avoid ambiguity
}

Другие варианты использования


Краткий обзор:

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

void Door::foo(int x) { this->y = x; } // this keyword not needed

примерно эквивалентно

void foo(Door* this_ptr, int x) { this_ptr->y = x; }

Методы просто автоматизируют это.

3 голосов
/ 04 ноября 2011

Нет никакой разницы.

Когда вы пишете здравомыслящий C ++, вам вообще не нужно говорить this, за исключением очень специфических ситуаций.(Единственное, о чем я могу думать, это привязка указателей к функции-члену, передача указателя экземпляра на какой-то другой объект и некоторые ситуации с использованием шаблонов и наследования (спасибо Mooing Duck за последний пример).)

Просто дайте своим аргументам функций, локальным переменным и переменным-членам разумные имена, чтобы не было двусмысленностей.

Существует множество последних квази-объектно-ориентированных языков, которыеЯ сделал слова «это» и «новый» почти синонимичными с «Я использую объекты» для молодых поколений, но это не идиома C ++.

1 голос
/ 04 ноября 2011

Все это, кажется, упражнение в излишнем наборе текста.Насколько я вижу, Close можно сжать до:

void Door::Close() {
    shut = true; 
}

Выполнение назначения, даже если оно не нужно, намного проще, чем тестирование и настройка, только если в настоящий момент оно ложно.

Стоит также упомянуть (IMO), что этот комментарий:

Door(); // Constructs a shut door.

Не похоже на реализацию:

Door::Door()
{}

Если вы хотите, чтобы ctor по умолчанию инициализировал shutк true, вам нужно / хотите добавить какой-то код для этого.

Хуже того, ваш IsOpen, кажется, получает вещи совсем наоборот:

bool Door::isOpen()
{
    return this->shut;
}

Если он закрыт, он не открыто, и наоборот.

1 голос
/ 04 ноября 2011

В вашем случае нет разницы.Только больше печатной работы.

0 голосов
/ 04 ноября 2011

Нет никакой разницы, за исключением того, что больше типа и шума, введенного this->.

void Door::Close()
{
    if(isOpen()) shut = true;
}

, более читабельно для них это:

void Door::Close()
{
    if(this->isOpen()) this->shut = true;
}

но это только личные предпочтения,и вопрос стиля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...