1.const 与 static

1.const 与 static

const用法

1.常变量给字面常量起个名字(即标识符),这个标识符就称为标识符常量;因为标识符常量的声明和使用形式很像变量,所以也称常变量。

定义形式: const int a =3;  int const b =3;  作用一样,都是定义常变量

注意: 常变量在定义时必须初始化; 常变量初始化之后,不允许再被赋值。

即所修饰的对象为常量,不可对其修改和二次赋值操作(不能作为左值出现)

2.指针常量针本身是一个常量(即地址值不可变)

int *const p = &a;      p的值不可变即p的指向不可变,p指向的值可变

指针常量必须在声明时初始化,指定一个地址的值,即必须指向一个变量,指针常量的值不能修改,就是说不能更换成一个新的地址,不能指向别的常量,但是可以通过指针常量修改它所指向的变量的值。

p = &b;  错误        *p =666; 正确

3.常量指针指针指向一个常量或是常变量(指针指向的值不可变,指针的指向可变)

const int a = 10;    int b;      const int *p = &a;   ==  int const* p=&a;

常量指针不能通过指针修改所指向的常量,但是指针可以指向别的常量,因为指针p本身是变量,但它所指向的是常量

*p = 100;    错误        p= &b; 正确

 

如果const位于*号右侧,const *p, const就是修饰指针本身,即指针本身是常量;

如果const位于*号左侧,*const p, const就是修饰指针所指向的变量,即指针指向为常量;

 

4.const修饰函数参数传入参数在函数内不可改

char*  mystrcpy(char* dest,const char* src);

可以提示阅读者作为传入参数;         确保形参在函数内不会被改变

5.函数返回值为const引用函数返回值为常量不可改对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”。

const int fun();   可以去掉const,函数返回值已为常量不可改,加const修饰无意义

const myclass fun();  返回自定义的类对象,有意义

6.常成员变量和常成员函数

class  Student

{

    const int age;

    常数据成员的值不可变,只能通过构造函数的初始化列表对常成员变量进行初始化,而不能用在构造函数中赋值的方法实现

    Student:Student(int a):age(a){}    正确

    Student:Student()    { age = a; }   错误

    void print_age()  const;

    常成员函数只能访问本类的数据成员(包括const和非const数据成员),但是不能修改任意数据成员的值

    只有常成员函数才可以操作常量或者常对象

    const  int  get_age();

    类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为“左值”

};

const作用

1.修饰常量值,限定常量值不可改,定义时必须初始化

2.const修饰,编译器可以检测错误,防止参数被修改,提高程序调试效率

3.提高程序执行效率, C++编译器不给const常量分配存储空间,而是保存于符号表中,没有了存储和读取操作,大大提高了执行效率,使常变量成为一个编译期间的常量

 

static用法

1.static局部变量:   函数内定义开始创建,存储于静态数据区,函数结束时不释放存储空间,下次使用该变量时,沿用上一次保存的值

作用域:函数内定义开始到函数结束        生存期:函数内定义开始到程序结束

2.static全局变量: 限定变量只能在本文件中使用,其他文件无法访问

其他文件可以使用同名的全局变量不会发生冲突。

作用域:源文件内                                 生存期:源文件内定义开始到文件结束

3.static函数:  静态函数也叫内部函数, 该函数只能在本文件中使用,其他文件无法使用, 在不同文件中,避免了函数同名引发的冲突,同名也可以使用

4.static类成员变量和static类成员函数

class Student

{

    static int age;

    类的静态成员变量是整个类的成员,不是一个类的对象的成员,类内皆可问

    静态数据成员初始化在类体外进行,而且前面不加static,以免和一般静态变量混淆
    一般在.cpp文件内类外初始化,格式  int  Student::age = 0;

    static int get_age()  {}

    属于整个类的成员函数,是整个类的成员

    可以用对象来调用它,静态成员函数可以用类名通过::直接调用

    静态成员函数没有this指针,只能访问该类的静态成员和静态成员函数

    如果静态成员函数中要引用非静态成员,可以通过对象来引用,

};

 

static作用:

1. 控制可见性和连接属性(隐藏)

存储方式为静态存储,连接方式为内部连接,对应”extern“外部连接

静态局部变量(已经是内部连接),改变存储方式

静态全局变量(已经是静态存储),改变连接方式

未加static修饰的全局变量和函数都具有全局可见性,其它的源文件也能访问 。

static修饰的全局变量和函数,就会对其他源文件隐藏,其他文件不可访问

2.控制存储方式

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,并且只初始化一次

3.默认初始化为0

在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。

总结:static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值