c++代码中类const修饰成员函数数加const有什么意义?

没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!成员函数定义后面加 const 是什么意思? - 知乎9被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答3添加评论分享收藏感谢收起class FooClass{
void Foo(){ /*...*/}
然后,我在程序中创建了一个FooClass的常量对象A,并试图调用这个成员函数Foo()。const FooClass A;
但是,对A调用成员函数Foo()将会出错!A是一个const的对象,但是Foo()只能用于非const的对象。而且,定义成员函数Foo()时,显然不能把调用它的对象写到形参列表里面去声明为一个const,比如Foo(const FooClass this)。怎么让Foo()能用于const对象呢?就是给Foo()加上一个const声明,如下:class FooClass{
void Foo() const{ /*...*/}
这个时候,对前面创建的const的A就可以调用这个成员函数了。实际上,成员函数Foo()有一个隐式的形参this,它是自身对象的一个指针,但是不能显式地使用在Foo()的形参列表里。加上const就说明,this指向的对象是const对象。当然,加上了const声明的成员函数,不能对调用它的对象内的成员进行修改(声明为mutable的成员例外)。以上。161 条评论分享收藏感谢收起写回答常类型是指用类型修饰符const说明的类型,常类型的变量或者对象的值是不能被更新的。因此,定义或说明常类型时必须初始化。
如果在一个类声明常数据成员,那么任何函数中都不能对该成员赋值。构造函数对该成员进行初始化,只能通过初始化列表来实现。
#include&iostream&class A{public:&A(int i);&void print();&const int &r;//常量引用private:&&//静态数据成员&};const int A::b = 10;//静态常量数据成员在类外初始化A::A(int i) : a(i), r(c){&}void A::print(){&cout&& a && ":" && b && ":" && r &&}int main(){&A a1(100), a2(0);&a1.print();&a2.print();//a1.r=&30; 错误,因为r为常量引用。不可通过引用改变目标值.
//用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。&&return 0;}
 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名; 说明:(1)&在此不是求地址运算,而是起标识作用。
  (2)类型标识符是指目标变量的类型。
  (3)声明引用时,必须同时对其进行初始化。
  (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
  int a,&ra=a;
  a为目标原名称,ra为目标引用名。给ra赋值:ra=1; 等价于 a=1;
  (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
  (6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
  例如: Point pt1(10,10);
  Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
  需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
  pt1.offset(2,2);
  pt1和pt2都具有(12,12)的值。
  引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才
  初始化它。例如下面语句是非法的:
  Point &pt3;
  pt3=pt1;
  那么既然引用只是某个东西的同义词,它有什么用途呢?
  下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。
  1、传递可变参数
  传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。
  所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现
  两整数变量值交换的c程序如下:
  void swapint(int *a,int *b)
  temp=*a;
  *a=*b;
  使用引用机制后,以上程序的c++版本为:
  void swapint(int &a,int &b)
  temp=a;
  调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
  2、给函数传递大型对象
  当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的
  副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:
  const maxCard=100;
  Class Set
  int elems[maxCard]; // 集和中的元素,maxCard 表示集合中元素个数的最大值。
   // 集合中元素的个数。
  public:
  Set () {card=0;} //构造函数
  friend Set operator * (Set ,Set ) ; //重载运算符号*,用于计算集合的交集 用对象作为传值参数
  // friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数
  先考虑集合交集的实现
  Set operator *( Set Set1,Set Set2)
  for(int i=0;i&Set1.++i)
  for(int j=0;j&Set2.++j)
  if(Set1.elems==Set2.elems[j])
  res.elems[res.card++]=Set1.
  由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。
  每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。
  Set operator *( Set &Set1,Set &Set2)
  for(int i=0;i&Set1.++i)
  for(int j=0;j&Set2.++j)
  if(Set1.elems==Set2.elems[j])
  res.elems[res.card++]=Set1.
  如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:
  double &max(double &d1,double &d2)
  return d1&d2?d1:d2;
  由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:
  max(x,y)+=1.0;
  常引用声明方式:const 类型 &引用名=目标变量名;
  用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。
  【例】:
  const int &ra=a;
  ra=1; //错误
  a=1; //正确
  这不光是让代码更健壮,也有些其它方面的需要。
  【例】:假设有如下函数声明:
  string foo( );
  void bar(string & s);
  那么下面的表达式将是非法的:
  bar(foo( ));
  bar("hello world");
  原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。
  引用型参数应该在能被定义为const的情况下,尽量定义为const 。
  引用是除指针外另一个可以产生效果的手段。这意味着,一个基类的引用可以指向它的实例。
  【例】:
  class A;
  class B:public A{&&};
  A &Ref = // 用派生类对象初始化基类对象的引用
  Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。
阅读(...) 评论()您所在位置: &
&nbsp&&nbsp
C++成员运算符、const类对象及成员函数、类作用域专题.pdf 14页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
&#xe600;下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
你可能关注的文档:
··········
··········
本文作者:黄邦勇帅编著原名:黄勇
本文是对面向对象程序设计的入门知识,本文由浅入深,易学易懂,内容较全面。本文对类和对象做了较深入的分析,
让初学者弄明白类和对象的区别,本文着重讲了成员运算符点运算符和箭头运算符和作用域解析运算符的具体使用及
区别,对成员函数和 类对象也作了深入的讲解,对于类的作用域和类作用域中的名称解析,本文作了深入而细致
的分析,让读者明白类作用域的原理。
本文使用的是 机器主流计算机都是 机器,
操作系统, 编译器进行讲解的。
本文内容完全属于个人见解与参考文现的作者无关,限于水平有限,其中难免有误解之处,望指出更正。
声明:禁止抄袭,复印,转载本文,本文作者拥有完全版权。
主要参考文献:
、第五版中文版 美
著 孙建春 韦强译 人民邮电出版社
、第四版中文版
著 李师贤等译 人民邮电出版社
、第三版中文版
等著 潘爱民 张丽译 中国电力出版社 年 月
、《高质量编程指南》 作者 林锐 出版社不详 年 月
、《程序设计》 作者 谭浩强 清华大学出版社
第 8 部分 类基础、成员运算符、const 类对象和成员函数、类作用
域专题共4 章 共 14 页
第 1 章 面向对象程序设计基本概念(共3 页)
面向对象程序设计应具有继承、多态、封装三大特性,没有这三大特性的程序设计不能算真正的面向对象。
一、类、对象、抽象、实例基础(对初学者必须理解这几个概念) 。
应重点理解类与对象的区别,类与类型
、对象:指的是任何需要设计的东西,比如人、飞机、动物、三角形、学校、项目计划、一个整数等都可以是对象。
、对象都具有某些特性或行为,对象的特性也被称为对象的属性。
、对象的特性属性一般用于描述对象所拥有的特征,所以一般都是静态的,比如三角形对象,他的特性包含三角形
的边长、每个角的角度、三角形的高等。再如电视机对象的特性有颜色、重量、长、宽、高、屏幕大小等。
、对象的行为一般用于描述的是对象所拥有的功能或对对象的操作,所以对象的行为一般是动态的,比如三角形对象,
他的行为包含计算三角形的周长、面积等;再如电视机对象的行为有,调整电视机的亮度、对比度、颜色、对电视
机进行频道切换等。
、对象的特性属性在程序设计语言中一般使用变量来实现;对象的行为或功能在程序设计语言中一般使用函数来
、类:类是具有相同特性和行为的对象的一个模板或者框架 。因此类是对具有共同特征和行为的对象进行的一次归
纳或归类,从而形成一个模板或框架。比如对于等腰三角形,等边三角形等所有三角形对象,因为这些对象都具
有三角形的共同特性 比如边长和行为比如计算面积,因此可将这些对象归为”三角形”,因此三角形就成为一个类,
我们可以称其为 “三角形类”,从而三角形类就成为所有三角形的一个模板或框架。再如美国人、中国人、法国人
这些对象都可以被归为 “人”这么一类,因此“人类”就成为这些对象的一个模板或框架。
、抽象:抽象就是将对象的特性或行为进行归类的一个过程,比如将美国人、中国人、法国人这些对象归为人类的过
程被称为抽象,我们也可以这样说,把美国人、中国人、法国人抽象为”人”这么一个类。同理可以把等腰三角形,
等边三角形抽象为 “三角形类”。
8、实例概念及类与对象的区别:实例最简单的理解就是指的 “例子”,从对象和类的概念可以看到,对象是具体存在
的,是实实在在指的某一事物,而类则只相当于具有共同特性和行为的对象的一个模板或框架,因此可以说对象是
具体的,对象是类的一个实例或特例或例子;而产生类的过程是对具有共同特性和行为的对象的归类,而这个归类
的过程被称为抽象,因此也可以说类是对象的抽象。比如等腰三角形对象就是三角形类的一个实例,等腰三角形只
是众多三角形类中的一个具体的三角形而已,他是所有三角形当中的一个示例或一个例子或一个特例。而三角形类
是三角形对象的抽象,是三角形对象的一个模板。
9、类与类型:其实类就是一种类型,只是这种类型相对于简单的内置类型而言看起来更复杂而已,在程序设计语言中
一般被称为 “自定义类型”或 “抽象数据类型”,而程序设计语言中的类型一般被称为 “内置类型”(比如整型,浮
点型等) 。在 C++声明章节已讲过,类型决定了对象的内存大小、布局和取值范围,决定了可以对该对象进行什么
样的操作(比如进行加法、减法运算等),决定了可以将什么数据赋给对象,而C++中的类都具有这些功能。
二、使用 C
正在加载中,请稍后...C++中函数名前面的const有什么用
[问题点数:40分,结帖人lvzhipu]
C++中函数名前面的const有什么用
[问题点数:40分,结帖人lvzhipu]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2014年 总版技术专家分年内排行榜第二
2013年 总版技术专家分年内排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
2016年2月 C/C++大版内专家分月排行榜第三2016年1月 C/C++大版内专家分月排行榜第三
匿名用户不能发表回复!|

我要回帖

更多关于 类的const成员函数 的文章

 

随机推荐