[c++]之static
有该类型实例化的所有对象,共享系统为静态成员分配的一个存储空间,而这个存储空间是程序执行main函数之前分配的,在实例化对象时不在为静态成员分配空间。结论:错误的代码,静态变量只能在类外进行初始化,但是他不可以使用构造函数进行初始化,原因:如果你在main中创建了多个对象,他们都会调用构造函数,那么这就会违背静态成员只初始化一次的特点。5.含有静态成员变量的类的大小,它是不计算静态成员变量的大小的
在类的设计中,用关键字static修饰的数据成员为静态数据成员。有该类型实例化的所有对象,共享系统为静态成员分配的一个存储空间,而这个存储空间是程序执行main函数之前分配的,在实例化对象时不在为静态成员分配空间。
二、C语言和c++中的static的区别
c语言:
有static和无static的区别
jie结结论:加static的变量只在本文件有效
若想要在其他文件使用,需要加extern
结论:对于const int num,这个全局变量,你想要在其他中使用extern时不通过的。在 C++ 中,全局 const 变量默认是 文件内可见 的(相当于隐式添加了 static),这意味着:即使在 a.cpp 中定义 const int num = 10;,其他文件(如 b.cpp)直接用 extern const int num; 声明也无法访问,因为 num 被限制在 a.cpp 中。只有这样才可以:在a.cpp中写为extern const int num=0,那么在b.cpp中就可以使用extern const int num了。
二、c++中的static的特性
1.只在第一次进入函数时初始化一次,后续调用会跳过初始化。
#include <iostream>
using namespace std;
void func(int x)
{
int num = x;
static int val = x;
num += 1;
val += 1;
cout << "num: " << num << " val: " << val << endl;
}
int main()
{
for (int i = 5; i > 0; --i)
{
func(i);
}
return 0;
}
运行结果:
2.编译器怎么知道这个static修饰的变量被初始化一次?
答:它会加一个标记tag,先将这个标记置为0,如被初始化就将0变为1
#include <iostream>
using namespace std;
void func(int x)
{
int num = x;
static int val = x;
static int sum = 10;
cout << "num: " << num << " val: " << val << " sum: " << sum << endl;
}
int main()
{
func(10);
func(20);
return 0;
}
结论1:静态变量只被初始化一次,当第一次调用func函数的时候静态变量val已经被确定好了,就是10,当第二次第哦啊用func函数的时候,并不会进程重新初始化;
结论2:静态变量用字面常量赋值,在汇编的时候不会有对应的指令。
3.静态类成员变量(属于类,而非对象)
3.1存储:所有类对象共享同一份数据,不占用对象的内存空间。
#include <iostream>
using namespace std;
class Circle {
public:
double radus;
static double pi;
public:
Circle(double r = 0) : radus(r) {}
};
double Circle::pi = 3.14;
int main() {
Circle c1, c2, c3, c4;
cout << sizeof(c1) << endl;
return 0;
}

结论:我们可以看出这四个对象,他们都没有pi,这个静态成员是被所有对象所共享的。
类里面的静态成员时所有对象所共有的,并不是某个对象独有的。
因此在计算这个类的大小的时候,并不会把这个静态成员的大小计入,含有静态成员变量的类的大小,它是不计算静态成员变量的大小的,因为它处于数据区,是所有对象所公有的,不是某个对象的所属。
3.2
初始化:必须在类外单独初始化(类内仅声明)。
访问:可通过 类名::变量名 或 对象.变量名 访问。
结论:错误的代码,静态变量只能在类外进行初始化,但是他不可以使用构造函数进行初始化,原因:如果你在main中创建了多个对象,他们都会调用构造函数,那么这就会违背静态成员只初始化一次的特点。但是可以在构造函数中进行赋值。
4.一般会把static修饰的变量加const
5.静态成员不具有this指针,没有 this 指针,只能访问静态成员变量 / 函数,不能访问非静态成员。除非你传入一个对象,间接的访问这个非静态成员。
9.静态方法的用途:
9.1单例模式的三种类型:
更多推荐



所有评论(0)