常类型:使用类型修饰符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=;
int b=;
cout<<a<<"+"<<b<<"="<<add(a,b)<<endl; a = ; //在add函数外,实参是可以改变的
b = ; //在add函数外,实参是可以改变的
cout<<a<<"+"<<b<<"="<<add(a,b)<<endl; return ;
}
int add(const int &i,const int &j) //常引用作函数形参
{
//i=i+20; //不允许改变i的值
return i+j;
} /*
程序运行结果: 20+30=50
15+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(,); //对象s是普通对象,而不是常对象
s.setvalue();
s.j=;
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 ;
}

3.10.3 常对象成员

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

   例3.  常数据成员的使用
*/
#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(,,);
Date date2(,,);
date1.show();
date2.show();
return ;
} /*
运行结果为:2015.5.7
2015.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. 常成员函数的使用
*/
#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(,,); //定义普通对象date1
date1.show(); //调用普通的成员函数show const Date date2(,,); //定义常对象date2
date2.show(); //调用常成员函数show return ;
} /*
程序运行结果如下:
Date::show1()
2015.4.7
Date::show2()
2015.4.8 本程序中,类Date中说明了两个同名成员函数show,一个是普通成员函数,另一个是常成员函数,
它们是重载的。可见,关键字const可以被用于区分重载函数。

说明:

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

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

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

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

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

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

C++:常类型Const的更多相关文章

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

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

  2. ERROR C3848:具有类型"const XXX" 的表达式会丢失一些 const-volatile 限定符以调用"YYY" with"ZZZ"

    今天看书,Thinking in c++ volume 2 "Adaptable function objects" 里面作者说: Suppose, for example, th ...

  3. C++ Const(常类型)的作用总结

    C++ Const的作用总结 面试或者工作中,我们经常遇到const修饰符定义的变量,函数和对象等.那么const的作用具体是什么,有哪些.今天自己好好的总结了一下,记录下来方便自己以后时间久了不记得 ...

  4. 类的常成员const

    成员数据 以Human为例: 类中: 传统的初始化方式:                                                                        ...

  5. 3.GDScript(1)概览

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

  6. define宏定义和const常变量区别

    1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换.因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存.const定义的常量,在程序运行时在常量表中 ...

  7. const 常引用

    常类型是指使用类型修饰符 const 说明的类型,常类型的变量或对象的值是不能被更新的. 这篇主要说常引用.常引用是指所引用的对象不能被更新. 在实际应用中,常引用往往用来作为函数的形参,这样的参数称 ...

  8. const类型总结

    const 表示常类型   作用: 1.具有不可变性.   2.可以很方便对参数进行调整和修改,和宏定义一样,不变则已,变都变.   3.保护被修饰的东西,防止被意外修改.(如:在修饰函数的形参时,加 ...

  9. C++ const 常量和常指针

    常量,该指针所指向的值为只读 ; const int * p = &a; 常指针,该指针的值为只读,不可再指向其他地址 const * const p = &a; 常值,常指针 con ...

随机推荐

  1. MySQL 5.7.11 重置root密码

    .修改/etc/my.conf,添加参数skip-grant-tables .重启mysql service mysqld stop service mysqld start .用root 直接登录 ...

  2. .NET Framework 3.5 安装错误:0x800F0906、0x800F081F、0x800F0907

    使用Add-WindowsFeature 照成的问题 I get the failure below..  If I pick the Server 2012 R2 image from 8/15/2 ...

  3. oracle窗口函数中range interval的使用

    oracle窗口函数中range interval配合一般用来针对指定时间范围进行统计.其中range表示范围,between...and 表示之前的范围和之后的范围 , CURRENT ROW表示当 ...

  4. phpstorm8 设置及license key

    phpstorm8 license key Learn Programming ===== LICENSE BEGIN ===== 63758-12042010 00000Ryqh0NCC73lpRm ...

  5. 微软职位内部推荐-Senior SDE for Windows App Experience

    微软近期Open的职位: Job posting title: Senior Software Development Engineer Location: China, Beijing Divisi ...

  6. cocos2dx中的实现地图卷动的两种方式

    在游戏当中,实现地图卷动是最基本的功能,具体的实现的方法,大致有两类: 方法一:加载两张图片,轮流显示, 优点: 1.无论是地图上下卷动,还是左右卷动都可以 2.支持各种图片,(png,jpg...) ...

  7. ubuntu12.04samba服务器配置,亲测可用(转)

    系统平台:VMware Workstation9.0 + ubuntu12.04 首先要解决windows和linux网络连接问题:在VMware Workstation9.0 “设置” 选项中,设置 ...

  8. DB天气app冲刺二阶段第五天

    昨天什么事情也没做..看了一场哆啦a梦 所以就不算冲刺了.. 今天主要就是做了一下需要用到的图片的整理还有的就是UI主界面需要展示用的素材,发现好多东西都需要搜索半天,虽然这个不是什么技术活..但真的 ...

  9. 第一个Nodejs程序

    我的第一个Nodejs程序:Hello World var http = require("http"); http.createServer(function(request, ...

  10. 提升SQL Server速度整理索引碎片

    转载:http://wenku.baidu.com/view/f64c8a707fd5360cba1adbea.html SQL Server2005索引碎片分析和解决方法   毫无疑问,给表添加索引 ...