Здравствуйте, Вадим Никулин, Вы писали:
ВН>Так ведь дефолтный конструктор для A ничего не делает! Поэтому A::a не станет равным 0. Все-равно надо явно прописать конструктор по-умолчанию.
А я думал что дефолтный конструктор все обнуляет... Правда, никогда на это не рассчитывал и всегда писал его явно
I>А я думал что дефолтный конструктор все обнуляет... Правда, никогда на это не рассчитывал и всегда писал его явно
Неявный дефолтный конструктор, сгенеренный компилятором, может сделать следующее : вызвать конструкторы базовых классов, членов-данных и, например, установить указатель на таблицу виртуальных функций. Но он не будет занулять данные встроенных типов — тебе придется писать для этого конструктор самому.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
I>>А я думал что дефолтный конструктор все обнуляет... Правда, никогда на это не рассчитывал и всегда писал его явно
L_L>Неявный дефолтный конструктор, сгенеренный компилятором, может сделать следующее : вызвать конструкторы базовых классов, членов-данных и, например, установить указатель на таблицу виртуальных функций. Но он не будет занулять данные встроенных типов — тебе придется писать для этого конструктор самому.
ok. Теперь уже запутался я. А что такое тогда value-initialization? Если можно, со ссылкой на стандарт.
ВН>ok. Теперь уже запутался я. А что такое тогда value-initialization? Если можно, со ссылкой на стандарт.
стандарт нужен не 1998 года, с поправками. value — initialization вкратце означает, что при отсутствии явно определенного дефолтного конструктора будут вызваны конструкторы для баз и подобъектов-членов и т.д. и т.п., но главное в нашем обсуждении, будет выполнена value инициализация для членов встроенных типов, которая сведется к zero-инициализации. Копировать из моей версии стандарта нельзя (она бумажная ) а потому ссылки:
в revisions это страница 18, 20, 33.
А если ссылками, это 5.2.3/2, 5.3.4/15, 8.5/5
Of course, the code must be complete enough to compile and link.
Здравствуйте, Ignoramus, Вы писали:
I>>>А почему?
ВН>>Mr. jazzer хотел сказать, что на каноническую форму присваивания это не действует.
ВН>>Каноническая форма конструктора копирования: ВН>>Obj( const Obj & );
ВН>>Каноническая форма присваивания: ВН>>Obj &operator = ( const Obj & );
I>Ну Вы меня совсем запутали На что действует и на что не действует?
Mr. Вадим Никулин хотел сказать, что, помимо "канонических" форм конструктора копирования и оператора присваивания, имеющих аргументом константную ссылку, если "неканонические" с неконстантной ссылкой (например, таков класс std::auto_ptr), и вот для них-то это работать и не будет
"Ignoramus" <18039@users.rsdn.ru> wrote in message news:1133667@news.rsdn.ru... > int f(void) const;
Маленький совет не в тему: пиши f() вместо f(void) потому что во-первых короче,
во-вторых ты используешь пережитки из C, в-третьих (void) deprecated аж с 89
года, но для сохранения обратной
совместимости с C эта херь осталась (ЗЫ в С99 она тоже deprecated), в-четвертых
понятней особенно для тех кто читает твой код(не этот).
ЗЫ: А в Whidbey так и будет показывать войд — Майкрософт сказала, что исправит
это в следующей версии (где-нить в 2007... )
Здравствуйте, Pavel Chikulaev, Вы писали:
PC>Маленький совет не в тему: пиши f() вместо f(void) потому что во-первых короче, PC>во-вторых ты используешь пережитки из C, в-третьих (void) deprecated аж с 89 PC>года, но для сохранения обратной PC>совместимости с C эта херь осталась (ЗЫ в С99 она тоже deprecated), в-четвертых PC>понятней особенно для тех кто читает твой код(не этот).
У меня почему-то обратная ассоциация была, что когда я пишу f(), то как бы использую пережиток из С в виде произвольного числа аргументов. Просмотрел Страуструпа, но не нашел советов на этот счет, хотя почему-то запомнилось что что-то было, видимо глюк в памяти. Будем считать, Вы меня убедили .
Здравствуйте, Lorenzo_LAMAS, Вы писали:
I>>1. Можно ли объявлять глобальную функцию (не член класса) как "int g(void) const". Думается что нет, т.к. не вижу смысла. Если да, то что это значит?
L_L>Нет, нельзя. Так же как и статическую функцию-член класса нельзя.
Статическую функцию член класса ещё как можно создавать.
class A
{
public:
static int sfuncA()
{
return 3; // всё в порядке
return i_; // а вот тут ошибка компилятора, т.к. статическая функция класса не имеет доступа к переменным и к this.
}
private:
int i_;
}
A * a = NULL;
int b = a->sfuncA(); // ошибки нет, даже с учётом того, что указатель NULL;
Обычно статическая функция создаётся для запуста нового потока, и в качестве поточной функции используется статическая функция
А>Статическую функцию член класса ещё как можно создавать.
Речь шла о попытке объявить статическую функцию-член класса константной, чего сделать нельзя.
Of course, the code must be complete enough to compile and link.
I>У меня почему-то обратная ассоциация была, что когда я пишу f(), то как бы использую пережиток из С в виде произвольного числа аргументов. Просмотрел Страуструпа, но не нашел советов на этот счет, хотя почему-то запомнилось что что-то было, видимо глюк в памяти. Будем считать, Вы меня убедили .
У тебя была правильная ассоциация с точки зрения С, а в С++ это функция без параметров.
Of course, the code must be complete enough to compile and link.
"Lorenzo_LAMAS" <14979@users.rsdn.ru> wrote in message news:1135351@news.rsdn.ru... > С какой стати она deprecated, если в С void fun() и void fun(void) это разные > вещи???
Там deprecated старое использование void fun() как fun(4, 23, 34, 23);
"Lorenzo_LAMAS" <14979@users.rsdn.ru> wrote in message news:1135359@news.rsdn.ru... > У тебя была правильная ассоциация с точки зрения С, а в С++ это функция без > параметров.
Но ведь если программировать на С++, ты ведь со мной согласен ???
"Lorenzo_LAMAS" <14979@users.rsdn.ru> wrote in message news:1135375@news.rsdn.ru... > PC>Но ведь если программировать на С++, ты ведь со мной согласен ??? > Ээээ, что void fun() функция без параметров? Да, конечно.
Что писать лучше void fun() чем void fun(void)
"Lorenzo_LAMAS" <14979@users.rsdn.ru> wrote in message news:1135372@news.rsdn.ru... > PC>Там deprecated старое использование void fun() как fun(4, 23, 34, 23);
Это не а стандарте это из best coding practices
PC>Что писать лучше void fun() чем void fun(void)
Да, естественно. Но я к этому и не придирался. Я не согласен только с утверждением, что void fun(void) — deprecated в С99/89
PC>-- PC>Pavel Chikulaev
Of course, the code must be complete enough to compile and link.