Build-in types initialization

M

Marcin Kalicinski

Hi,

void f()
{
int i1; // i1 now holds undefined value
int i2 = int(); // i2 now holds 0
}

Is the above true?
 
I

Ivan Vecerina

| void f()
| {
| int i1; // i1 now holds undefined value
| int i2 = int(); // i2 now holds 0
| }
|
| Is the above true?

Yes.
This is useful to know and use especially in generic code:
T val = T(); // ensures that built-ins also get initialized

Consider also default-parameter values:
vector(size_type n, const T& v = T(), const A& al = A());


Regards,
Ivan
 
S

Sharad Kala

For more on this read an ongoing thread on c.l.c++.moderated "int(), float(),
bool()".
 
M

Marcin Kalicinski

Hi all,

Thanks for your answer, but if it is true, how do I define my custom class
so that it follows the same schema? It seems impossible, because there's no
way to distinguish between these 2 types of initialization when writing
class definition. Both are handled by default constructor.

To be specific, I'd like to define class Vector3, which is a 3 dimensional
vector. If I initialize coordinates to zeroes in default constructor, I get
behavior 'i2'. If I do not initialize, I get behavior 'i1'. But I'd like to
get both if them, so that Vector3 does not differ in this important point
from built-in types. Additionally, Vector3 is to be used in
performance-critical code, so I'd like to avoid unnecesary initialization if
possible - so 'i1' behavior is probably a must to have.

Best regards,
Marcin

U¿ytkownik "Sharad Kala" <[email protected]> napisa³ w
wiadomoœci
Marcin Kalicinski said:
Hi,

void f()
{
int i1; // i1 now holds undefined value
int i2 = int(); // i2 now holds 0
}

Is the above true?

Yes
 
S

Sharad Kala

Marcin Kalicinski said:
Hi all,

Thanks for your answer, but if it is true, how do I define my custom class
so that it follows the same schema? It seems impossible, because there's no
way to distinguish between these 2 types of initialization when writing
class definition. Both are handled by default constructor.

To be specific, I'd like to define class Vector3, which is a 3 dimensional
vector. If I initialize coordinates to zeroes in default constructor, I get
behavior 'i2'. If I do not initialize, I get behavior 'i1'. But I'd like to
get both if them, so that Vector3 does not differ in this important point
from built-in types. Additionally, Vector3 is to be used in
performance-critical code, so I'd like to avoid unnecesary initialization if
possible - so 'i1' behavior is probably a must to have.

You got it wrong.
The default constructor for int, float, bool initializes them to 0 /false.
But that does not mean that ints, floats etc in UDTs will also be default
initialized in the default constructor.

In this code -

#include <iostream>
using namespace std;
struct A{
int i;
A(){}
A(int I):i(I){}
};

int main(){

A a1 = A(); // Default const
cout << a1.i; // Print garbage..don't expect 0
A a2(10);
cout << a2.i; // Print 10
}
 
A

Andrey Tarasevich

Sharad said:
...
The default constructor for int, float, bool initializes them to 0 /false.
But that does not mean that ints, floats etc in UDTs will also be default
initialized in the default constructor.
...

There are different ways to formalize this behavior of scalar (and POD)
types in C++, but the standard way is to assume that scalar types have
no constructors at all, which is what C++ standard says.
 
M

Marcin Kalicinski

Hi,

A a1 = A(); // Default const
cout << a1.i; // Print garbage..don't expect 0

The above is true. But if we replace A with a built-in type, say int, its
value will be initialized by 1st line. I'm worried, because this makes
user-defined types inferior in some way to built-in types. At least it makes
them behave differently, as there's no way to distinguish between these 2
construction types (available with built-in types):

1. Construct and leave members uninitialized
2. Construct and initialize members to default values, specific for each
member

Or at least there's no elegant way (by elegant I mean the way built-in types
are initialized).

Marcin


U¿ytkownik "Sharad Kala" <[email protected]> napisa³ w
wiadomoœci
Marcin Kalicinski said:
Hi all,

Thanks for your answer, but if it is true, how do I define my custom class
so that it follows the same schema? It seems impossible, because there's no
way to distinguish between these 2 types of initialization when writing
class definition. Both are handled by default constructor.

To be specific, I'd like to define class Vector3, which is a 3 dimensional
vector. If I initialize coordinates to zeroes in default constructor, I get
behavior 'i2'. If I do not initialize, I get behavior 'i1'. But I'd like to
get both if them, so that Vector3 does not differ in this important point
from built-in types. Additionally, Vector3 is to be used in
performance-critical code, so I'd like to avoid unnecesary initialization if
possible - so 'i1' behavior is probably a must to have.

You got it wrong.
The default constructor for int, float, bool initializes them to 0 /false.
But that does not mean that ints, floats etc in UDTs will also be default
initialized in the default constructor.

In this code -

#include <iostream>
using namespace std;
struct A{
int i;
A(){}
A(int I):i(I){}
};

int main(){

A a1 = A(); // Default const
cout << a1.i; // Print garbage..don't expect 0
A a2(10);
cout << a2.i; // Print 10
}
 
S

Sharad Kala

Marcin Kalicinski said:
Hello,
Please don't top-post.
A a1 = A(); // Default const
cout << a1.i; // Print garbage..don't expect 0

The above is true. But if we replace A with a built-in type, say int, its
value will be initialized by 1st line. I'm worried, because this makes
user-defined types inferior in some way to built-in types. At least it makes
them behave differently, as there's no way to distinguish between these 2
construction types (available with built-in types):

Different, but I don't think that it makes them inferior.
1. Construct and leave members uninitialized

This is your particular need. People usually want to initialize the members of
their class.
Furthermore intialization lists are there so that this happens efficiently.
2. Construct and initialize members to default values, specific for each
member
Or at least there's no elegant way (by elegant I mean the way built-in types
are initialized).

I can think of this solution, probably have a bool value in your constructor
something like -

#include <iostream>
using namespace std;
struct A{
int i;
A(bool init=false):i((init==true)?int():i){}
};

int main(){
A a1 = A(); // Default const
cout << a1.i; // Print garbage
A a2(true); // Iniatialize with defaults
cout << a2.i; // Print 0
}
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,163
Messages
2,570,897
Members
47,434
Latest member
TobiasLoan

Latest Threads

Top