C++中的常对象与常对象成员详解

 更新时间:2013年10月15日 10:27:24   作者:  
常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中数据成员的值。有时在编程时有要求,一定要修改常对象成员中的某个数据成员的值(例如类中有一个用于计数的变量count,其值应当不能变化)

常对象

常对象必须在定义对象时就指定对象为常对象。

常对象中的数据成员为常变量且必须要有初始值,如

复制代码 代码如下:

Time const t1(12,34,36); //定义t1为常对象

这样的话,在所有的场合中,对象t1中的所有数据成员的值都不能被修改。凡希望保证数据成员不被改变的对象,可以声明为常对象。

定义常对象的一般形式为

类名    const    对象名(实参列表);

也可以把const写在最左面

const    类名    对象名(实参列表);

二者等价

如果一个对象被声明为常对象,则不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式构造函数和析构函数)。

否则就会报错

这样做是为了方式非const型的成员函数修改常对象中的数据成员的值,因为const型的成员函数是不可以修改对象中的数据成员的值的(这个后面还会说到)。

那么,怎样才能引用常变量中的数据成员呢?很简单,我们只需要将该成员函数声明称const型的成员函数(常成员函数)即可。

复制代码 代码如下:

void Print() const;

常成员函数可以访问常对象中的数据成员,但仍然不允许修改常对象中数据成员的值。

有时在编程时有要求,一定要修改常对象成员中的某个数据成员的值(例如类中有一个用于计数的变量count,其值应当不能变化),

对该数据成员声明为mutable,如

复制代码 代码如下:

mutable int count;//定义一个在常对象中可以被改变的数据成员

把count声明为可变的数据成员,这样就可以用声明为const的成员函数来修改它的值。

=========================一个简单的示例程序1.1====================================

复制代码 代码如下:

#include<iostream>
using namespace std;
class Student
{
<span style="white-space:pre"> </span>public:
<span style="white-space:pre">  </span>Student(int n,float s):num(n),score(s){}
<span style="white-space:pre">  </span>void change(int n,float s) const{num=n;score=s;}
<span style="white-space:pre">  </span>void display() const{cout<<num<<"\t"<<score<<endl;}
<span style="white-space:pre"> </span>private:
<span style="white-space:pre">  </span>mutable int num;
<span style="white-space:pre">  </span>mutable float score;
} ;
int main()
{
<span style="white-space:pre"> </span>Student const stud(101,78.5);
<span style="white-space:pre"> </span>stud.display();
<span style="white-space:pre"> </span>stud.change(101,80.5);
<span style="white-space:pre"> </span>stud.display();
<span style="white-space:pre"> </span>return 0;
};



我们定义了常对象stud,然后分别调用了两个常函数display()和change(),但是在change函数中要修改常对象中的num和score的值,所以我们将num和score定义为mutable.
常对象成员

1.常数据成员
其作用和用法与一般常变量相似,用关键字const来声明常数据成员。常数据成员的值是不能改变的。
只能通过构造函数的参数初始化表对常数据成员进行初始化。

在类体中声明常数据成员

复制代码 代码如下:

const int num;//声明hour为常数据成员

在类外定义构造函数
复制代码 代码如下:

Student::Student(int n,float s):num(n),score(s){} //通过参数初始化表对常数据成员num和score初始化

在类体中声明了某一个数据成员为常数据成员后,该类所有对象中的该数据成员的值都是不能改变的,但不同对象中该变量成员的值可以是不同的(分别在初始化时指定)。

2.常成员函数

如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改它们。
注意:常对象只能引用常成员函数

常成员函数的定义形式:

复制代码 代码如下:

void Print() const;//注意const的位置在函数名和括号之后

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

常成员函数可以const数据成员,也可以引用非const数据成员,但是都不能修改他们;

不是常成员函数的函数可以调用const数据成员,但是不能修改它们,也可以调用非const数据成员,并且可以修改它们。

具体情况,如图1:

还要注意一下三点:
1.不要误认为常对象中的成员函数都是常成员函数,常对象只保证其所有数据成员的值不被修改。

2.如果在常对象中的成员函数未加const声明,则编译系统会把它当最非const成员函数处理。

3.还要注意,常成员函数不能调用另外一个非cosnt成员函数。

相关文章

  • 关于C语言和命令行之间的交互问题

    关于C语言和命令行之间的交互问题

    这篇文章主要介绍了C语言和命令行之间的交互,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 利用OpenCV实现局部动态阈值分割

    利用OpenCV实现局部动态阈值分割

    这篇文章主要为大家详细介绍了利用OpenCV实现局部动态阈值分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • vector与map的erase()函数详细解析

    vector与map的erase()函数详细解析

    vector和map都不能将it++写在for循环中,而在循环体内erase(it)
    2013-09-09
  • 详解C语言数组灵活多变的访问形式

    详解C语言数组灵活多变的访问形式

    这篇文章主要介绍了详解C语言数组灵活多变的访问形式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • C++实现LeetCode(41.首个缺失的正数)

    C++实现LeetCode(41.首个缺失的正数)

    这篇文章主要介绍了C++实现LeetCode(41.首个缺失的正数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c语言获取用户输入字符串是scanf和gets的区别详解

    c语言获取用户输入字符串是scanf和gets的区别详解

    今天小编就为大家分享一篇c语言获取用户输入字符串是scanf和gets的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C++控制台实现俄罗斯方块游戏

    C++控制台实现俄罗斯方块游戏

    这篇文章主要为大家详细介绍了C++控制台实现俄罗斯方块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 对C语言中指针的理解与其基础使用实例

    对C语言中指针的理解与其基础使用实例

    这篇文章主要介绍了对C语言中指针的理解与其基础使用实例,文中援引了知乎热门问题"为什么说指针是 C 语言的精髓?"中的精彩回答,需要的朋友可以参考下
    2016-03-03
  • C++ map用法总结(整理)

    C++ map用法总结(整理)

    这篇文章主要介绍了C++ map用法总结(整理),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • C++多文件变量解析

    C++多文件变量解析

    大家注意不要在头文件中定义变量,在头文件中声明变量。定义放在对应的源文件中。其他地方只能用extern声明
    2013-10-10

最新评论