конструктор int ?
От: Аноним  
Дата: 03.09.09 13:26
Оценка:
vs2008,

int i1 = int();
Re: конструктор int ?
От: Sergey Россия  
Дата: 03.09.09 13:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>vs2008,


А>int i1 = int();


Нет, zero initializer.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: конструктор int ?
От: pro_gerr  
Дата: 03.09.09 13:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>vs2008,


А>int i1 = int();


А в чем собственно вопрос то?
Re[2]: конструктор int ?
От: _Ursus_  
Дата: 03.09.09 13:57
Оценка: :)
Здравствуйте, pro_gerr, Вы писали:

А>>int i1 = int();

_>А в чем собственно вопрос то?

Чувака поразил факт, что базовые типы тоже имеют конструктор.
Re[3]: конструктор int ?
От: jazzer Россия Skype: enerjazzer
Дата: 03.09.09 14:42
Оценка: +3
Здравствуйте, _Ursus_, Вы писали:

_U_>Здравствуйте, pro_gerr, Вы писали:


А>>>int i1 = int();

_>>А в чем собственно вопрос то?

_U_>Чувака поразил факт, что базовые типы тоже имеют конструктор.


меня бы этот факт тоже поразил, потому что они не имеют конструктора.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: конструктор int ?
От: AbramKotkin  
Дата: 03.09.09 15:18
Оценка:
_U_>>Чувака поразил факт, что базовые типы тоже имеют конструктор.

J>меня бы этот факт тоже поразил, потому что они не имеют конструктора.


Привожу текст из английского оригинала своей любимейшой книги по C++: The C++ Programming Language (Special Edition) Bjarne Stroustrup.
Section 6 Expressions and Statements
6.2.8 Constructors

The construction of a value of type T from a value e can be expressed by the functional notation T(e). For Example:

void f(double d)
{
   int i = int(d);
}


The T(e) construct is sometimes referred to as a function-style cast. Unfortunately, for a built-in type T, T(e) is equivalent to (T)e.

The constructor notation T() is used to express the default value of type T.

void f(double d)
{
   int j = int();
}


...
Thus, int() is another way of writing 0.
Re[5]: конструктор int ?
От: Fwiffo Россия  
Дата: 03.09.09 15:55
Оценка:
Здравствуйте, AbramKotkin, Вы писали:

AK>The constructor notation T() is used to express the default value of type T.


AK>
AK>void f(double d)
AK>{
AK>   int j = int();
AK>}
AK>


AK>...

AK>Thus, int() is another way of writing 0.

Это именно constructor notation, т.е. просто запись в похожей форме. Конструктора у них все-таки нет. Что это за конструктор такой, если он не всегда вызывается при создании объекта?
Re[6]: конструктор int ?
От: Vain Россия google.ru
Дата: 03.09.09 16:09
Оценка:
Здравствуйте, Fwiffo, Вы писали:

F>Это именно constructor notation, т.е. просто запись в похожей форме. Конструктора у них все-таки нет. Что это за конструктор такой, если он не всегда вызывается при создании объекта?

А если бы был, вы его смогли отличить от Constructor notation?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: конструктор int ?
От: Fwiffo Россия  
Дата: 03.09.09 17:02
Оценка:
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, Fwiffo, Вы писали:


F>>Это именно constructor notation, т.е. просто запись в похожей форме. Конструктора у них все-таки нет. Что это за конструктор такой, если он не всегда вызывается при создании объекта?

V>А если бы был, вы его смогли отличить от Constructor notation?

Не понял вопрос. Конструктор — это функция такая. Constructor notation — запис инициализации объектов.
Почему не назвать иницализацию нулем конструктором? Потому что она не подходит под определение конструктора и не ведет себя как конструктор:
int a = int(); // тут вызвался "конструктор"
int a; // а тут нет...
Re[8]: конструктор int ?
От: Vain Россия google.ru
Дата: 03.09.09 17:44
Оценка: :)
Здравствуйте, Fwiffo, Вы писали:

F>Не понял вопрос. Конструктор — это функция такая. Constructor notation — запис инициализации объектов.

F>Почему не назвать иницализацию нулем конструктором? Потому что она не подходит под определение конструктора и не ведет себя как конструктор:
F>
F>int a; // а тут нет...
F>

А почему вы думаете, что он не вызвался?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: конструктор int ?
От: Николай Ивченков  
Дата: 03.09.09 18:12
Оценка:
AbramKotkin:

AK>The constructor notation T() is used to express the default value of type T.


Это всего лишь неформальное объяснение Страуструпа. В стандарте это называется "Explicit type conversion (functional notation)" — см 5.2.3/2:

The expression T(), where T is a simple-type-specifier (7.1.5.2) for a non-array complete object type or the (possibly cv-qualified) void type, creates an rvalue of the specified type, which is value-initialized (8.5; no initialization is done for the void() case). [Note: if T is a non-class type that is cv-qualified, the cv-qualifiers are ignored when determining the type of the resulting rvalue (3.10). ]

8.5/5:

To value-initialize an object of type T means:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);
— if T is a non-union class type without a user-declared constructor, then every non-static data member and base-class component of T is value-initialized;
— if T is an array type, then each element is value-initialized;
otherwise, the object is zero-initialized

To zero-initialize an object of type T means:
— if T is a scalar type (3.9), the object is set to the value of 0 (zero) converted to T;
[...]

Никакого упоминания об использовании конструктора в данном случае.

AK>Thus, int() is another way of writing 0.


А вот тут, кстати, интересная ситуация. 0 — это не объект, а вот int() — это объект (value-initialization определена только для объектов). 5.19/1 позволяет использовать преобразования к integral type в integral constant-expression. Когда в следующем коде может быть создан временный объект и каково его время жизни?

enum { value = int() };
int main() {}
Re[9]: конструктор int ?
От: Fwiffo Россия  
Дата: 03.09.09 18:13
Оценка:
Здравствуйте, Vain, Вы писали:

V>А почему вы думаете, что он не вызвался?


Потому что переменная нулём не инициализировалась...
Тогда расскажите, что делает этот конструктор
int::int()
{
   // что здесь надо написать, чтобы в зависимости от способа инициализации объекта 
   // производились разные действия?
}
Re[9]: конструктор int ?
От: Кодт Россия  
Дата: 03.09.09 18:17
Оценка:
Здравствуйте, Vain, Вы писали:

V>А почему вы думаете, что он не вызвался?


Потому что int() инициализировано нулём, а int x не инициализировано.
Хотя обе записи выглядят как дефолтный конструктор.

Вообще, логично было бы считать именно неинициализацию дефолтным конструктором. Такое поведение (отсутствие его ) наблюдается во всех случаях как-бы-конструирования, кроме одного
— int x; int x[N];
— new int; new int[N];
— POD-член в составе не-POD-структуры с нетривиальным неявно определённым дефолтным конструктором (выполняющим дефолтное конструирование баз и членов)
И только
— int(), new int()
обнуляет.
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.