static 作⽤:控制变量的存储⽅式和可⻅性。
作⽤⼀:修饰局部变量
:⼀般情况下,对于局部变量在程序中是存放在栈区的,并且局部的⽣命周期在包含语句块 执⾏结束时便结束了。但是如果⽤ static
关键字修饰的话,
该变量便会存放在静态数据区,其⽣命周期会⼀直延续 到整个程序执⾏结束。
但是要注意的是,虽然⽤ static
对局部变量进⾏修饰之后,其⽣命周期以及存储空间发⽣了 变化,但其
作⽤域并没有改变,
作⽤域还是限制在其语句块。
作⽤⼆:修饰全部变量
:对于⼀个全局变量,它既可以在本⽂件中被访问到,也可以在同⼀个⼯程中其它源⽂件被 访问(
添加
extern
进⾏声明即可
)
。⽤
static
对全局变量进⾏修饰改变了其作⽤域范围,由原来的整个⼯程可⻅变成 了
本⽂件可⻅
。
作⽤三:修饰函数
:⽤
static
修饰函数,情况和修饰全局变量类似,也是改变了
函数的作⽤域
。
作⽤四:修饰类
:如果
C++
中对类中的某个函数⽤
static
修饰,则表示该函数属于⼀个类⽽不是属于此类的任何 特定对象;如果对类中的某个变量进⾏ static
修饰,则表示该变量以及所有的对象所有,存储空间中只存在⼀个副 本,可以通过;类和对象去调⽤。
(补充
:静态⾮常量数据成员,其只能在类外定义和初始化,在类内仅是声明⽽已。)
作⽤五:类成员
/
类函数声明
static
- 函数体内 static 变量的作⽤范围为该函数体,不同于 auto 变量,该变量的内存只被分配⼀次,因此其值在下 次调⽤时仍维持上次的值;
- 在模块内的 static 全局变量可以被模块内所⽤函数访问,但不能被模块外其它函数访问;
- 在模块内的 static 函数只可被这⼀模块内的其它函数调⽤,这个函数的使⽤范围被限制在声明它的模块内;
- 在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有⼀份拷⻉;
- 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因⽽只能访问类的 static 成员变 量。
- static 类对象必须要在类外进⾏初始化,static 修饰的变量先于对象存在,所以 static 修饰的变量要在类外初 始化; 由于 static 修饰的类成员属于类,不属于对象,因此 static 类成员函数是没有 this 指针,this 指针是指向本 对象的指针,正因为没有 this 指针,所以 static 类成员函数不能访问⾮ static 的类成员,只能访问 static修饰 的类成员;
- static 成员函数不能被 virtual 修饰,static 成员不属于任何对象或实例,所以加上 virtual 没有任何实际意 义;静态成员函数没有 this 指针,虚函数的实现是为每⼀个对象分配⼀个 vptr 指针,⽽ vptr 是通过 this 指 针调⽤的,所以不能为 virtual;虚函数的调⽤关系,this->vptr->ctable->virtual function。
const 关键字:含义及实现机制
const
修饰基本类型数据类型
:基本数据类型,修饰符
const
可以⽤在类型说明符前,也可以⽤在类型说明符后, 其结果是⼀样的。在使⽤这些常量的时候,只要
不改变这些常量的值
即可。
const
修饰指针变量和引⽤变量
:如果
const
位于⼩星星的左侧,则
const
就是⽤来修饰指针所指向的变量,即指 针指向为常量;如果 const
位于⼩星星的右侧,则
const
就是修饰指针本身,即指针本身是常量。
const
应⽤到函数中
:作为参数的
const
修饰符:调⽤函数的时候,⽤相应的变量初始化
const
常量,则在函数体 中,
按照 const 所修饰的部分进⾏常量化,保护了原对象的属性
。
[
注意
]
:参数
const
通常⽤于参数为指针或引⽤ 的情况;
作为函数返回值的
const
修饰符:声明了返回值后,
const
按照
"
修饰原则
"
进⾏修饰,起到相应的保护作 ⽤。
const
在类中的⽤法
:
const
成员变量,
只在某个对象⽣命周期内是常量,⽽对于整个类⽽⾔是可以改变的。
因为 类可以创建多个对象,不同的对象其 const
数据成员值可以不同。
所以不能在类的声明中初始化 const 数据成员, 因为类的对象在没有创建时候,编译器不知道 const 数据成员的值是什么。const 数据成员的初始化只能在类的构 造函数的初始化列表中进⾏。
const
成员函数:
const 成员函数的主要⽬的是防⽌成员函数修改对象的内容
。要注 意,const
关键字和
static
关键字对于成员函数来说是不能同时使⽤的,因为
static
关键字修饰静态成员函数不含 有 this
指针,即不能实例化,
const
成员函数⼜必须具体到某⼀个函数。
const
修饰类对象,定义常量对象
:常量对象只能调⽤常量函数,别的成员函数都不能调⽤。
补充:
const
成员函数中如果实在想修改某个变量,可以使⽤
mutable
进⾏修饰。成员变量中如果想建⽴在整个类
中都恒定的常量,应该⽤类中的枚举常量来实现或者
static const
。
C ++
中的
const
类成员函数(⽤法和意义)
常量对象可以调⽤类中的
const
成员函数,但不能调⽤⾮
const
成员函数; (原因:对象调⽤成员函数时,在形 参列表的最前⾯加⼀个形参 this
,但这是隐式的。
this
指针是默认指向调⽤函数的当前对象的,所以,很⾃然, this 是⼀个常量指针
test * const
,因为不可以修改
this
指针代表的地址。但当成员函数的参数列表(即⼩括号) 后加了 const
关键字(
void print() const;
),此成员函数为常量成员函数,此时它的隐式
this
形参为
const test * const,即不可以通过
this 指针来改变指向对象的值。⾮常量对象可以调⽤类中的
const
成员函数,也可以调⽤⾮
const
成员函数