C++变量的默认初始化规则

定义没有初始化式的变量时,系统有时候会帮我们初始化变量。系统如何初始化取决于变量的类型以及变量定义的位置。

  

  内置类型变量是否自动初始化取决于变量定义的位置。函数体外定义的变量初始成0;函数体内定义的变量不进行自动初始化。除了用作赋值操作的左操作数,其他任何使用未初始化变量的行为都是未定义的,不要依赖未定义行为。

以int类型为例,一段简单的测试代码:

#include <iostream>
using namespace std;

int a;

int main()
{
    int b;

    cout << a << endl;
    cout << b << endl;

    return 0;
}

在VS执行这段代码,输出变量a的值0,同时VS会报错:Run-Time Check Failure #3 — The variable ‘b‘ is being used without being initialized。 变量a被自动初始化为0;变量b未被自动初始化。

  类类型变量在定义时,如果没有提供初始化式,则会自动调用默认构造函数进行初始化(不论变量在哪里定义)。如果某类型没有默认构造函数,则定义该类型对象时必须提供显示初始化式。

一段简单的测试代码(默认构造函数由编译器自动生成):

#include <iostream>
using namespace std;

class testA
{
    public:
        void printf() const
        {
            cout << data << endl;
        }
    private:
        int data;
};

testA a;

int main()
{
    testA b;

    a.printf();
    b.printf();

    return 0;
}

 在VS执行这段代码,得到以下结果:

  编译器自动生成的默认构造函数使用与变量初始化相同的规则来初始化数据成员。对象a在函数体外定义,其int类型数据成员被初始为0;对象b在函数体内定义,合成默认构造函数不会对其进行初始化(符合内置类型变量初始化规则),其中存放的都是随机值。同样,如果数据成员是类类型,则会调用相应的默认构造函数对数据成员进行初始化。

  如果稍微改变一下这个类的定义,定义一个构造函数以阻止编译器自动生成默认构造函数:

#include <iostream>
using namespace std;

class testA
{
    public:
        testA(int a)
        {
            data = a;
        }

        void printf() const
        {
            cout << data << endl;
        }
    private:
        int data;
};

testA a;

int main()
{
    testA b;

    a.printf();
    b.printf();

    return 0;
}

  这段代码无法通过编译:error C2512: “testA”: 没有合适的默认构造函数可用。

  定义数组时,如果没有显示提供初始化列表,则数组元素的自动化初始规则同普通变量一样:函数体外定义的内置类型数组,其元素初始为0;函数体内定义的内置类型数组,其元素无初始化;类类型数组无论在哪里定义,皆调用默认构造函数进行初始化,无默认构造函数则必须提供显示初始化列表。

  如果定义数组时,仅提供了部分元素的初始列表,其剩下的数组元素,若是类类型则调用默认构造函数进行初始,若是内置类型则初始为0(不论数组定义位置)。

  对于动态分配的数组,如果数组元素是内置类型,其元素无初始化;如果数组元素是类类型,依然调用默认构造函数进行初始化。也可以在使用跟在数组长度后面的一对空圆括号对数组元素做值初始化。

  例如: int *ptrA = new int[10];

      int *ptrB = new int[10] ();

  其中ptrA指向的动态数组其元素未初始化,而ptrB指向的动态数组元素被初始化为0。

  

  对于动态分配的单个对象,可使用直接初始化的语法规则在定义时显示初始化。如果不提供显示初始化式,动态创建的对象与在函数内部定义的变量初始化方式相同(即:内置类型无初始化,类类型调用默
认构造函数进行初始化)。

粘贴自:https://www.cnblogs.com/FoxShark/p/5802239.html

原文地址:https://www.cnblogs.com/youpeng/p/10686132.html

时间: 2024-08-29 19:15:36

C++变量的默认初始化规则的相关文章

c++ 变量定义 的初始化规则

当定义没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化.至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量.            1]内置类型变量的初始化           内置变量是否自动初始化,取决于该变量定义的位置.           ①在全局范围内的内置类型变量均被编译器自动初始化为0值 1 #include<iostream> 2 3 using namespace std; 4 5 //

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

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

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

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

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

当定义没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化.至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量. 1]内置类型变量的初始化     内置变量是否自动初始化,取决于该变量定义的位置.     ①在全局范围内的内置类型变量均被编译器自动初始化为0. #include<iostream> using namespace std; //全局范围内的部分内部变量 int gi; //被自动初始化为0 f

C++ 变量初始化规则

 定义没有初始化式的变量时,系统有时候会帮我们初始化变量.系统如何初始化取决于变量的类型以及变量定义的位置. 内置类型变量是否自动初始化取决于变量定义的位置.函数体外定义的变量初始成0:函数体内定义的变量不进行自动初始化.除了用作赋值操作的左操作数,其他任何使用未初始化变量的行为都是未定义的,不要依赖未定义行为. 以int类型为例,一段简单的测试代码: #include <iostream> using namespace std; int a; int main() { int b; cou

C++ 变量默认初始化

std::string 默认初始化为null.因为string 类型本身接受无参初始化. 而对于内置类型int, C++ 规定,全局变量global_int 会被初始化为 0. 在main函数内部的 local_int 不会被初始化. 在使用为被初始化的变量是会有runtime error. 1 int global_int; 2 3 int main(void) 4 { 5 int local_int; 6 std::cout << global_int; // ok ,global 变量被

C/C++变量的自动初始化——重要

对于内置变量的自动初始化 代码1: #include<stdio.h> #define CONST 100 int *p1; int a[2]; int b; static int c; main() { int d; static int e; int f[2]; int *p2; printf("CONST=%d\n",CONST); printf("a[0]=%d\n",a[0]); //printf("*p1=%d\n",*p

4.PL_SQL——变量声明以及初始化,字符串分隔符

一.变量的作用 PL/SQL既然是编程语言,就必然会用到变量.和其他程序语言类似,PL/SQL中的变量主要有以下作用:1. 用来临时的存放数据:2.用来操作数据:3. 重复使用数据. 例如上一节中举的例子,就用到了变量: DECLARE v_fnameVARCHAR2(20); -- 声明变量 BEGIN SELECT first_name INTO v_fname -- 将SELECT语句查询到的数据存放到变量v_fname中 FROM employees WHERE employee_id

5、接口初始化规则和类加载、连接、初始化案例剖析

5.1.接口初始化规则 在了解接口的初始化规则前,先搞清类的初始化规则. 当java虚拟机初始化一个类时,会先初始化它的所有父类.但是这条规则并不适用于接口. 在初始化一个类时,并不会先初始化它所实现的接口: 在初始化一个接口时,并不会先初始化它的父接口: 使用一句话总结:实现类或者子接口的初始化并不会导致父接口的初始化. 只有当程序首次主动使用特定接口的静态变量(运行期常量)时,才会导致接口的初始化.这里需要注意的是接口中定义的变量都是常量,而常量又分为编译期常量和运行期常量,编译期常量的值在