常引用

用const声明的引用就是常引用。常引用所引用的对象不能被更改。我们经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改。

常引用的声明形式为:const 类型说明符 &引用名。给大家看个常引用作为函数形参的例子:

#include<iostream>
using namespace std;
void show(const double& r);
int main()
{double d(9.5);how(d);return 0;
}
void show(const double& r)
//常引用作形参,在函数中不能更新r所引用的对象。
{cout<<r<<endl;
}

常对象

所谓常对象,是指数据成员在它的生存期内不会被改变。定义常对象时必须对其进行初始化,并且不能改变其数据成员的值。

常对象的声明形式为:类名 const 对象名 或者 const 类名 对象名。常对象的例子如下:

class A
{public:A(int i,int j) {x=i; y=j;}...
private:int x,y;
};
A const a(6,8); //a是常对象,不能被更新

如果程序中出现对常对象的数据成员修改的语句,编译器会报错。

一般修改对象的数据成员有两种途径,一种是通过对象名访问公有数据成员并修改其值,而常对象的数据成员是不能被修改的;另一种是类的成员函数修改数据成员的值,而常对象不能调用普通的成员函数。

可是这样的话,常对象就只剩数据,没有对外的接口了,这就需要为常对象专门定义的常成员函数了。

类的常成员函数

类中用const声明的成员函数就是常成员函数。常成员函数的声明形式为:类型说明符 函数名(参数表) const;

要提醒大家注意几点:
a.常成员函数在声明和实现时都要带const关键字;
b.常成员函数不能修改对象的数据成员,也不能访问类中没有用const声明的非常成员函数;
c.常对象只能调用它的常成员函数,不能调用其他的普通成员函数;
d.const关键字可以被用于参与对重载函数的区分,比如,如果有两个这样声明的函数:void fun(); void fun() const;,则它们是重载函数。

#include<iostream>
using namespace std;
class R
{public:R(int r1, int r2)    { R1=r1; R2=r2; }void print();void print() const;
private:int R1,R2;
};
void R::print()
{cout<<R1<<":"<<R2<<endl;
}
void R::print() const
{cout<<R1<<";"<<R2<<endl;
}
int main()
{R a(5,4);a.print(); //调用void print()const R b(20,52);b.print(); //调用void print() constreturn 0;
}


上面的R类中声明了两个同名函数print,第二个是常成员函数。

在main函数中定义了两个对象a和b,b是常对象,通过a调用的是没有用const声明的函数,而通过b调用的是用const声明的常成员函数。

类的常数据成员

类的数据成员也可以是常量和常引用,用const声明的数据成员就是常数据成员。

在任何函数中都不能对常数据成员赋值。构造函数对常数据成员初始化,只能通过初始化列表。给大家一个常数据成员的例子:

#include<iostream>
using namespace std;
class A
{public:A(int i);void print();const int& r;
private:const int a;static const int b;  //静态常数据成员
};
const int A::b=20;
A::A(int i):a(i),r(a) {}
void A::print()
{cout<<a<<":"<<b<<":"<<r<<endl;
}
int main()
{//建立对象a和b,并以50和10作为初值,分别调用构造函数,通过构造函数的初始化列表给对象的常数据成员赋初值A a1(50),a2(10);a1.print();a2.print();return 0;
}

常引用、常对象和对象的常成员相关推荐

  1. C++中的常引用、常对象、常函数、常数据成员

    1.常引用 用const声明的引用就是常引用.常引用所引用的对象不能被更改.经常见到的是常引用作为函数的形参,这样不会发生对实参的误修改.常引用的声明形式为:const 类型说明符 &引用名. ...

  2. 【C++---16】常指针和常引用

    Coordinate coor1(3,5); //定义一个普通对象const Coordinate &coor2 = coor1; //coor2是对象的常引用const Coordinate ...

  3. 12.4 C++常引用

    C++对象常引用 在C++中,常用常指针和常引用作函数参数,既能保证数据安全,使数据不能被随意修改,在调用函数时又不必建立实参的拷贝. 用常指针和常引用作函数参数,可以提高程序运行效率. 在C++中, ...

  4. C++之临时对象、常引用和浅拷贝探究

      和结构体一样,一个类的对象也可以以值,指针或者引用的形式作为函数的参数或返回值.一般情况下,为了避免创建临时对象通常传对象的引用,并且为了避免在函数体内修改对象的值,通常使用常引用:     co ...

  5. C++学习(六) 常引用、常对象、常对象成员、常成员函数

    文章目录 1.常引用 1.1.作用 1.2.说明 二.常对象 2.1.作用 2.2.注意 2.3.说明 三.常对象成员 3.1.作用 3.2.说明 四.常成员函数 4.1.说明 4.2.注意 1.常引 ...

  6. C++中的常对象与常引用

    目录 一.常对象 二.用const修饰的类对象 1.常成员函数 声明 注意 三.常引用 1.声明 2.应该在何时使用: 1.在函数中无需改变其值的参数,应该使用常引用. 2.复制构造函数的参数一般也宜 ...

  7. “约见”面试官系列之常见面试题之第六十八篇之本地对象 内置对象 宿主对象(建议收藏)

    首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...

  8. C++ 类与对象_类的其他成员(常成员,静态成员,友元)

    系列文章目录 重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂. C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针) C++ 类与对象_构造函数和析构函 ...

  9. 常引用、常量指针、指针常量、指向常量的常指针、空指针与野指针解释

    1.一.基础知识 引用并非对象 引用必须初始化 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起 类型要严格匹配 int &a = 10; //错误:引用类型的初始值必须是 ...

最新文章

  1. 关键短语抽取及使用BERT-CRF的技术实践
  2. opnet中的例子模型
  3. Flink从入门到精通100篇(五)-flink变种Alink,对阿里巴巴算法平台Alink简介
  4. JavaSE(二十一)——栈和队列、栈和堆
  5. 为什么Redis是单线程?为什么能处理大并发量?(举例不错)
  6. 信用贷款常见问题应对话术
  7. win10系统开不了机
  8. matlab中degrees,Convert degrees-minutes-seconds to degrees
  9. 操作系统上机作业-- 使用信号量解决生产者、计算者、消费者问题(多线程)
  10. cocos2d pod_cocos2d 和 cocos3d的版本问题
  11. Android开发学习之Xml解析归纳
  12. C# 创建进程但是失败,原因是什么
  13. implicit关键字和explicit关键字
  14. Python爬虫之一:十几行代码下载王者荣耀所有皮肤
  15. idea git 颜色代表什么意思
  16. 易课堂之算法注册机编写1
  17. Java: 猜拳游戏
  18. 两个PDF比较标出差异_5款“业界良心”级的PDF处理工具,哪些真“免费”,哪款最好用?...
  19. #千锋逆战班,王富胜# 学如逆水行舟,不进则退。在千锋学习的第14天 笔记整理
  20. 安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题

热门文章

  1. MIT6.830 Lab3 Query Optimization 实验报告
  2. aop springboot 传入参数_springboot用aop做参数校验
  3. OpenLDAP 2.4.44 安装 + phpLDAPadmin 安装
  4. [HEOI2016/TJOI2016]求和(第二类斯特林数)
  5. jboss eap6.1(4)(部署应用)
  6. Django中的form模块的高级处理
  7. 61组第二次团队作业
  8. 自学Python八 爬虫大坑之网页乱码
  9. 观察者模式与发布/订阅模式的区别
  10. PADS无模命令总结