如何初始化静态对象,它们是类的成员以及与它们所在的类型相同的类型?

时间:2014-01-17 18:58:32

标签: c++ static-members

C ++编程语言中的Bjarne Strousrup说明了使用类似于此的代码的类的静态成员:

class Date{
  int d, m, y;
  static Date default_date;
  public:
      Date(int dd=0, int mm=0, int yy=0);
      static void set_default(int, int, int);
      int year()const{return y;}
      int month() const{return m;}
      int day() const {return d;}

};
Date::Date(int dd, int mm, int yy){
d=dd ? dd : default_date.d;
m=mm ? mm : default_date.m;
y=yy ? yy : default_date.y;
}

void f()
{
    Date::set_default(4,5,1945);
}

Date Date::default_date(16,12,1770);


void Date::set_default(int d,int m, int y)
{
    Date::default_date=Date(d,m,y);
}


int main(){


Date ob(5,5);
cout<<ob.day()<<endl<<ob.month()<<endl<<ob.year();


return 0;
}

代码的输出是 五 五 1770

他声明必须在某处定义default_date,因为它是在f()和之间完成的 默认设置。虽然我们在这里可以告诉我为什么它有两个Date之前::而不是一个?

OK default_date可以使用提供的构造函数构造,因为提供了所有参数。

现在我尝试从default_date的参数列表中删除年份:

Date Date::default_date(16,12);

并且程序编译良好,输出为5,5,0。这意味着当在构造函数中时,由于没有提供最后一个参数,因此yy为0而default_date.y应该为default_date.y,结果是0为0.对我来说,这只有在default_date的成员设置为声明default_date时为0,定义default_date时更改。如果这是真的,为什么我们必须定义default_date,为什么我们不能将它留下0,0,0?

2 个答案:

答案 0 :(得分:3)

default_dateDate对象,它是Date类的静态成员。这就是为什么在它的定义前面有两个Date

        qualified id
     vvvvvvvvvvvvvvvvvv
Date Date::default_date(16,12,1770);
^^^^ ^^^^
 |     default_date is a member of Date
 |
The type of default_date

通过从定义中删除年份,Date构造函数将最终为自己分配default_date.y。为什么这个值为0?它不应该是未初始化的吗?实际上,在进行任何其他初始化之前,静态对象将被初始化为零。因此,在构造函数运行之前,default_date的成员都将被设置为0。

答案 1 :(得分:1)

// This is simply how static variables are initialized
// type classname::attributename followed by either = or constructor invocation
Date Date::default_date(16,12,1770);

// two ways of initializing an int in c++
int i = 0;
int i(0);

您在示例中看到的内容类似于上面的第二种形式,除了它在一个类中,因此您需要包含范围。

如果这是真的那么为什么我们必须定义default_date,为什么我们不能将它留下0,0,0?

如果您在具有多个编译单元的大型应用程序中,如果您未在cpp文件中为相应的类声明创建静态初始化程序,则会出现链接器错误。在您的示例中,所有内容都在一个文件中,看起来您不需要这样做。我删除了那一行,它仍然可以用VS2010编译好。

相关问题