static修饰符的问题

时间:2022-06-20 17:13:55
#include<iostream.h>
class TDate1
{
public:
TDate1(int y,int m,int d);
TDate1()
{
cout<<"Default constructor called.\n";
}
~TDate1();
void Print();
protected:
private:
int year,month,day;
};
TDate1::TDate1(int y,int m,int d)
{
year=y;
month=m;
day=d;
cout<<"Constructor called.\t"<<d<<endl;
}
TDate1::~TDate1()
{
cout<<"Destructor called.\t"<<day<<endl;
}
void TDate1::Print()
{
cout<<year<<','<<month<<','<<day<<endl;
}
void main()
{
// static TDate1 d1;
TDate1 d1;
TDate1 d2(2003,2,8);
cout<<"d1 is ";
d1.Print();
cout<<"d2 is ";
d2.Print();
}

为什么“static TDate1 d1”这句中,不加static,d1的3个数据成员就没有初始化为0,而是一个大负数?

8 个解决方案

#1


实现正确的构造函数,不要老问错误为什么会错误。
你加了static也不确保能初始化为0的。
做正确的事。

#2


加上static的确初始化为0,这是《c++语言程序设计》上的例题。

#3


如果数据成员没有必要设为静态成员就用初始化列表吧

#4


Static可以和字段,属性,方法,构造函数,事件等一起使用,但是不可与索引器,虚构函数,类型一起使用 
被申明为static的方法,属性,字段可以直接被调用而无需创建实例. 
用static修饰的静态构造函数,通常用于初始化静态的数据成员,静态的数据成员与一个类型相关,而不是与类型的一个实例相关.其不允许有访问修饰符. 
静态字段是和类型本身相关的字段,而不是和类型的实例相关的字段. 
静态属性和静态字段和方法一样,静态属性和类型相关,不是和类型的实例相关,他是指引用静态数据的属性,他不能被声明为virtual和abstract. 

#5


静态成员变量的构造和初始化是在程序进入入口函数之前
在进入入口函数之前先由C运行期库初始化全局变量、静态变量  

#6


内存区域不一样
静态的在静态区,程序没执行前就被初始化

#7


编译器会去初始化 static 或者 全局的变量

#8


static对象在data segment里面。

#1


实现正确的构造函数,不要老问错误为什么会错误。
你加了static也不确保能初始化为0的。
做正确的事。

#2


加上static的确初始化为0,这是《c++语言程序设计》上的例题。

#3


如果数据成员没有必要设为静态成员就用初始化列表吧

#4


Static可以和字段,属性,方法,构造函数,事件等一起使用,但是不可与索引器,虚构函数,类型一起使用 
被申明为static的方法,属性,字段可以直接被调用而无需创建实例. 
用static修饰的静态构造函数,通常用于初始化静态的数据成员,静态的数据成员与一个类型相关,而不是与类型的一个实例相关.其不允许有访问修饰符. 
静态字段是和类型本身相关的字段,而不是和类型的实例相关的字段. 
静态属性和静态字段和方法一样,静态属性和类型相关,不是和类型的实例相关,他是指引用静态数据的属性,他不能被声明为virtual和abstract. 

#5


静态成员变量的构造和初始化是在程序进入入口函数之前
在进入入口函数之前先由C运行期库初始化全局变量、静态变量  

#6


内存区域不一样
静态的在静态区,程序没执行前就被初始化

#7


编译器会去初始化 static 或者 全局的变量

#8


static对象在data segment里面。