C++内置类型的成员变量初始值的问题探讨

最近碰到个问题,C++内置类型的成员变量(如int)的默认初始值到底是多少?

我的开发环境:VIN7 64位,VS2010。

测试代码:

class Solution {
public:
	int a;
	char c;
	static int sb;
};
Solution x;
void main()
{
	Solution s;
	void *pv = operator new(sizeof(Solution));
	Solution *ps = new (pv)Solution();
	Solution *ps2 = new Solution();
	delete ps2;
	ps->~Solution();
	operator delete (ps);
	int a = 0;
	cin >> a;
}

运行后通过监视面板检测变量值如下:

发现全局变量x的内置类型初始化为0,局部变量s的内置变量没有初始化,通过动态创建的ps和ps2都初始化了,类变量sb的值没有初始化。

结果与C++Primer里面的结论一样:

为何动态分配的局部对象会初始化内置变量呢?编译器是个任性的孩子哇。

更加有趣的来了。

然后增加一个类类型的成员变量:

class desT
{
public:
	desT(){ cout << "construct desT"<< endl; }
	int a;
	char c;
	static int sb;
};
class Solution {
public:
	int a;
	char c;
	static int sb;
	desT m_obj;
};
Solution x;
void main()
{
	Solution s;
	void *pv = operator new(sizeof(Solution));
	Solution *ps = new (pv)Solution();
	Solution *ps2 = new Solution();
	delete ps2;
	ps->~Solution();
	operator delete (ps);
	int a = 0;
	cin >> a;
}

运行后通过监视面板检测变量值如下:

输出:

为什么加了一个类成员变量动态创建的对象全部不初始化内置变量了呢?

编译器君你能告诉我吗?

时间: 2024-11-08 16:13:54

C++内置类型的成员变量初始值的问题探讨的相关文章

JavaSE7基础 通过公有的成员方法 去过滤 要赋给私有成员变量的值

版本参数:jdk-7u72-windows-i586注意事项:博文内容仅供参考,不可用于其他用途. 代码 class Test{ private int age;//只能在本类中访问 //公有的成员方法 去过滤 要赋给私有成员变量的值 public void setAge(int age){ if(age<0 || age>120){ System.out.println("年龄赋值有误"); this.age=0; }else { System.out.println(&

java的成员变量默认值

如果我们不做任何初始化工作,变量具有什么默认值,或者是否具有默认值呢?其实,成员变量在创建时,系统会为其分配一个默认值.不同类型的变量,默认值也不相同,下面来看看各种类型的默认值分别是什么. 用例子来说明:先输入一个java代码(这里只包括了实例变量) class Text1 { // 实例成员变量 private boolean bool; private byte b; private short s; private char c; private int i; private long

java基础 javaBean对象成员变量默认值及数组默认值

public class StudentTest { private int id; private String name; int[] arr; public int[] getArr() { return arr; } public void setArr(int[] arr) { this.arr = arr; } public int getId() { return id; } public void setId(int id) { this.id = id; } public St

java 反射 - 获取成员变量的值.

通过反射,可以获取所有声明的成员变量(包括所有的),代码如下: package spt.test.src; public class Person { private String name = "pri_name"; public String id; } 运行测试: package spt.test; import java.lang.reflect.Field; import spt.test.src.Person; class ReflectionTest { @Suppres

C++中如何可以修改const函数内的成员变量的值?

呵呵,你使用mutable关键字来定义变量就可以了.下面举例说明 C++关键字mutable Mutable (1)mutable的意思是“可变的,易变的”,跟C++中的const是反义词. (2)在C++中,mutable也是为了突破const的限制而设置的.被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中 实例说明: 复制代码#include <iostream>using namespace std; class TestMutable{public: Tes

Java成员变量默认值

Java中明确规定:1.如果是引用型的,比如:String,还有类对象,他们的默认值都是:null:2.而如果是值类型:double,int,long,float,char等等,他们都是:0:还有一个,boolean,默认值是:false. Boolean falseChar '\u0000'(null)byte (byte)0short (short)0int 0long 0Lfloat 0.0fdouble 0.0d 如果在一个方法中定义一个变量,java不会给其分配默认值,就必须我们来给他

c# 通过反射输出成员变量以及成员变量的值

/*** @Author rexzhao* 工具类 仅限于* public variable*/using System.Collections;using System.Collections.Generic;using System.Reflection;using System.Text;using UnityEngine;//#if !UNITY_ANDROID && UNITY_EDITOR #if __DEBUGpublic static class ObjectUtils{

java 反射获取设置私有成员变量的值

for (Object arg:args) { //处理applicationCode Class<?> argClass = arg.getClass(); Field applicationCode =null; try { applicationCode =argClass.getDeclaredField("applicationCode"); }catch (NoSuchFieldException e){ } JWTData jwtData = CurrentU

成员变量与局部变量

  初始值 作用域 优先级 成员变量 java会给成员变量一个初始值 受访问控制修饰符影响作用域不同 成员变量与局部变量同名时,优先使用局部变量 局部变量 java不会给局部变量赋初始值 方法内,代码块作用域 初始值比较: 1 public class Var { 2 private static int var1;// 成员变量 3 4 public void method() { 5 int var2;// 局部变量 6 System.out.println(var1);// 编译通过,成员