const用法详解Word格式.docx

上传人:b****2 文档编号:15186728 上传时间:2022-10-28 格式:DOCX 页数:7 大小:18.25KB
下载 相关 举报
const用法详解Word格式.docx_第1页
第1页 / 共7页
const用法详解Word格式.docx_第2页
第2页 / 共7页
const用法详解Word格式.docx_第3页
第3页 / 共7页
const用法详解Word格式.docx_第4页
第4页 / 共7页
const用法详解Word格式.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

const用法详解Word格式.docx

《const用法详解Word格式.docx》由会员分享,可在线阅读,更多相关《const用法详解Word格式.docx(7页珍藏版)》请在冰豆网上搜索。

const用法详解Word格式.docx

时i不被分配内存,而是已10直接代入以后的引用中,以致在以后的代码中没有错误,为达到说教效果,特别地用&

i明确地给出了i的内存分配。

不过一旦你关闭所有优化措施,即使constlongi=10;

也会引起后面的编译错误。

*/

charh=I;

 

//没有错

charh=i;

//编译警告,可能由于数的截短带来错误赋值。

5.可以避免不必要的内存分配

#defineSTRING"

abcdefghijklmn\n"

constcharstring[]="

abcdefghijklm\n"

;

...

printf(STRING);

//为STRING分配了第一次内存

printf(string);

//为string一次分配了内存,以后不再分配

printf(STRING);

//为STRING分配了第二次内存

printf(string);

...

由于const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

6.可以通过函数对常量进行初始化

intvalue();

constinti=value();

dapingguo说:

假定对ROM编写程序时,由于目标代码的不可改写,本语句将会无效,不过可以变通一下:

constint&

i=value();

只要令i的地址处于ROM之外,即可实现:

i通过函数初始化,而其值有不会被修改。

7.是不是const的常量值一定不可以被修改呢?

观察以下一段代码:

constinti=0;

int*p=(int*)&

i;

p=100;

通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。

8.请分清数值常量和指针常量,以下声明颇为玩味:

intii=0;

//i是常量,i的值不会被修改

constint*p1i=&

//指针p1i所指内容是常量,可以不初始化

int*constp2i=&

ii;

//指针p2i是常量,所指内容可修改

constint*constp3i=&

//指针p3i是常量,所指内容也是常量

p1i=&

*p2i=100;

//合法

9.#define边际效应

#definemax(a,b)((a)>

(b)?

(a):

(b))

Thisdefinitioncomputeseitheraorbtwice,withbadresultsiftheoperandhassideeffects.

sideeffects可以理解成副作用,

当如下调用该宏时:

max(a++,b++),宏被替换成((a++)>

(b++)?

(a++):

(b++)),所以肯定有个变量被计算2次.详细说明请参照

《ctrapsandpitfalls》

先计算“?

”前表达式,则a++、b++各被计算一次;

再判断取a++,还是b++,则a++或b++其中有一个被计算一次

10.c++const成员函数

一些成员函数改变对象,一些成员函数不改变对象。

例如:

intPoint:

:

GetY()

{

 returnyVal;

}

  这个函数被调用时,不改变Point对象,而下面的函数改变Point对象:

voidPoint:

SetPt(intx,inty)

 xVal=x;

 yVal=y;

  为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数的函数原型中加上const说明:

classPoint

{

 public:

  intGetX()const;

  intGetY()const;

  voidSetPt(int,int);

  voidOffsetPt(int,int);

 private:

  intxVal,yVal;

};

  const成员函数应该在函数原型说明和函数定义中都增加const限定:

GetY()const

}

classSet{

public:

 Set(void){card=0;

}

 boolMember(constint)const;

 voidAddElem(constint);

 //...

boolSet:

Member(constintelem)const

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

  constSets;

  s.AddElem(10);

//非法:

AddElem不是常量成员函数

  s.Member(10);

//正确

  但构造函数和析构函数对这个规则例外,它们从不定义为常量成员,但可被常量对象调用(被自动调用)。

它们也能给常量的数据成员赋值,除非数据成员本身是常量。

为什么需要const成员函数?

  我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"

只读"

函数,而有一些函数要修改类数据成员的值。

如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。

其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。

const成员函数和const对象

  实际上,const成员函数还有另外一项作用,即常量对象相关。

对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。

例如,定义一个整型常量的方法为:

  constinti=1;

同样,也可以定义常量对象,假定有一个类classA,定义该类的常量对象的方法为:

  constclassAa

(2);

  这里,a是类classA的一个const对象,"

2"

传给它的构造函数参数。

const对象的数据成员在对象寿命期内不能改变。

但是,如何保证该类的数据成员不被改变呢?

  为了确保const对象的数据成员不会被改变,在C++中,const对象只能调用const成员函数。

如果一个成员函数实际上没有对数据成员作任何形式的修改,但是它没有被const关键字限定的,也不能被常量对象调用。

下面通过一个例子来说明这个问题:

classC

 intX;

 intGetX()

 {

  returnX;

 }

 voidSetX(intX)

  this->

X=X;

voidmain()

 constCconstC;

 cout<

<

constC.GetX();

  如果我们编译上面的程序代码,编译器会出现错误提示:

constC是个常量对象,它只能调用const成员函数。

虽然GetX()函数实际上并没有改变数据成员X,由于没有const关键字限定,所以仍旧不能被constC对象调用。

如果我们将上述加粗的代码:

  intGetX()

改写成:

  intGetX()const

再重新编译,就没有问题了。

const成员函数的使用

  const成员函数表示该成员函数只能读类数据成员,而不能修改类成员数据。

定义const成员函数时,把const关键字放在函数的参数表和函数体之间。

有人可能会问:

为什么不将const放在函数声明前呢?

因为这样做意味着函数的返回值是常量,意义完全不同。

下面是定义const成员函数的一个实例:

  classX

  {

   inti;

   public:

   intf()const;

  };

  关键字const必须用同样的方式重复出现在函数实现里,否则编译器会把它看成一个不同的函数:

  intX:

f()const

   returni;

  }

  如果f()试图用任何方式改变i或调用另一个非const成员函数,编译器将给出错误信息。

任何不修改成员数据的函数都应该声明为const函数,这样有助于提高程序的可读性和可靠性。

对象.成员函数

对象 

成员函数 

对/错

1、 

const 

const 

2、 

non-const 

3、 

non-const 

4、 

not-const 

成员函数调用成员函数

成员函数 

5、 

6、 

7、 

8、 

11.使用const的一些建议

1要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;

2要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考题;

3在参数中使用const应该使用引用或指针,而不是一般的对象实例,原因同上;

4const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;

5不要轻易的将函数的返回值类型定为const;

6除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 材料科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1