在类中,有时候为了避免误操作而修改了一些人们不希望被修改的数据,此时就必须借助const关键字加以限定了。借助const关键字可以定义const类型的成员变量、成员函数、常对象以及对象的常引用。

const成员变量

const成员变量其用法和普通的const变量用法相似,在定义时只需在前面加上const关键字即可。const成员变量的初始化只有唯一的一条途径:参数初始化表。这个在前面已经提到过,不记得的话可以再去翻看参数初始化表那一小节。

const成员函数

const成员函数可以使用类中的所有成员变量,但是不能修改变量的值,这种措施主要还是为了保护数据而设置的。

我们来看一下下面的例子,例1依然是前面见过多次的book类,不过已经将与const成员函数不相关的代码都去掉了。在类中定义了两个构造函数及四个普通的成员函数,其功能分别是设置成员变量和获得成员变量。但这个book类与前面不相同的是在getprice函数和gettitle函数声明后面多了const关键字,这就是const成员函数,也可以成为常成员函数。常成员函数就是在声明和定义的时候在函数头部的结尾加上const关键字。注意在定义函数的时候const关键字依然是不能少的,具体可以参见例1中getprice和gettitle函数的定义。

为什么要将这两个函数定义成常成员函数呢?这两个函数的功能我们知道就是为了返回price和title的,功能单一,并且不希望修改这两个变量的,如此,定义成常成员函数是非常保险的一种做法,可以避免在这两个函数内部修改成员变量。如果需要修改这两个变量则只需通过setprice和settitle函数完成,因此设置为const是非常合适的。

    class book{public:book(){}book(char* a, double p = 5.0);void setprice(double a);void settitle(char* a);double getprice()const;   char * gettitle()const;private:double price;char * title;};double book::getprice()const{return price;}char * book::gettitle()const{return title;}

常成员函数可以访问类中的任何成员变量,但是不能修改任何成员变量。而普通的成员函数不能访问常对象的成员变量,其它的成员变量都可以访问,普通的成员函数可以修改的成员变量也只有非const成员变量了,一旦加上了const关键字加以修饰,初始化完成后就不能被修改了。还有一点需要注意的是const成员函数是不能调用类中非const成员函数的。

const对象

const对象定义的基本语法如下:
    const 类名 对象名(实参名);
    类名 const 对象名(实参名);
这两种定义方式都是可以的,我们一旦将对象定义为常对象之后,该对象就只能调用类中的常成员函数了。

#include<iostream>
using namespace std;class book
{
public:book(){}book(book &b);book(char* a, double p = 5.0);void setprice(double a);double getprice()const;void settitle(char* a);char * gettitle()const;void display()const;
private:double price;char * title;
};book::book(book &b)
{price = b.price;title = b.title;
}book::book(char* a, double p)
{title = a;price = p;
}void book::display()const
{cout<<"The price of "<<title<<" is $"<<price<<endl;
}void book::setprice(double a)
{price = a;
}double book::getprice()const
{return price;
}void book::settitle(char* a)
{title = a;
}char * book::gettitle()const
{return title;
}int main()
{const book Alice("Alice in Wonderland",29.9);Alice.display();
//    Alice.setprice(51.0);//compile errorreturn 0;
}

在本例中,我们将类中的getprice、gettitle和display三个函数都声明为了常成员函数,之后在主函数中我们定义了一个常对象Alice,Alice作为一个常对象,只能调用常成员函数,因此在调用display函数时没有问题,但是在调用setprice函数时编译报错,因为setprice不是常成员函数。

有些时候我们在程序设计过程中要求修改常对象中的某个成员变量,这个时候如果是普通的成员变量是不能被修改的。为了满足这一需求,C++提供了mutable关键字。

    mutable int var;

通过这样的声明将变量var声明为可变的成员变量,此时如果要修改常对象的该变量时,只需要通过常对象调用const成员函数修改该变量即可。

对象的const引用

在将对象作为函数参数的时候,通常我们会采用引用的方式作为函数参数。有时候为了在函数中避免对对象本身做出什么修改,在函数形参前加上const关键字。

#include<iostream>
using namespace std;class book
{
public:book(){}book(book &b);book(char* a, double p = 5.0);void setprice(double a);double getprice()const;void settitle(char* a);char * gettitle()const;
private:double price;char * title;
};book::book(book &b)
{price = b.price;title = b.title;
}book::book(char* a, double p)
{title = a;price = p;
}void book::setprice(double a)
{price = a;
}double book::getprice()const
{return price;
}void book::settitle(char* a)
{title = a;
}char * book::gettitle()const
{return title;
}void display(const book &b)
{b.setprice(59.9);  //compile errorcout<<"The price of "<<b.gettitle()<<" is $"<<b.getprice()<<endl;  //ok
}int main()
{book Alice("Alice in Wonderland",29.9);display(Alice);book Harry("Harry potter", 49.9);display(Harry);return 0;
}

在本例中,我们将display函数声明为顶层函数,其函数形参为book类对象的常引用,在函数内部我们首先调用public属性的setprice函数,企图修改price成员变量,编译无法通过。而在其后调用gettitle和getprice函数则没有问题,因为这些函数没有修改成员变量。

转载于:https://www.cnblogs.com/wanghuixi/p/7008231.html

C++ 之const的使用相关推荐

  1. c/c++中的const

    关于const能否修改 c语言 #include <stdio.h> int main() {const int i = 10;//const int i; //错误,const变量必须在 ...

  2. 微信小程序var,let,const的区别

    var 用var的方式声明的变量,为全局变量 let 声明块级变量,即局部变量 const 用于声明常量,也具有块级作用域 const PI=3.14;

  3. js中定义变量之②var let const的区别

    var 上一篇文章有讲过,是js定义变量的关键词. 但是在es6中,新添加了两个关键词,用于变量声明的关键词:let 和const 接下来就说一下var let 和const的区别: 首先说var 用 ...

  4. C++ 笔记(15)— 引用(声明引用、引用作为参数、引用作为函数返回值、const 用于引用)

    引用是变量的别名.也就是说,它是某个已存在变量的另一个名字.一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 1. 创建引用 要声明引用,可使用引用运算符 & ,如下面的 ...

  5. C++ 笔记(07)— 常量(字面常量、const定义常量、constexpr 定义常量、enum 定义常量、define 定义常量)

    在 C++ 中,常量类似于变量,只是不能修改.与变量一样,常量也占用内存空间,并使用名称标识为其预留的空间的地址,但不能覆盖该空间的内容. 常量可以是任何的基本数据类型,可分为整型数字.浮点数字.字符 ...

  6. Const 重载解析

    1. Const重载应用场景 首先,对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参.则这个时候无论加不加const对实参不会产生任 ...

  7. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  8. C++const关键字作用

    修饰普通变量,表示不可修改(在定义的时候必须初始化) #include <iostream> using namespace std; const int a1 = 10; int mai ...

  9. const与define相比优点_const与#define的区别、优点

    const与#define的区别 编译器处理方式不同 define宏是在预处理阶段展开. 补充:预处理器根据以#开头的命令,修改原始的程序.比如我们常见的#include 命令告诉处理器读取系统头文件 ...

  10. inline函数返回值_C++知识补充-指针,const,函数指针,指针数组,运算符重载

    嵌入式Linux:C++ 面试准备珍藏版本​zhuanlan.zhihu.com 明月照我心:123道c++笔试题汇总(含答案)​zhuanlan.zhihu.com 阿贵:常见C++笔试面试题整理​ ...

最新文章

  1. MaxCompute助力OSS支持EB级计算力
  2. 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
  3. 清华校友打造Python调试神器
  4. UML第一次作业:UML用例图绘制
  5. php怎么删除所有文件夹,用php删除所有文件,文件夹及其子文件夹
  6. 程序员你为什么这么累【续】:如何应对需求变更
  7. springboot集成restTemplate实现rest接口调用
  8. 直播预告丨拆解 LTV:增长焦虑,企业如何诊断黄金流量?
  9. 搜狐新闻推荐算法原理 | “呈现给你的,都是你所关心的”
  10. 通用usb驱动libusb介绍和使用示例
  11. python hash函数_Python hash()函数
  12. mysql的binary安装
  13. idea(2021.3)上配置struts框架步骤
  14. UWP—网易云音乐的APP分析
  15. yiisoft/yii2-imagine 使用方法
  16. 手机储存卡数据怎么恢复
  17. 特大通知!!!CSDN和简书博客以后同步更新
  18. Html 内嵌 选择器属性 Dom操作 JavaScript 事件
  19. Python+OpenCV 识别银行卡卡号
  20. 微信小程序——简单计算器

热门文章

  1. Linux系统编程——孤儿进程模拟及分析
  2. 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告
  3. Liferay 7:Liferay内部博客地址
  4. Android使用的设计模式2——策略模式
  5. 配置Tomcat的server.xml以适应web-content文件系统的位置改变
  6. java HashMap的keyset方法
  7. ios公司开发者账号申请分享攻略
  8. Android共享电脑上网
  9. 浅谈Base64编码[转]
  10. 以5个数据库为例,用Python实现数据的提取、转换和加载(ETL)