const 的含义

const int a;

int const a;

const int *a;

int * const a;

int const * a const;

/******/

前 两个的作用是一样,a是一个常整型数。

第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。

第四个意思a是一个指向整型 数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。

最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数 是不可修改的,同时指针也是不可修改的)。

 

问题:

即使不用关键字 const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?

理由:

1.关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理 其它人留下的垃圾,你就会很快学会感谢这点多余的信息。(当然,懂得用const的程序员很少会留下的垃圾让别人来清理的。)

2. 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。

3.合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。

简而言之,这样可以减少bug的出现。

 

 

总结如下:

一:对象.成员函数

     对象          成员函数       对/错
1、  const         const           对
2、  const         non-const       错
3、  non-const     const           对
4、  not-const     non-const       对



二:成员函数调用成员函数

     成员函数      成员函数       对/错
5、  const         const           对
6、  const         non-const       错
7、  non-const     const           对
8、  non-const     non-const       对

 

 

 

const修饰函数参数,函数返回值,函数本身的总结:

一:const修饰函数参数:
1.const不能修饰作输出用途的参数,否则,该参数将失去输出功能(不论采用“指针传递”还是“引用传递”);
2.const只能修饰输入参数:
  1>.若输入参数采用“指针传递”,加const修饰可以防止意外地改动指针,起保护作用;
  2>.若输入参数采用“值传递”,不需加const修饰;
  3>.若输入参数采用“引用传递”,若变量类型为用户自定义类型,可用const A & a形式声明;
     若变量类型为内部数据类型,如int,此时,“值传递”和“引用传递”效率相当,没有必要再改,直接写成fun(int x)即可;
  总结如下:
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传
递”,目的是提高效率。例如将void Func(A a) 改为void Func(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。
否则既达不到提高效率的目的,又降低了函数的可理解性。例如void Func(int x) 不
应该改为void Func(const int &x)。

二:const修饰函数返回值:
1.若给以“指针传递”方式的函数返回值加const修饰,则函数返回值的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针;
例如函数
const char * GetString(void);
如下语句将出现编译错误:
char *str = GetString();
正确的用法是
const char *str = GetString();
2.若函数返回值采用“值传递方式”,由于函数会把值复制到外部临时的存储单元中,加const修饰没有任何价值;
3.函数返回值采用“引用传递”的场合并不多,这种方式一般只出现在类的赋值函数中,目的是为了实现链式表达。
如:
class A
{
A & operate = (const A &other); // 赋值函数
};
A a, b, c; // a, b, c 为A 的对象

a = b = c; // 正常的链式赋值
(a = b) = c; // 不正常的链式赋值,但合法
如果将赋值函数的返回值加const 修饰,那么该返回值的内容不允许被改动。上例
中,语句 a = b = c 仍然正确,但是语句 (a = b) = c 则是非法的。


三:const修饰成员函数:
1.任何不会修改数据成员的函数都应该声明为const 类型。如果在编写const 成员函
数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,
这无疑会提高程序的健壮性。
以下程序中,类stack 的成员函数GetCount 仅用于计数,从逻辑上讲GetCount 应
当为const 函数。编译器将指出GetCount 函数中的错误。
class Stack
{
public:
void Push(int elem);
int Pop(void);
int GetCount(void) const; // const 成员函数
private:
int m_num;
int m_data[100];
};
int Stack::GetCount(void) const
{
++ m_num; // 编译错误,企图修改数据成员m_num
Pop(); // 编译错误,企图调用非const 函数
return m_num;
}
const 成员函数的声明看起来怪怪的:const 关键字只能放在函数声明的尾部,大
概是因为其它地方都已经被占用了。

 

 

另外:

//常用以下方式对类中的常量(const)成员进行初始化(当然:类中的普通成员变量也可以采取这种方式来初始化)
class point
{
public:
 point():x(0),y(0)
private:
 const int x;
 const int y;
};

//子类的构造函数中,调用父类带参数的构造函数:
class animal
{
public:
 animal(int height,int weight)
 {
  ...
 }
 ...
};

class fish:public animal
{
public:
 fish():animal(400,300)
 {
  ...
 }
 ...
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值