Какова подходящая терминология английского языка для ссылки на объект в C ++? - PullRequest
3 голосов
/ 14 декабря 2009

Какая правильная / подходящая английская терминология для ссылки на «текущий» объект в C ++. Например, скажем, вы пишете комментарий в теле реализации этого:

Thing Thing::operator+(const Thing& other)

У вас есть имя переменной «other» для другого объекта, но какое слово / выражение вы используете для ссылки на объект, который выполняет операцию?

Ответы [ 10 ]

11 голосов
/ 14 декабря 2009

В C ++ это называется this объект, и это то, что я использую.

Редактировать : я второй комментарий Нейла о том, что operator+() лучше быть не членом. Для меня каноническая форма состоит в том, чтобы реализовать += в качестве члена (он изменяет объект левой стороны и, следовательно, должен иметь к нему доступ) и реализовать operator+ поверх него:

inline Thing operator+(Thing lhs, const Thing& rhs)
{
  lhs += rhs;
  return lhs;
}

(Примечание. Раньше я тоже передавал lhs по константной ссылке и выполнял копирование внутри функции, но некоторое время назад убедился, что вместо этого лучше передавать его как копию.)

6 голосов
/ 14 декабря 2009

Проблема с «этим» в том, что это обычное слово на английском языке. Как человек, который много читал лекции по C ++, я всегда сталкивался с трудностями, когда говорил, чтобы понять, когда я использовал «this» для обозначения текущего объекта. Я никогда не придумал идеального решения, но часто хотел, чтобы BS использовал «я» вместо «это».

3 голосов
/ 14 декабря 2009

Я склонен использовать то же соглашение в документации, что и в коде: я оставляю это неявным. Например. «Добавьте еще одну вещь и верните сумму».

Когда мне нужно быть явным, это для комментариев, прочитанных другими программистами. Они знают C ++, *this легко понять. Например. «Добавить еще одну вещь в *this, добавив всех членов, кроме Thing :: foo, которая станет 0 (см. Ошибку # 42)»

3 голосов
/ 14 декабря 2009

Либо «это», либо, может быть, «этот экземпляр». Как в:

/** \brief Adds another Thing to this instance.
 * A reference to this instance is returned.
*/
Thing& Thing::operator+(const Thing& other);

Разметка Doxygen , для тех, кто не знаком с этим.

2 голосов
/ 14 декабря 2009

Может также использоваться «левый операнд» и «правый операнд», поскольку ваш оператор является двоичным.

2 голосов
/ 14 декабря 2009

Прежде всего, есть указатель this специально для этой цели. Поэтому вполне естественно называть текущий объект «этим объектом».

0 голосов
/ 14 декабря 2009

Мне кажется, что если вы хотите сослаться на текущий объект, вы не ошибетесь, назвав его текущим объектом .

0 голосов
/ 14 декабря 2009

Если вы реализуете оператор вне области действия класса, то аргументы часто называются lhs и rhs (левая и правая части).

Вам не нужно имя для текущего объекта, потому что у вас уже есть указатель this. Внутри статических методов иногда требуется указатель на объект класса (например, для вызова метода экземпляра). В этих ситуациях я использую имя переменной pThis.

Если вам нужно имя, когда говорите об этом, тогда «я» имеет смысл. Я иногда называю это «объектом».

0 голосов
/ 14 декабря 2009

В комментариях я обычно говорю «это» или «мы сами» (потому что я обычно пишу комментарии во множественном числе от первого лица, но «мы сами» слишком странные, когда есть только один объект).

В документации я говорю "1003 *". Если это неоднозначно (например, функция принимает в качестве параметра другую), я говорю «этот объект» или «этот <whatever>». <whatever> - это либо имя класса, либо другой термин, используемый в документации для объяснения того, что представляет класс.

/**
 * An utterly useless write-only counter, with arbitrary initial value.
 */
class Counter {
    unsigned int count;
public:
    /** 
     * Increments the counter
     */
    Counter &operator++() {
        // We need to add 1 to ourself. I found a snippet online that does it:
        ++count;
        // return ourself
        return *this;
    }
    /**
     * Adds together this counter and "other".
     */
    Counter operator+(const Counter &other) const {
        Counter result;
        // new count is our count plus other count
        result.count = count + other.count;
        return result;
    }
};
0 голосов
/ 14 декабря 2009

В C ++ нет текущего объекта, но только указатель на объект доступен в функции-члене этот указатель .

...