В чем причина того, что в C ++ значение по умолчанию для переменной не является нестатическим методом или членом класса? - PullRequest
3 голосов
/ 04 декабря 2009

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

Есть ли причина для этого? Не мог ли компилятор предоставить методу позицию в классе нестатического значения по умолчанию?

Я пытался быстро найти ответ, но не смог найти хороший ответ.

РЕДАКТИРОВАТЬ: вот пример.

Это законно:

 class ClassTemp
{
  static int s_member;

  int MagicOperation(int defaultValue = s_member)
  {
    return defaultValue;
  }
};

Но это не так:

class ClassTemp
{
  int m_member;

  int MagicOperation(int defaultValue = m_member)
  {
    return defaultValue;
  }
};

Ответы [ 4 ]

5 голосов
/ 04 декабря 2009

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

Конечно, теоретически возможно разрешить использование нестатических членов в качестве параметров по умолчанию и заставить компиляторы использовать экземпляр класса, указанный в вызове члена. Но это не похоже на "C ++ способ" делать что-то для меня. Кроме того, это может привести к довольно запутанной и не элегантной спецификации в некоторых более сложных случаях, например, когда метод является виртуальным.

1 голос
/ 04 декабря 2009

Нестатические члены привязаны к объекту и требуют указатель «this» для доступа к нему. Поскольку этот указатель недоступен для паролей по умолчанию, он не разрешен

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

Если я понимаю ваш вопрос, это потому, что компилятор знает, существует ли нестатическая переменная, которую вы инициализируете, этот метод var - таким образом, требуется, чтобы он был статическим, поэтому он гарантированно существовал при инициализации метода var. Это не вопрос поиска.

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

Вверху моей головы, чтобы параметры по умолчанию из экземпляра класса, в который вы вызываете, потребовали бы «разыменования» значения члена перед выполнением вызова из-за того, что аргументы функции помещались в стек перед this указатель.

Во-вторых, при каждом вызове этого метода будут небольшие издержки, использующие значение по умолчанию:

push provided arguments...
push (this->member)
push this

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

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