面向对象-数据保护与共享-常模块

有空会把笔记整理下的

#include<bits/stdc++.h>
using namespace std;
/*
出于数据保护与共享,出现了常模块。顾名思义,常模块就是构造后数据不允许变化的模块。
常数据成员
*/
class Clock{
    private:
        int h,m,s;
        const int maxn=100;
///常数据成员:在对象构造后其值不会改变,所以必须在构造时对其进行初始化
///保护机制:任何的函数都无法修改其值
        static int cnt;
///静态数据成员,为类共有,对象和类都具有访问权
    public:
        Clock(int hh,int mm,int ss):h(hh),m(mm),s(ss){///构造函数
            cnt=cnt+1;
            cout<<"构造函数"<<endl;
        }
        Clock(const Clock& c):h(c.h),m(c.m),s(c.s){///常引用
            cnt=cnt+1;
            ///c.h=110;//不能通过引用的方式改变对象的值,但是原先的数据是可以改变的
        }
        Clock(Clock& c):h(c.h),m(c.m),s(c.s){///普通引用
            cnt=cnt+1;
            c.s=110;
            ///表明数据可以改变,只是不要能通过常引用改变
        }
        void fs()const{///常函数成员:不允许修改数据成员的一个函数成员
            //cout<<h<<" "<<m<<" "<<s<endl;
        }
        static void shoucnt(){///静态函数成员
            cout<<"cnt="<<cnt<<endl;
        }
        void showtime()const{///常函数
            cout<<"常函数"<<endl;
            fs();
        }
        void showtime(){
            cout<<"普通函数"<<endl;///普通函数
        }
        ~Clock(){///析构函数
            cout<<"析构函数"<<endl;
            cnt=cnt-1;
        }
};
void showclock(const Clock& c){
    cout<<"showclock begin"<<" "<<&c<<endl;
    c.showtime();
    cout<<"showclock end"<<" "<<endl;
}
int Clock::cnt=0;
int main(){
    Clock::shoucnt();///cnt=0
    Clock c(4,5,6);
    c.shoucnt();///cnt=1说明有了一个对象c

    {
        Clock c2(3,5,8);
        Clock::shoucnt();///cnt=2 说明比上面多了一个对象c2
    }
    Clock::shoucnt();///cnt=1说明c2的生存期只是大括号内,超出后就被析构
///常对象:一旦构造完成,该对象的所有数据成员,在生命期间不能被修改
///语法如下:
    Clock const c1(7,8,9);
    c1.showtime();///常对象只能调用常函数
    Clock c11(7,9,8);
    c11.showtime();///普通对象可以调用常函数,也能调用普通函数,后者优先
/**常对象的保护机制:
1.任何函数都无法修改其值
2.常对象调用函数成员时必须保证该函数没有修改常对象的值
 **/
///由于保护机制,常对象不能调用普通函数
    return 0;
}
/*
运行结果:
cnt=0
构造函数
cnt=1
构造函数
cnt=2
析构函数
cnt=1
构造函数
常函数
构造函数
普通函数
析构函数
析构函数
析构函数
*/

原文地址:https://www.cnblogs.com/OvOq/p/14853156.html