【C++学习】 之 const专题讲座

前言:上课和书中对const的介绍仅仅局限于定义常量,而没有深入讲解const,本博客将用简短的语言小谈const,希望能让新人尽早入门c++。


1 const的位置?

const int a;<span style="white-space:pre">			</span>//1
int const b;<span style="white-space:pre">			</span>//2

const int *c;<span style="white-space:pre">			</span>//3
int * const d;<span style="white-space:pre">			</span>//4<span style="white-space:pre">	</span>
const int * const e ;<span style="white-space:pre">		</span>//5


1、2 其实是一回事,这个好理解
c是一个指向常整形数的指针(所指向的内存数据不能被修改,但是本身可以修改),也就是说c = &a 是可以的,但是*c = 100是不行的
4 d 常指针(指针变量不能被修改,但是它所指向内存空间可以被修改)
5 第五个 e一个指向常整形的常指针(指针和它所指向的内存空间,均不能被修改)
小结:看const后面是什么,带*说明指向的内容不能修改,*在const前面就是指针不能改。



2 C语言有const吗?

有!

C语言中的const变量

C语言中const变量是只读变量,有自己的存储空间

C++中的const常量

可能分配存储空间,也可能不分配存储空间 

const常量为全局,并且需要在其它文件中使用

当使用&操作符取const常量的地址    分配内存


C++中的const常量类似于宏定义

const int c = 5; ≈ #define c 5

C++中的const常量在与宏定义不同

const常量是由编译器处理的,提供类型检查和作用域检查

宏定义由预处理器(CPP)处理,单纯的文本替换




3 const的注意事项


const 限定符定义常量时 ①常量名一般全用大写,便于与变量区分; ②要直接初始化,否则将无法初始化





4 const与类

4.1 类成员变量的属性如果有const变量,只能用初始化成员列表的方法进行初始化!

原因是:在调用构造函数的时候,对象在构造函数括号里的语句执行之前就被创建了,而const必须初始化,所以通过构造函数的参数给const“初始化”(其实是赋值)已经不行了,要让它在创建之前也就是括号之前初始化,这就引入了初始化成员列表。(后面会讲到)。

4.2 const在类成员函数的最后

例如  int get_a() const;      这就规定了调用这个函数不能修改类的任何属性,这个在程序开发中是很重要的。


4.3 可以在类定义的时候对const进行初始化吗?

例 4.3-1
class A
{
      public const a = 10;
};

  
当然不可以!请看4.1,具体原因请看const深入




5 更深一步探讨const


const定义的常量在函数执行之后其空间会被释放,而static定义的静态常量在函数执行后不会被释放其空间。

static 表示的是静态的。类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。一般的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。



const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道const 数据成员的值是什么

例如   例子4-3-1 中,class A  a1 ,a2,a3中的const可以是不一样的。


如果想用常量,请使用枚举类型。ennum{a = 100};     //this is ok!

class foo
{
private:
    const int i = 100;                // error !!!
public:
    foo(){} 
    ......
};


这样的初始化方式是不能通过编译的,因为在类对象里进行了存储空间分配,编译器不能知道const的内容是什么,所以不能把它用作编译期间的常量。这意味着对于类里的常数表达式来说,const就像它在C中一样没有作用。因此这个初始化工作必须发生在构造函数里,并且,要在构造函数的某个特别的地方。因为const必须在建立它的地方被初始化,所以在构造函数的主体里,const必须已初始化了,否则,就只有等待,直到在构造函数主体以后的某个地方给它初始化,这意味着过一会儿才给const初始化。当然,无法防止在在构造函数主体的不同地方改变const的值。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值