static的mean->静态
首先要了解一下对象的生存期
- 静态生存期
- 与程序的运行期是一致的,具有全局作用域的
- 只需要在函数体内加关键字static,就变成了整个文件作用域
- 动态生存期
- 起始于你定义的的位置,终止于最近的“}”
下面举半个的栗子
```
void other(){
static int a = 2;//静态局部变量,具有全局作用域,再次进入other()不会再次被初始化了
int b = 4;//动态局部变量,再次进入other()再次被初始化
cout << a << 't' << b << endl;
}
int main(){
static int a;//静态局部变量,具有全局寿命,当然,尽量不要与other()重名
other();
other();//多次调用other()
cout << endl;
return 0;
}
```
我的朱同学这样说的:static其实你可以理解为一个标识符,就是它给一个数据打了标签,说“老子”不是一般的数据,一般人不能改!
我翻译一下文明版本的:设计static,就是为了只可以让指定的函数或者指定的类才可以修改static修饰的变量,然后在main()可以想用就用它。
那么,在类中如何使用static呢?
使用static声明,为所有对象共享的变量,仍是静态生存期,具有全局寿命。
需要注意的是:~声明,要放在类内(.hpp);~定义和初始化,要放在类外(.cpp),记得用(::)指明所属的类。
下面再举半个的栗子
```
class Point {
static int count;//记录点的个数
};
#include "111.hpp"
int point::count = 0;//初始化
Point::~Point(){
count--;
}
```
此处还需要引用朱同学的话:static所修饰的变量,需要专门的函数进行修改;换言之,之所以设定为static,就是不希望别人修改,但是有需要它能够得到改变,不然就直接const常量化。
下面 说一下const
const的mean->常
官方课程称之为共享数据的保护(const修饰,必须进行初始化)(你都不让它再别赋值了,难道还不得给他个初值嘛,是吧)
const也分几类:
- 常对象
- 常成员
- 常函数成员
- 常数据成员
- 常引用
【常对象】顾名思义,就是初始化后不能别你修改的对象成员,学生1(科比,24号,男),科比这个对象就只能别调用,或者拷贝给其他对象。
下面再举半个的栗子 ,说明一下格式规定:
```
class Student {//学生类
};
int main(){
Student const S1(‘科比’, 23, ‘男’);//常对象S1
cout << endl;
return 0;
}
```
【常函数成员】其实,const在这里就是一个C++中的一个审查机制,就是说,我本来让Showinfo()不改变变量的值,const修饰后,编译器就帮我仔细的检查一下,是否有变量被修改,有的话,就给你来个红牌警告,没有的话,就说明如你所愿,Showinfo()并没有改变任何变量的值。
按照官方的说法,就是说,绝不改变对象的状态。
假如你确定这个函数中,不会改变变量的值,你就加一个const,又不会怀孕。还能说明你是个好男人,承诺不变心 。
下面再举半个的栗子 ,说明一下:
```
class Student {
string m_name;
int m_num;
string m_sex;
public:
void Showinfo();
void Showinfo() const;//其实,有了const这里就没必要写Showinfo()
};
//.cpp
void Student::Showinfo(){
cout << Getname() << Getnum() << Getsex() << endl;
}
void Student::Showinfo()const{
cout << Getname() << Getnum() << Getsex() << endl;
}
//.cpp
int main(){
Student S1(‘科比’,24, ‘男’);
S1.Showinfo();//调用了void Showinfo()
const Student S2(‘詹姆斯’,23, ‘男’);//常对象S2
S2.Showinfo();//调用了void Showinfo() const
cout << endl;
return 0;
}
```
常对象,只能调用常函数呦呦^_^
【常数据成员】
这里也就是强调初始化的问题,在哪里初始化?不是你想在哪初始化,就可以初始化的,C++机制规定:普通常数据成员,在初始化列表,不能在函数体;静态常数据成员呢,直接在.cpp初始化。
给大家上半个的栗子
```
class Student {
string m_name;
int m_num;
string m_sex;
const int m_a;//在main()初始化,仅对单一成员有效
static const int m_b;//静态成员,所有对象共享
public:
void Showinfo();
void Showinfo() const;
};
//.cpp
const int m_b = 12;
Student::Student(int a):m_a(a){}
void Student::Showinfo(){
cout << Geta() << Getb() << endl;
}
//.cpp
int main(){
S2.Showinfo();
Student S3(22), S4(0);//初始化了常成员m_a,S3,S4的m_a以后就没法改变了
S3.Showinfo();
S4.Showinfo();
}
```
假如不是常成员,我们就可以在函数体内初始化,也可以在初始化列表内初始化。
【常引用】一种保护私有成员的机制,就是为了加速程序读取速度。
声明引用,数据就可以实现双向传递;
声明常引用,需要加const修饰,只读指定对象的内容,不能修改实参。
```
class Student {
int m_x, m_y;
public:
friend int xy(const Student&, const Student&);
};
//.cpp
int xy(const Student& S1, const Student& S2){
int x = S1.m_x - S2.m_x;
int y = S1.m_y - S2.m_y;//只能直接访问m_x, m_y,但你不能修改m_x, m_y,达到了保护数据的目的
}
```
本人技术水平有限,若有错误或不当之处,可以在本号内反馈给我,一起交流一起学习!
大家可以加我的个人号,一起讨论。
![94438a78085cfc3e017b559c1399c4a0.png](https://i-blog.csdnimg.cn/blog_migrate/667ccde48fa9bf59ad9d3320e55a1b29.jpeg)