By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,543 Members | 2,220 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,543 IT Pros & Developers. It's quick & easy.

Build-in types initialization

P: n/a
Hi,

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

Is the above true?

Jul 22 '05 #1
Share this Question
Share on Google+
8 Replies


P: n/a

"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
Hi,

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

Is the above true?


Yes
Jul 22 '05 #2

P: n/a

"Sharad Kala" <no*****************@yahoo.com> wrote in message
news:c1*************@ID-221354.news.uni-berlin.de...

"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
Hi,

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

Is the above true?


For more on this read an ongoing thread on c.l.c++.moderated "int(), float(),
bool()".
Jul 22 '05 #3

P: n/a
"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
| 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
--
http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form
Jul 22 '05 #4

P: n/a
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" <no*****************@yahoo.com> napisał w
wiadomości news:c1*************@ID-221354.news.uni-berlin.de...

"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
Hi,

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

Is the above true?


Yes

Jul 22 '05 #5

P: n/a

"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
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
}
Jul 22 '05 #6

P: n/a
Sharad Kala wrote:
...
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.

--
Best regards,
Andrey Tarasevich

Jul 22 '05 #7

P: n/a
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" <no*****************@yahoo.com> napisał w
wiadomości news:c1*************@ID-221354.news.uni-berlin.de...

"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
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
}

Jul 22 '05 #8

P: n/a

"Marcin Kalicinski" <ka****@poczta.onet.pl> wrote in message
news:c1**********@korweta.task.gda.pl...
Hi, 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
}
Jul 22 '05 #9

This discussion thread is closed

Replies have been disabled for this discussion.