C/C++的const和static和宏

11 篇文章 2 订阅

const:

C和C++中从const的区别:

  1. C中的const是伪常量,不可以给数组指派内存空间,它占用内存空间可以转换成变量使用
  2. C++中const是真常量,它可以给数组指派内存空间,如果是一个const取地址,它会生成一个临时的内存空间但是不影响之前的结果因为它在编译期就确定了值。

指向常量的指针和常量指针:
首先const修饰常量:修饰一般常量 (一般常量是指简单类型的常量),这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。也就是const int a和 int const a 是一样的
这里有常见的六种const:
这里提供一个方法区分它们,这种方法来源于《c primer plus》,在知乎上发布的这篇文章来自
区分const的方法
在区分他们时,你可以从右往左读,遇到 p 转换成“ p is a ”,遇到* 转换成“ point to”
那么:
①const int p; -->p is a int const -->p是一个 整形常量
②const int* p; -->p is a point to int const -->p是一个指向整形常量的指针
③int const* p; -->p is a point to cosnt int -->和②的意思相同
④int * const p; -->p is a const point to int -->p是一个常量指针指向int
⑤const int * const p; -->p is a const point to int const
⑥int const * const p; -->p is a const point to const int -->⑤和⑥一样 p是一个常量指针指向int 常量
这样区分起来只需要看 是 const point(常量指针) 还是 point to const 指向常量

static

C/C++中static变量的作用:
static修饰局部变量:只初始化一次,作用域是局部的但生命周期是全局的;
static修饰全局变量:只初始化一次,作用域是全局的生命也是全局的但只在本文件内可以使用。
static修饰函数:此函数只在本文件内有效,其他文件可使用与此函数名称相同的函数
静态数据成员
在类内数据成员的声明前加上static关键字,该数据成员就是类内的静态数据成员。其特点如下:

  • 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义
  • 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说任一对象都可以对静态数据成员进行操作。而对于非静态数据成员,每个对象都有自己的一份拷贝。
  • 由于上面的原因,静态数据成员不属于任何对象,在没有类的实例时其作用域就可见,在没有任何对象时,就可以进行操作
  • 和普通数据成员一样,静态数据成员也遵从public, protected, private访问规则
  • 静态数据成员的初始化格式:<数据类型><类名>::<静态数据成员名>=<值>
  • 类的静态数据成员有两种访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

静态成员函数
与静态数据成员类似,静态成员函数属于整个类,而不是某一个对象,其特性如下:

  • 静态成员函数没有this指针,它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
  • 出现在类体外的函数定义不能指定关键字static
  • 非静态成员函数可以任意地访问静态成员函数和静态数据成员

const和#define的优缺点

  1. const可以调试 ,宏不方便调试
  2. const在源代码期间有错误检查,宏只有在编译器,宏没有类型安全检查
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值