zoukankan      html  css  js  c++  java
  • C++中的常对象和常对象成员

    常对象

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

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

    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
    {
    public:
    Student(int n,float s):num(n),score(s){}
    void change(int n,float s) const{num=n;score=s;}
    void display() const{cout<<num<<"	"<<score<<endl;}
    private:
    mutable int num;
    mutable float score;
    } ;
    int main()
    {
    Student const stud(101,78.5);
    stud.display();
    stud.change(101,80.5);
    stud.display();
    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成员函数。
  • 相关阅读:
    iOS web加载本地html文件图片不显示问题
    Mac 已损坏,无法打开。 您应该将它移到废纸篓。
    iOS随机数
    Objective-C 【NSString-字符串比较&前后缀检查及搜索】
    Objective-C 【从文件中读写字符串(直接读写/通过NSURL读写)】
    Objective-C 【protocol 的引用问题】
    Objective-C 【protocol-协议 的了解使用】
    C 【block类型全方位详解】
    Objective-C 【Category-非正式协议-延展】
    Objective-C 【This is ARC】
  • 原文地址:https://www.cnblogs.com/pangblog/p/3306424.html
Copyright © 2011-2022 走看看