C++变量初始化规则

简介:
下面为大家简单地讲解一下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;
}                 
     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733279,如需转载请自行联系原作者

相关文章
|
30天前
|
存储 算法 数据库
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
【C++ 软件设计思路】学习C++中如何生成唯一标识符:从UUID到自定义规则
106 0
|
1月前
|
存储 C++ 容器
学会在 C++ 中使用变量:从定义到实践
C++中的变量是数据容器,包括`int`、`double`、`char`、`string`和`bool`等类型。声明变量时指定类型和名称,如`int myNum = 15;`。`cout`与`&lt;&lt;`用于显示变量值。常量用`const`声明,值不可变。变量名应唯一,遵循特定命名规则,常量声明时需立即赋值。
113 1
|
1月前
|
编译器 C++
C++ 双冒号::开头的语法,::变量名,获取全局作用域变量
C++ 双冒号::开头的语法,::变量名,获取全局作用域变量
17 0
|
1月前
|
自然语言处理 编译器 C语言
【C++ 20 新特性】参数包初始化捕获的魅力 (“pack init-capture“ in C++20: A Deep Dive)
【C++ 20 新特性】参数包初始化捕获的魅力 (“pack init-capture“ in C++20: A Deep Dive)
40 0
|
1月前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
25 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
1月前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
41 0
|
3天前
|
编译器 C++
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
【C++基础(八)】类和对象(下)--初始化列表,友元,匿名对象
|
9天前
|
编译器 C++
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
C++编程之美:探索初始化之源、静态之恒、友情之桥与匿名之韵
21 0
|
18天前
|
存储 程序员 编译器
C++注释、变量、常量、关键字、标识符、输入输出
C++注释、变量、常量、关键字、标识符、输入输出
|
1月前
|
安全 算法 编译器
【C++ 基础 ()和{}括号】深入探索 C++ 的变量初始化:括号和大括号的奥秘
【C++ 基础 ()和{}括号】深入探索 C++ 的变量初始化:括号和大括号的奥秘
40 0