旅游网站的设计与实现开题报告,湖南平台网站建设推荐,织梦只显示网站首页,网站个人博客怎么做当我们如下声明了一个类#xff1a;
class A{public:static int sti_data;// 这个语句在c11前不能通过编译#xff0c;在c11的新标准下#xff0c;已经能够在声明一个普通变量是就对其进行初始化。int a 10#xff1b;static const int b 1;//...其他member
};// 在类外…当我们如下声明了一个类
class A{public:static int sti_data;// 这个语句在c11前不能通过编译在c11的新标准下已经能够在声明一个普通变量是就对其进行初始化。int a 10static const int b 1;//...其他member
};// 在类外定义静态成员变量并分配内存
int A::sti_data 10;
上述的类只是声明了而已并不是在系统中实际存在要使用一个类必须在系统中分配内存也就是实例化出一个对象比如
int main () {A a;
}
为了明白为什么类的非const静态变量一定要在类的外边定义
首先需要搞清楚文件中的类A的写法只是声明类A实现形式在我们没有实例化一个类对象前系统中不存在分配给类A的内存。同理我们实例化了N个类A的对象系统分配了N个A大小的内存。其次静态数据成员是一个类共有的而不是一个对象独有整个程序中只有一份静态数据成员的内存。假如我们不对静态成员变量进行与普通成员变量不同的处理而是一样能在类的声明里事先定义并初始化好静态成员变量也就是声明时给定一个初始值等真正实例化一个对象时便用事先给定的初始值初始化这个变量:static int sti_data 1;这意味着每个我们实例化的类对象都存在一个分配给静态成员变量的内存这将导致在内存中存在多个同名的静态变量这与静态变量的唯一性矛盾必然编译不通过。从实现来看编译器确实能做到每次实例化一个类对象时判断类中的静态变量是否已经定义过但很显然这么做的成本太高还不如直接强制要求不能在类中对非const静态变量进行定义并初始化而是只能声明。至于为什么const静态变量能够在类内直接定义因为static const 成员变量会被编译器优化为编译期常量编译器不会为其分配内存更像是宏定义那样在编译期时在使用它的地方用它的值替换它这一点可以通过代码看到若我们在类中定义一个static const 成员变量我们可以打印出它的值却不能打印出它的地址因为编译器并没有给它分配内存。因此c要求非const静态变量一定要在类外定义。
为什么普通或类的函数里的静态变量能够事先初始化 这个问题主要时为了与第一个问题进行对比加深理解。 原因很简单每个的函数无论是否静态是否是成员函数还是普通函数程序在编译时会给每个函数分配内存同时一个函数在程序里只有一份内存这与类在实例化一个对象时才分配内存是有本质上的区别的。这时对于函数的静态变量而言只需要把静态变量的内存分配到静态区就能做到在程序的生命周期里不随着函数的调用而被构造或者销毁。