11. Variables

Rule 38
Variables are to be declared with the smallest possible scope.
Rule 39
Each variable is to be declared in a separate declaration statement.
Rule 40
Every variable that is declared is to be given a value before it is used.
Rule 41
If possible, always use initialization instead of assignment.

A variable ought to be declared with the smallest possible scope to improve the readability of the code and so that variables are not unnecessarily allocated. When a variable that is declared at the beginning of a function is used somewhere in the code, it is not easy to directly see the type of the variable. In addition, there is a risk that such a variable is inadvertently hidden if a local variable, having the same name, is declared in an internal block.

Many local variables are only used in special cases which seldom occur. If a variable is declared at the outer level, memory will be allocated even if it is not used. In addition, when variables are initialized upon declaration, more efficient code is obtained than if values are assigned when the variable is used.

A variable must always be initialized before use. Normally, the compiler gives a warning if a variable is undefined. It is then sufficient to take care of such cases. Instances of a class are usually initialized even if no arguments are provided in the declaration (the empty constructor is invoked). To declare a variable that has been initialized in another file, the keyword extern is always used.

By always initializing variables, instead of assigning values to them before they are first used, the code is made more efficient since no temporary objects are created for the initialization. For objects having large amounts of data, this can result in significantly faster code.

Exception to Rule 38
No exceptions.
Exception to Rule 39
No exceptions.
Exception to Rule 40
No exceptions.
Exception to Rule 41
In certain special cases, a variable is assigned the value of a complicated expression; it may then be unnecessary to give the variable an initial value. See Example 44.

Example 44: Initialization instead of Assignment

   //Do not do this!
   //int i;
   //... 1022 lines of code
   //i = 10;
   
   int j = 10;// Better
   
   class Special//Array of this class is used to initialize{// MyClass::complicated
      public:
         Special();             // Default constructorint isValid() const;
         int value() const;
   };
   
   const int Magic = 1066;
   Special specialInit[Magic];
   
   class MyClass
   {
      public:
         MyClass( const char* init );   // Constructor
   // ...
      private:
         String privateString;
         int complicated;
   };
   
   // Do not do this! Inefficient code.
   // Empty constructor + assignment operator called for privateString
   //
   // MyClass::MyClass( const char* init )
   // {
   //    privateString = init;
   //    ...
   // }
   
   MyClass::MyClass( const char* init ) : privateString( init )    // Better
   {
      // Special case - complicated expression
   
      for( int i = 0; i < Magic; i++ )// No! You should enclose "for"
         if ( specialInit[i].isValid() )// loops in braces! See Rec. 25!
         {
            complicated = specialInit[i].value();
            break;
         }
   }