Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
静态对象是如何初始化的,它们是类的成员,并且与它们所在的类具有相同的类型? < 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; }_C++_Static Members - Fatal编程技术网

静态对象是如何初始化的,它们是类的成员,并且与它们所在的类具有相同的类型? < 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; }

静态对象是如何初始化的,它们是类的成员,并且与它们所在的类具有相同的类型? < 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; },c++,static-members,C++,Static Members,程序编译良好,输出5,5,0。这意味着当在构造函数中时,由于没有提供最后一个参数,yy是0,default_date.y应该得到default_date.y,结果是它是0。对我来说,这只有在声明default\u date时将default\u date的成员设置为0,并在定义default\u date时更改时才有意义。如果这是真的,那么为什么我们必须定义默认日期,为什么我们不能将其保留为0,0,0?default\u date是一个date对象,它是date类的静态成员。这就是为什么它的定义

程序编译良好,输出5,5,0。这意味着当在构造函数中时,由于没有提供最后一个参数,yy是0,default_date.y应该得到default_date.y,结果是它是0。对我来说,这只有在声明default\u date时将default\u date的成员设置为0,并在定义default\u date时更改时才有意义。如果这是真的,那么为什么我们必须定义默认日期,为什么我们不能将其保留为0,0,0?

default\u date
是一个
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\u Date.y
分配给自己。为什么这个值为0?它不应该被取消初始化吗?实际上,静态对象将在进行任何其他初始化之前进行零初始化。因此,构造函数运行之前,
default\u date
的成员都将设置为0。

default\u date
是一个
date
对象,它是
date
类的静态成员。这就是为什么它的定义前面有两个日期:

        qualified id
     vvvvvvvvvvvvvvvvvv
Date Date::default_date(16,12,1770);
^^^^ ^^^^
 |     default_date is a member of Date
 |
The type of default_date
// 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);
通过从定义中删除年份,
Date
构造函数将把
default\u Date.y
分配给自己。为什么这个值为0?它不应该被取消初始化吗?实际上,静态对象将在进行任何其他初始化之前进行零初始化。因此,在构造函数运行之前,
default\u date
的成员都将设置为0

// 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);
您在示例中看到的内容与上面的第二种形式类似,只是它位于类中,因此需要包含范围

如果这是真的,那么为什么我们必须定义默认日期,为什么我们不能将其保留为0,0,0

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

您在示例中看到的内容与上面的第二种形式类似,只是它位于类中,因此需要包含范围

如果这是真的,那么为什么我们必须定义默认日期,为什么我们不能将其保留为0,0,0


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

您可以定义它(0,0,0);它应该编译得很好,没有任何错误。这本书可能是想说明,如果不使用
设置默认值
,则值将是
(16,121770)
作为
默认日期的第一时间值
。编辑:(16,121770)可能是该日期的默认最低值;如果您输入(0,0,0),但不使用
set\u default
,则表示某人处于零年、零月和零日。因此,在上下文中,使用(0,0,0)是没有意义的;我知道你可以定义它(0,0,0),但是如果它已经是(0,0,0),为什么不定义它会产生错误?@Gasim他们的问题是构造函数没有
y=default\u date.y当年份被指定为
0
,这依赖于已设置的
默认日期.y
。哦,这是因为类的所有实例都使用了静态变量,因此只能定义一次。有一个全局变量在所有类之间共享。因此,您需要通过在源文件中定义来告诉链接器“此对象已定义”。也许这会有帮助:“当我们在这里的时候,有人能告诉我为什么之前有两次约会,而不是一次吗?”我不明白dyp的答案。这不是构造函数定义。它看起来更像一个全局实例,但该类型存在于全局实例的实例名称中。我也认为这令人困惑。我认为OP询问的是“Date Date::default_Date(16,121770);”您可以定义它(0,0,0);它应该编译得很好,没有任何错误。这本书可能是想说明,如果不使用
设置默认值
,则值将是
(16,121770)
作为
默认日期的第一时间值
。编辑:(16,121770)可能是该日期的默认最低值;如果您输入(0,0,0),但不使用
set\u default
,则表示某人处于零年、零月和零日。因此,在上下文中,使用(0,0,0)是没有意义的;我知道你可以定义它(0,0,0),但是如果它已经是(0,0,0),为什么不定义它会产生错误?@Gasim他们的问题是构造函数没有
y=default\u date.y当年份被指定为
0
,这依赖于已设置的
默认日期.y
。哦,这是因为类的所有实例都使用了静态变量,因此只能定义一次。有一个全局变量在所有类之间共享。因此,您需要通过在源文件中定义来告诉链接器“此对象已定义”。也许这会有帮助:“当我们在这里的时候,有人能告诉我为什么之前有两次约会,而不是一次吗?”我不明白dyp的答案。这不是构造函数定义。它看起来更像一个全局实例,但该类型存在于全局实例的实例名称中。我也认为这令人困惑。我认为OP询问的是“日期:默认日期(16,121770);”