C++中const在不同对象不同位置中的作用

本文转自与lzkit

一、 const与define.

两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些。#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内联函数(Inline)。const和define定义的常量可以放在头文件里面。(小注:可以多次声明,但只能定义一次)

二、 const与指针,引用

(a)const与指针。
先来看看下面的几种定义:

int p;
const int * p1=&p;//p1可变,*p1不可变,此时不能用*p1来修改,但是p1可以转向
int * const p2=&p;//p2不可变,*p2可变,此时允许*p2来修改其值,但是p2不能转向。
const int *const p3=&me;//p3不可变,*p3也不可变,此时既不能用*p3来修改其值,也不能转向

下面3段程序代码的效果一样吗?

int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;

如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量

[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这种情况下不允许对内容进行更改操作,如不能*a = 3 ;
[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的。

(b)指针和引用的区别很简单,就是引用更简洁,更安全。因为引用声明时必须初始化。 引用更接近const指针,一旦与某个变量关联,就将一直效忠于他。

(c)const指针可以接受const和非const地址,但是非const指针只能接受非const地址。所以const指针的能力更强一些,所以尽量多用const指针,这是一种习惯。

三、const与函数

(a)const与传递值参数

  void function(const int Var); //传递过来的参数在函数内不可以改变.

(b)const与返回值

 const int Fuction1 (int);

此处返回const值,意思指返回的原函数里的变量的初值不能被修改,但是函数按值返回的这个变量被制成副本,能不能被修改就没有了意义,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字.但这只对于内部类型而言(因为内部类型返回的肯定是一个值,而不会返回一个变量,不会作为左值使用),对于用户**自定义类型,**返回值是常量是非常重要的

(c)const与成员函数

 void function(void)const; 

编译器会对这个函数进行检查,在这个函数中的任何试图改变成员变量调用非const成员函数的操作都被视为非法

int Stack::functiont(void)  const
{
	++ m_num; // 编译错误,企图修改数据成员 m_num
	Pop();  // 编译错误,企图调用非const 函数
	return m_num;
}
三、 const与类

(a)const数据成员的初始化只能在类的构造函数的初始化表中进行

 class A{ 
 	const int size = 100;//错误
 };

(b)非常量成员函数不能被常量成员对象调用,因为它可能企图修改常量的数据成员:

class Set {
  public:
  Set (void){ card = 0; }
  bool Member(const int) const;//常量成员函数
  void AddElem(const int);//非常量成员函数
  //...
};
int main()
{
	const Set s;//定义常量对象

	s.AddElem(10); // 非法: AddElem不是常量成员函数

	s.Member(10); // 正确
}

(c)成员函数可基于const实现重载
//…

四、使用const的一些建议

(a)要大胆的使用const,这将给你带来无尽的益处。
(b)要避免最一般的赋值操作错误,如将const变量赋值。
(c)在参数中使用const应该使用引用或指针,而不是一般的对象实例。
(d) const在成员函数中的三种用法(参数、返回值、函数)要很好的使用。
(e)不要轻易的将函数的返回值类型定为const;
(f)除了重载操作符外一般不要将返回值类型定为对某个对象的const引用

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值