what is the default constructor for the POD type

Discussion in 'C++' started by Stanley Rice, Feb 19, 2012.

  1. Stanley Rice

    Stanley Rice Guest

    I want to know the *default constructor* for the POD type. Since STL
    implement some of the function based on the type of the paramter, fill_n
    for example, may have different implementation, one for the POD type, where
    no constructor will be called, and other for non-POD type. So I wrote the
    code:
    vector<int> vec(5);
    and follow the debugger. Finlly, I come across a function:

    template<typename _OutputIterator, typename _Size, typename _Tp>
    inline typename
    __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
    __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
    {
    const _Tp __tmp = __value;
    for (; __n > 0; --__n, ++__first)
    *__first = __tmp;
    return __first;
    }

    which is defined in stl_algobse.h. I print out the value of the parameter
    *__value* and the result is:
    (const int &) @0xbffff338: 0
    and the value of __tmp is: 0

    I didn't initialize the __value, so I think the value of variable __value
    should be *random*, just like a normal variable definition without
    initializaion. But, here the value is always 0, Why?

    Thanks.
    Stanley Rice, Feb 19, 2012
    #1
    1. Advertising

  2. On 19.02.2012 07:33, Stanley Rice wrote:
    > I want to know the *default constructor* for the POD type. Since STL
    > implement some of the function based on the type of the paramter, fill_n
    > for example, may have different implementation, one for the POD type, where
    > no constructor will be called, and other for non-POD type. So I wrote the
    > code:
    > vector<int> vec(5);
    > and follow the debugger. Finlly, I come across a function:
    >
    > template<typename _OutputIterator, typename _Size, typename _Tp>
    > inline typename
    > __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
    > __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
    > {
    > const _Tp __tmp = __value;
    > for (; __n> 0; --__n, ++__first)
    > *__first = __tmp;
    > return __first;
    > }
    >
    > which is defined in stl_algobse.h. I print out the value of the parameter
    > *__value* and the result is:
    > (const int&) @0xbffff338: 0
    > and the value of __tmp is: 0
    >
    > I didn't initialize the __value, so I think the value of variable __value
    > should be *random*, just like a normal variable definition without
    > initializaion. But, here the value is always 0, Why?
    >
    > Thanks.


    `std::vector` guarantees to initialize its elements.

    If you don't provide an initial value then the default one for type T is
    T().

    And writing int() is the same as writing 0. It is an example of *pseudo
    constructor* notation. As I recall, the standard does not define or use
    that term, but does talk about "pseudo destructor" for the corresponding
    notation for destruction (which you can't apply directly to an int).

    So, it's not compiler specific behavior that you're seeing.

    The initialization is guaranteed by std::vector, and the particular
    value for the int type, namely 0, is specified elsewhere in the standard.


    Cheers & hth.,

    - Alf
    Alf P. Steinbach, Feb 19, 2012
    #2
    1. Advertising

  3. Stanley Rice

    Goran Guest

    On Feb 19, 7:33 am, Stanley Rice <> wrote:
    > I want to know the *default constructor* for the POD type. Since STL
    > implement some of the function based on the type of the paramter, fill_n
    > for example, may have different implementation, one for the POD type, where
    > no constructor will be called, and other for non-POD type. So I wrote the
    > code:
    >     vector<int> vec(5);
    > and follow the debugger. Finlly, I come across a function:
    >
    > template<typename _OutputIterator, typename _Size, typename _Tp>
    >   inline typename
    >   __gnu_cxx::__enable_if<__is_scalar<_Tp>::__value, _OutputIterator>::__type
    >   __fill_n_a(_OutputIterator __first, _Size __n, const _Tp& __value)
    >   {
    >     const _Tp __tmp = __value;
    >     for (; __n > 0; --__n, ++__first)
    >       *__first = __tmp;
    >     return __first;
    >   }
    >
    > which is defined in stl_algobse.h. I print out the value of the parameter
    > *__value* and the result is:
    >     (const int &) @0xbffff338: 0
    > and the value of __tmp is: 0
    >
    > I didn't initialize the __value, so I think the value of variable __value
    > should be *random*, just like a normal variable definition without
    > initializaion. But, here the value is always 0, Why?


    Seeing that I am the one who said to step through with debugger in
    another thread, it's my fault for what you did ;-).

    However, in that thread, you said that you wanted to know _how_ STL is
    implemented, but here, the question is _what_ STL should be doing. And
    for that, you read the documentation ;-).

    Basically, when resizing (even during construction), vector default-
    initializes it's elements. For "primitive" types, that means setting
    to 0.

    As Alf hinted, C++ can do this:

    int i; // i==random memory contents. Primitive and POD types can start
    their life like this, uninitialized.

    and this:

    int i(); // i==0. This is default initialization.

    Goran.
    Goran, Feb 19, 2012
    #3
  4. Stanley Rice

    Melissa Guest

    On Sun, 19 Feb 2012 09:20:20 -0800 (PST)
    Goran <> wrote:

    >
    > int i(); // i==0. This is default initialization.


    It looks like function declaration...
    Melissa, Feb 19, 2012
    #4
  5. Hi Goran

    Goran wrote:

    > As Alf hinted, C++ can do this:
    >
    > int i; // i==random memory contents. Primitive and POD types can start
    > their life like this, uninitialized.
    >
    > and this:
    >
    > int i(); // i==0. This is default initialization.


    Not true, that is a function declaration not an initialization.

    int i = 0;
    will initialize i to 0

    and if You have more then on:

    int i[10] = {0};
    now they are all initialized to 0

    Best regards
    Asger-P
    Asger Joergensen, Feb 19, 2012
    #5
  6. On 19.02.2012 18:20, Goran wrote:
    >
    > As Alf hinted, C++ can do this:
    >
    > int i; // i==random memory contents. Primitive and POD types can start
    > their life like this, uninitialized.
    >
    > and this:
    >
    > int i(); // i==0. This is default initialization.


    Well, it would be, except that that latter is a function declaration.

    It's "the most vexing parse" of C++.

    However,

    int i = int();

    initializes i with the int default value.

    Which is not quite the same as the /formal/ term "default
    initialization" means, but near enough: it's initialization, and it's
    the default value. :)


    Cheers & hth.,

    - Alf
    Alf P. Steinbach, Feb 19, 2012
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ajax Chelsea

    Is array of POD still a POD type?

    Ajax Chelsea, Dec 1, 2003, in forum: C++
    Replies:
    1
    Views:
    336
    Ron Natalie
    Dec 1, 2003
  2. Aire
    Replies:
    3
    Views:
    457
    Mike Wahler
    Jan 25, 2004
  3. Generic Usenet Account
    Replies:
    10
    Views:
    2,204
  4. George2

    constructor for POD types?

    George2, Mar 13, 2008, in forum: C Programming
    Replies:
    0
    Views:
    312
    George2
    Mar 13, 2008
  5. Himanshu Garg
    Replies:
    1
    Views:
    152
    Himanshu Garg
    Sep 21, 2003
Loading...

Share This Page