@classmethod: может использоваться для создания общего глобального доступа ко всем экземплярам, созданным из этого класса ..... например, для обновления записи несколькими пользователями ... Я особенно нашел, что это полезно при создании синглетов ..:)
@статический метод: не имеет ничего общего с классом или экземпляром, связанным с ... но для чтения может использовать статический метод
Порядок оценки элементов в выражении неуточнен (кроме некоторых очень частных случаев, таких как операторы &&
и ||
и тернарный оператор, которые вводят точки последовательности ); поэтому не гарантируется, что test
будет оцениваться до или после foo(test)
(который его модифицирует).
Если ваш код зависит от конкретного порядка оценки, самым простым методом его получения является разделение вашего выражения на несколько разделенных операторов.
Порядок оценки неуточнен. Это не слева направо, справа налево или что-то еще.
Не делайте этого.
Ответ на этот вопрос изменился в C ++ 17.
Оценка перегруженных операторов теперь упорядочена так же, как и для встроенных операторов (C ++ 17 [over.match.oper ] / 2).
Кроме того, теперь <<
, >>
и операторы подписи теперь имеют левый операнд , упорядоченный до справа, а постфиксное выражение вызова функции - упорядочивается до оценки аргументов.
(Другие бинарные операторы сохраняют свое предыдущее упорядочение, например +
по-прежнему не подвержены последовательности).
Итак, код в вопросе должен теперь выводить Value of test is : 0 Return value of function is : 1 Value of test : 1
. Но совет «Не делай этого» по-прежнему разумен, учитывая, что для обновления до C ++ 17 потребуется некоторое время.
Порядок оценки неуточнен, см. http://en.wikipedia.org/wiki/Sequence_point
Это та же ситуация, что и пример с примером оператора + :
Рассмотрим две функции
blockquote >f()
иg()
. В C и C ++ оператор+
не связан с точкой последовательности, и поэтому в выраженииf()+g()
возможно, что либоf()
, либоg()
будут выполнены в первую очередь.