Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: C++
Expertise: All
Mar 23, 2000

Ensuring Proper Initialization of Template Arguments

In the following template member function, the parameter T can be a class or a built-in type:

 
  void vector< T >::resize (size_type new_size)
  {
     T val; // oops! What if T is a built-in type?
     if (new_size > size())
       insert(end(), new_size - size(), val);
     else 
    // ..more stuff
  }

This code has a subtle bug. If T happens to be a built-in type, e.g., int, the variable val has a garbage value. On the other hand, if T is a class with a user-defined default constructor, the constructor will be invoked automatically and initialize val. To ensure that val is always properly initialized, regardless of its type, change the first line in resize() to the following:

 
  T val = T(); // ensure proper initialization

This way, you guarantee that val is zero-initialized if it's a built-in type. If, however, T is a class, the compiler will call val's default constructor. Note that for class types, the following declarations are identical:

 
  T val = T();
  T val;

Both ensure that the default constructor is invoked; they differ only when T is a built-in type.

Danny Kalev
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date