C++中不同变量的初始化规则

当定义没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化。至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量。

1】内置类型变量的初始化
     内置变量是否自动初始化,取决于该变量定义的位置。
     ①在全局范围内的内置类型变量均被编译器自动初始化为0。

#include<iostream>
using namespace std;
//全局范围内的部分内部变量
int gi;  //被自动初始化为0
float gf;  //被自动初始化为0.0
double gd;  //被自动初始化为0.0
char gc;  //被自动初始化为‘\0‘
int main(int argc, char **argv)
{
  return EXIT_SUCCESS;
}

  ②在函数体内定义的内置类型变量值随机(有的编译器可能会为你初始化为0,但千万别依赖于这种可能行为,因为它会给你的程序带来未定义的行为)

#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
  //局部范围内的部分内部变量
  int i;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
  float f;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
  double d;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
  char c;  //不被自动初始化,值随机(有可能是0,依编译器实现而定)
  return EXIT_SUCCESS;
}

  ③内置类型数组的初始化规则同上

#include<iostream>
using namespace std;
//全局范围内的内置类型数组
int gIntArr[5];  //5个元素都被初始化为0
int main(int argc, char **argv)
{
  //局部范围内的内置类型数组
  int intArr[5];  //未被初始化
  return EXIT_SUCCESS;
}

  2】类类型变量的初始化
          类类型变量是通过构造函数进行初始化的,不论类类型变量在哪里(全局或者局部)定义,该类类型变量的构造函数(默认构造函数或者指定的带参构造函数)总会被调用。想要知道构造函数在各种情况下如何初始化类中数据成员的,我们必须首先了解构造函数的初始化发生在何时。

//构造函数中的初始化发生在构造函数的初始化列表中
//而非构造函数体中
class Foo
{
  public:
    Foo(int i):_integer(i)  //初始化列表中进行的是初始化
    {
      //这里是构造函数的函数体
      //在这里进行的是赋值操作,而不是初始化
      _integer = i;
    }
  private:
    int _integer;
};

  现在我们知道,构造函数的初始化是发生在初始化列表中的,那么,对于初始化列表中没有显示进行初始化的内置类型变量来说,其初始化规则就与上述内置类型变量的规则相同了。下面我们就一起来探索这个问题:

#include<iostream>
using namespace std;
class Foo
{
  public:
    Foo(void):_explicitInit(1024){}
  private:
    int _explicitInit;  //在构造函数初始化列表中
                        //显式初始化的内置类型变量
    int _implicitInit;  //没有在构造函数中显式初始
                        //化的内置类型变量
};
Foo gF;  //全局范围内的类类型变量,_explicitInit被
         //显式初始化为1024,_implicitInit被自动初始
         //化为0
int main(int argc, char **argv)
{
  Foo f; //局部范围的类类型变量,_explicitInit被
         //显式初始化为1024,_implicitInit不会被
         //自动初始化,值随机
  return EXIT_SUCCESS;
}

  来自http://billhoo.blog.51cto.com/2337751/733279

时间: 2024-12-06 10:10:25

C++中不同变量的初始化规则的相关文章

关于C#中编译器保证变量必须初始化规则猜想

现在两种情况: 第一种情况: using System; namespace Wrox { public class Program { static void Main(string[] args) { int index; if(true) { index = 100; } Console.WriteLine(index); Console.ReadKey(); } } } 第二种情况: using System; namespace Wrox { public class Program

关于C#中的变量的初始化问题浅谈

C#变量初始化是C#强调安全性的另一个例子.简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量.大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待.这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值. C#变量初始化的操作中有两个方法可确保变量在使用前进行了初始化: ◆变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其值就默认是0(类和结构在后面讨论). ◆方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值.此

C++类中成员变量的初始化总结

1. 普通的变量:      一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行. 1 class CA  2 {  3 public:  4      int data;  5 public:  6      CA();  7 };  8     9 CA::CA():data(0) //……#1……初始化列表方式 10 { 11     //data = 0;//……#1……赋值方式 12 }; 2.static 静态变量:       sta

C#中的变量及命名规则

变量: 1.作用 :可以让我们在计算机中存储数据 2.语法:变量类型    变量名=赋值: 3.常用的数据类型:  int   整数类型  取值范围:最大2147483647;最小-2147483648 double   小数类型  取值范围:最大 1.79769e+308;最小-1.79769e+308 string    字符串  "    " char    字符   ' ' decimal    金钱类型 bool   我们用bool类型来描述对或者错. true    对 f

【转】Java类成员变量默认初始化规则

一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: ----------------------------------------------------------------------------------------- Boolean false Char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d -----------------------

关于case语句中声明变量并初始化的注意事项

今天看到一句对这个问题特别精辟的总结,记录如下: It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps from a point where a local variable with automatic storage duration is not in scope to a point whe

C++类中静态变量和普通变量的区别

静态变量: 1.静态变量会被编到程序的exe里面,从程序启动到结束,它一直存在: 2.静态变量的初始化值为0: 3.全局变量默认是静态变量: 4.在类中的函数变量前面加了static的也是静态变量,只不过被语言限定在只能在函数内部使用: 5.在有MFC对话框的程序了,如果一个变量和对话框绑定,那么该变量就不能声明为静态变量,函数也是一样的,因为声明为静态变量后不能随时接受对话框内的值,    主要是因为静态变量的值设置后是不能被修改的: 6.可以使用类名+静态成员名访问此静态成员,因为静态成员存

C++ 初始化形式、变量初始化规则、类构造函数的初始化列表

类构造函数的初始化列表,举例 一个对象的构造分两部分,首先是分配空间,然后初始化. 只要有对象生成,不管是以什么形式生成,都会调用构造函数进行初始化. 然后下面有个例子,在蓝色区域Big类的复制构造函数中,使用初始化列表进行成员的初始化(方法1)没有问题,而如果不使用初始化列表.直接在函数里用里面注释掉的代码(方法2)则会报错:Base类没有合适的构造函数. // W3-课程作业2-4.cpp : Defines the entry point for the console applicati

C++11中的变量初始化

变量初始化很简单嘛,有什么难的? 打住,不要骄傲,往下看,你会哭的. 请看下面四个问题: 1: 下面的语句有不同吗?不同在哪里? widget w;                   // a widget w();                 // b widget w{};                 // c widget w(x);                // d widget w{x};                // e widget w = x;