-
Notifications
You must be signed in to change notification settings - Fork 0
/
static_in_class
75 lines (49 loc) · 3.41 KB
/
static_in_class
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*对象的内存中包含了成员变,不同的对象占用的内存不同,这样使得不同对象相互独立,他们的值不受率影响。
例如有两个对象a、b。它们都有一个成员变量m_name,那么a.m_name的值和b.m_name的值互不影响。
C++中static对象是指存储区
如果希望对个对象之间的数据共享,对象a改变了某份数据后对象b可以检测到。共享数据的典型使用场景就是计数,
还是以Student类为例子,如果要知道有多少名学生,就需要设计一个共享变量,每次创建对象时,都让对象加1.
在C++中,使用静态成员变量来实现对个变量数据共享的目标。静态成员变量是一种特殊的成员变量,它被关键字
static修饰。
定义一个类:
class Student{
publish:
Student(char *name,int age,flaot score);
void show();
public:
static int n_total; //静态成员变量
private:
char *m_name;
char m_age;
float m_scare;
};
这段代码定义了一个成员变量m_total,用来统计学生的人数。
static成员变量属于类,不属于某个具体的对象,即使创建对个对象,也只为m_total分配一份内存,
所以对象使用的都是这份内存中的数据,当某个对象更改了m_total,也会影响其他对象。
static成员变量必须在类声明的外部进行初始化,具体形式:
type class::name= value;
如:int Student::m_total = 0;
静态成员变量初始化不能再加static,并且必须要有数据类型
静态成员变量可以通过类来访问,也可以通过对象来访问,如:
Student :: m_total =10;
Student stu("小明",15,92.5f);
stu.m_total = 20;
通过对象指针:
Student *pstu=nem Student("李华",16,96);
pstu->m_total=20;
这三种方式等效;
static成员变量不占用对象的内存,而是在对象之外开辟内存,即使不创建对象也可以访问。
sttic也要遵循,public,private,protect的访问限制
静态成员函数:
普通成员函数:可以访问所有成员(包括成员变量和成员函数),静态成员函数只能访问静态成员。
编译器编译一个普通的成员函数时,会隐式的增加一个形参this,并把当前对象的地址付给这个this,
所以普通成员函数只能在创建对象后通过对象来调用,因为它需要当前对象的地址。而静态成员函数可以通过类
直接进行调用,编译器不会为他增加形参this,它不需要当前对象的地址,所以不管有没有创建对象,都可以调用
静态成员函数。
普通成员函数必须通过对象才能调用,而静态成员函数没有this指针们可以访问类中的他人以成员;而静态成员函数没有this
指针,只能访问静态成员(包括静态成员变量和静态成员函数)。
C++中,静态成员函数的主要目的就是访问静态成员,和静态成员变量类似,静态成员函数在声明时要加static,
在定义时不能加static。静态成员函数可以通过类来调用(一般是这样),也可以通过对象来调用。
local static和non-local static对象:
C++中的static是指存储区不属于stack和heap,寿命从被构造出来到程序结束为止的对象,定义与namespace作用域的对象,在class/function/file作用域中被声明为
static的对象,其中函数内的static对象称为local static对象.其他static对象称为non-local static对象.