C++中const和static关键字(定义和用途)

static

使用恰当能够大大提高程序的模块化特性,有利于扩展和维护,可以使程序锦上添花。

控制变量的存储方式和可见性。也不用担心不同文件不能使用同一个文件名的问题了。

面对过程

static关键字主要用在修饰局部变量全局变量函数

 局部变量

普通局部变量储存在栈中,使用完后会立即释放

而静态局部变量,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于全局区,即使函数返回,它的值也会保持不变。

静态局部变量的效果类似全局变量,但是位于函数体内部,就极有利于程序的模块化了。

全局变量

全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。

普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

函数

静态函数改变了函数的作用域,特性如下:

  • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
  • 不同的文件可以使用相同名字的静态函数,互不影响

面对对象

static可用于静态数据成员静态成员函数中。

对类中的某个函数用static修饰,表示该函数属于一个类而不属于此类的任何特定对象;对类中的某个变量用static修饰,表示该变量作用于所有的该类对象,内存只分配一次,只存在一个副本 ,所以每次调用都维持上次的值。



const 

1、const修饰数据类型

可以放在类型说明符的前面,也可以放在后面,结果一样。目的都是不能改变这些常量的值

const int a=5;//等同于   int const a=5;

2、const修饰指针变量和引用变量

int const* p  ==  const int *p;     只要const位于 * 左边,就是修饰指针变量,指针指向为常量

int const *p=5   √

int const*p=a;此时a的值无法再修改,但p可以更改地址


int *const p;        只要const位于 * 右边,就是修饰指针本身,指针本身是常量

int a = 10, b = 20;

int * const p = &a;// p和a指向同一片内存,相当于引用

 *p = 30;//p只能指向同一片地址,但值仍可以修改

3、const在函数中

1、防止修改指针指向的内容
 void func(char *strDestination, const char *strSource)

其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误,保护了原对象的属性。

2、防止修改指针指向的地址
void swap ( int * const p1 , int * const p2 )
表明,指针p1和指针p2指向的地址都不能修改,只能修改地址中的值

3、修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
const char * GetString(void);
char *str = GetString();//错误
const char *str = GetString();//正确用法

4、const在类中用法

修饰成员变量

因为类可以创建多个对象,不同对象所const成员值可以不同。所以不能在类的声明中初始化const成员,因为还没分配对象变量,编译器也不知道const数据成员的值是什么。

const修饰成员只能放在构造函数的初始化列表进行

补充:如果成员变量想建立在整个类都恒定的常量,应该用类中的枚举常量或者static const来实现

修饰成员函数

主要目的是防止成员函数修改对象的内容。

良好的类接口设计应该确保如果一个成员函数功能上不需要修改对象的内容,该成员函数应该加上const修饰。

const_reference operator[]( size_type pos ) const;

如果一个类对象为const 对象,语义上说明该对象的值不可改变,因此该const对象只能调用const成员函数,因为非const成员函数不能保证不修改对象值,编译器会禁止这种会造成隐患的行为。

补充:但如果const想修改某个成员变量值,可以用mutable修饰目标成员变量。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值