常类型:使用类型修饰符const说明的类型,常类型的变量或对象成员的值在程序运行期间是不可改变的。

3.10.1 常引用

如果在说明引用时用const修饰,则被说明的引用为常引用。如果用常引用做形参,便不会产生对实参
的不希望的更改。常引用的说明形式如下:

const 类型 &引用名;

例如:int a=5;
const int &b=a;
其中,b是一个常引用,它所引用的对象不允许更改。如果出现:b=12 //则是非法的

在实际应用中,常引用往往用来作形参,这样的参数称为长形参

 例 3.39  常引用作函数的参数
*/
#include<iostream>
using namespace std;
int add(const int &,const int &);  //声明add的形参是常引用
int main()
{int a=20;int b=30;cout<<a<<"+"<<b<<"="<<add(a,b)<<endl;a = 15;     //在add函数外,实参是可以改变的 b = 50;     //在add函数外,实参是可以改变的cout<<a<<"+"<<b<<"="<<add(a,b)<<endl;return 0;
}
int add(const int &i,const int &j)   //常引用作函数形参
{//i=i+20;      //不允许改变i的值 return i+j;
} /*
程序运行结果: 20+30=5015+50=65说明:由于add函数两个形参都定义为常引用,所以在函数中不能改变i和j的值,如果改变它们的值,编译将会出错,如本程序中执行的函数add加有注释的语句"i=i+20;",将会出现编译错误。因此,用常引用作形参,能够避免对是实参的更改,保证了数据的安全性。
*/

3.10.2 常对象

如果说明对象时用常引用const修饰,则被说明的对象为常对象。常对象的数据成员值在
在对象的整个生存周期内不能被改变。常对象的说明形式如下:

类名 const &对象名[(参数表)]

或 const 类名 &对象名[(参数表)]

在定义对象时必须被初始化,而且不能被更新。

例 3.40   非常对象和常对象的比较
*/
#include<iostream>
using namespace std;
class Sample{public:Sample(int m,int n){i = m;j = n;}int j;void setvalue(int x){i = x;}void show(){cout<<"i="<<i<<endl;cout<<"j="<<j<<endl;}private:int i;};
int main()
{
Sample s(10,20);  //对象s是普通对象,而不是常对象
s.setvalue(30);
s.j=40;
s.show();  //运行结果是 i=30 j=40 /*
Sample const s(10,20); //对象s是常对象
s.setvalue(30);  //运行错误,C++不允许间接的更改i的值
s.j=40;   //运行错误,C++不允许置接的更改j的值
s.show(); //运行错误,C++不允许常对象调用普通的
*/return 0;
}

3.10.3 常对象成员

1. 常数据成员
类的数据成员可以是常量或常引用,使用const说明的数据成员称为常数据成员。如果在
一个类中说明了常数据成员,那么构造函数就只能通过成员初始化列表对该数据成员进行
初始化,而其他人任何函都不能对该成员赋值。

   例3.41  常数据成员的使用
*/
#include<iostream>
using namespace std;
class Date{public:Date(int y,int m,int d);void show();private:const int year;    //常数据成员 const int month;   //常数据成员const int day;     //常数据成员
};
Date::Date(int y,int m,int d):year(y),month(m),day(d){} //采用成员初始化列表,对数据成员进行初始化
void Date::show()
{cout<<year<<".";cout<<month<<".";cout<<day<<endl;
}
int main()
{Date date1(2015,5,7);  Date date2(2015,5,8); date1.show();date2.show();return 0;
}/*运行结果为:2015.5.72015.5.8该程序中定义了如下3个常数据成员:const int year;    //常数据成员 const int month;   //常数据成员const int day;     //常数据成员其中year、month、day是int类型的数据成员。需要注意到是构造函数的格式如下:Date::Date(int y,int m,int d):year(y),month(m),day(d){}其中,冒号后面是一个成员初始化列表,它包含3个初始化项。这是由于year、month、和day都是常数据成员,C++规定只能通过构造函数的初始化列表对常数据成员进行初始化。在函数体中采用赋值语句对数据成员直接赋初值是非法的。如以下形式的构造函数是错误的:Date::Date(int y,int m,int d){year = y;     //非法 month = m;    //非法day = d;      //非法}一旦对某对象的常数据成员初始化后,该数据成员的值是不能改变,但不同对象中的该数据成员的值可以是不同的(在定义对象时给出) 如: Date date1(2015,5,7);   Date date2(2015,5,8);
*/

2、常成员函数

在类中使用关键字const说明的成员函数为常成员函数,常成员函数的说明格式如下:

类型说明符 函数名(参数表) const;

const是函数类型的一个组成部分,因此在声明函数和定义函数时都要用关键字const,
在调用时不必加const。

例3.42 常成员函数的使用
*/
#include<iostream>
using namespace std;
class Date{public:Date(int y,int m,int d);void show();          //声明普通的成员函数show() void show() const;    //声明常成员函数show() private:const int year;      //常数据成员 const int month;     //常数据成员const int day;         //常数据成员
/*int year;   //普通数据成员 int month;  //普通数据成员int day;    //普通数据成员
*/
};
Date::Date(int y,int m,int d):year(y),month(m),day(d){} //定义构造函数,采用成员初始化列表,//对数据成员进行初始化void Date::show()            //定义普通的成员函数show()
{cout<<"Date::show1()"<<endl;cout<<year<<".";cout<<month<<".";cout<<day<<endl;
}
void Date::show() const       //定义常成员函数show()
{cout<<"Date::show2()"<<endl;cout<<year<<".";cout<<month<<".";cout<<day<<endl;
}
int main()
{Date date1(2015,5,7);       //定义普通对象date1date1.show();              //调用普通的成员函数show const Date date2(2015,5,8); //定义常对象date2 date2.show();               //调用常成员函数showreturn 0;
}/*程序运行结果如下:Date::show1()2015.4.7 Date::show2()2015.4.8 本程序中,类Date中说明了两个同名成员函数show,一个是普通成员函数,另一个是常成员函数,它们是重载的。可见,关键字const可以被用于区分重载函数。

说明:

1、常成员函数可以访问常数据成员,也可以访问普通数据成员。常数据成员可以被常成员函数访问,
也可以被普通成员函数访问。

2、如果将一个对象说明为常对象,则通过该对象只能调用它的常成员函数,而不能调用普通的成员
函数。常成员函数是常对象唯一的的对外接口,这时C++从语法上对常对象的保护。

表3.2 常成员函数和普通成员函数的访问特性比较
--------------------------------------------------------------------------------------------------------------- 
数据成员 |                         普通成员函数 |                               常成员函数
--------------------------------------------------------------------------------------------------------------- 
普通数据成员                 可以访问,也可以改变值               可以访问,但不可以改变值

常数据成员                     可以访问,但不可以改变值           可以访问,但不可以改变值

常对象的数据成员         不允许访问和改变值                       可以访问,但不可以改变值

3、常成员函数不能更新对象的数据成员,也不能调用该类中的普通成员函数,这就保证了在常成员
函数中绝对不会更新数据成员的值。

C++:常类型Const相关推荐

  1. C++常类型(const)

    常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.因此,定义或说明常类型时必须进行初始化. 一般常量和对象常量 1. 一般常量 一般常量是指简单类型的常量.这种常量在 ...

  2. C++学习第三天——类的组合+友元函数+常类型+动态内存分配

    类和组合 对象数组和对象指针 可以进行定义对象数组和对象指针 一维对象数组定义方法 类名 数组名[下标表达式]; 类名 数组名[下标表达式]={类名(-),类名(-)}; //第一种默认调用系统给的无 ...

  3. C++ 常量类型 const 详解

    1.什么是const?  常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的.(当然,我们可以偷梁换柱进行更新:)  2.为什么引入const?  const 推出的初 ...

  4. c语言const 修饰二级指针,C++中const修饰二级指针(从类型‘int**’到类型‘const int**’的转换无效)...

    先上代码: void func(const int ** arg) { } int main(int argc, char **argv) { int **p; func(p); return 0; ...

  5. 【C++编程语言】严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C3848 具有类型“const MyCompare”的表达式会丢失一些 const-volatile 限定符以调用“bool

    问题描述:把set容器的内置排序算法改变时,使用仿函数 但是出现了一下错误 修改前 //set容器排序 class MyCompare {public:bool operator()( int v1, ...

  6. 常类型的使用 常成员函数(设计一个日期类和时间)

    普通成员函数可以访问常数据成员但是不能改变常数据成员的值: 普通成员函数不可以访问常对象的数据成员且不能改变常对象的数据成员的值: 常成员函数可以访问普通数据成员但是不可以改变普通数据成员的值: 常成 ...

  7. 常函数const的学习

  8. 3.GDScript(1)概览

    GDScript 是上面提到的用于Godot的主要语言.和其他语言相比,它与Godot高度整合,有许多优点: 简单,优雅,设计上为Lua.Python.Squirrel等语言用户所熟悉. 加载和编译速 ...

  9. c++ const 常指针

    const char * a; //指向const对象的指针或者说指向常量的指针. char const * a; //同上 char * const a; //指向类型对象的const指针.或者说常 ...

最新文章

  1. 【斗医】【13】Web应用开发20天
  2. 为什么一些人喜欢在java代码中能加final的变量都加上final
  3. AFNetworking 下载文件断点续传操作
  4. NDK/JNI01--NDK下载配置
  5. python 比赛成绩预测_利用 Python 预测英雄联盟胜负,分析了 5 万多场比赛才得出的数据!值得,涨知识了!...
  6. java内部类练习题,学习笔记——Java内部类练习题
  7. sqlserver 2008r2 查看表结构及视图、版本及数据类型(字段)
  8. 月薪1万的乞丐--转载
  9. c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
  10. 计算机枚举法教案,简单枚举算法教案.ppt
  11. java 银行卡号_java银行卡号判断银行
  12. 共模和差模电感电路分析方法及思路
  13. 移动端Retina屏boder 1px显示为2px或3px的解决方法
  14. 亚马逊多账号操作如何判断关联
  15. 基于Python的BP网络实现手写数字识别
  16. Java后端实现安卓/IOS移动端消息推送(百度云推送)
  17. 搭建Vue3脚手架和使用
  18. Hive 客户端工具
  19. 【VUE - 工具 - mapboxgljs】07、vuecli+mapboxgl创建demo显示地图
  20. 如何优雅的窥探别人?

热门文章

  1. Ubuntu 10.10 安装 libx11-dev
  2. UNIX--stat、fstat和lstat函数
  3. Eclipse生成jar文件
  4. PL/SQL三种集合类型的比较
  5. RapidFramework使用Oracle的步骤
  6. 2017-1-25总结 主框架设计
  7. Windows7 自动更新时遇到故障
  8. 微信浏览器跳转页面加载loading效果问题
  9. AssertValid函数学习
  10. MS_SQL_获取字符串最后出现的字符串及位置