4
4、 C++ 中 const 和 static 关键字(定义,用途)
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 成员函数。
Last updated