zoukankan      html  css  js  c++  java
  • 静态成员变量和静态成员函数、 常量对象和常量成员函数

    静态成员变量和静态成员函数:

        普通成员变量每个对象各有一份,而静态成员变量只有一份,被所有同类对象共享。
       
     普通成员函数一定是作用在某个对象上的,而静态成员函数并不具体作用在某个对象上。
     
     访问静态成员时,通过: 类名::成员名 的方式访问,不需要指明被访问的成员属于哪个对象或作用
     于哪个对象。因此,甚至可以在还没有任何对象生成时就访问类的一个静态成员。非静态成员的访
     问方式其实也适用于静态成员,但两者的效果并没有差别。
     
     使用sizeof运算符计算对象所占用的储存空间时,不会讲静态变量计算在内。
     
     静态成员变量本质上是全局变量。一个类,即使一个对象都不存在,其静态成员变量也存在。静态成
     员函数并不需要作用在 某个具体的对象上,因此本质上是全局函数。
     
     设置静态成员的目的是将某些和类紧密相关的全局变量和全局函数写进类中,形式上成为一个整体。 

    // 矩形类,需要时刻知道矩形总数个矩形总面积
    #include <iostream>
    
    using namespace std;
    
    class CRectangle{
        private:
            int w, h;
            static int totalArea;    // 总面积
            static int totalNumber;  // 矩形总数
        public:
            CRectangle(int w_, int h_){
                w = w_;
                h = h_;
                totalNumber++;
                totalArea += w*h;
            } 
            ~CRectangle(){
                totalNumber--;
                totalArea -= w*h;
            }
            static void PrintTotal(){
                cout << totalNumber << " , " << totalArea << endl;
            }
    }; 
    
    int CRectangle::totalNumber = 0;
    int CRectangle::totalArea = 0;
    
    int main()
    {
        CRectangle r1(3, 3), r2(2, 2);
        CRectangle::PrintTotal();
        r1.PrintTotal();
        
        return 0;
    }

     常量对象和常量成员函数:
        如果希望某个对象值初始化之后就不再改变,则定义对象时可以在前面加上const关键字,使之成为
        常量对象。
        常量对象上可以执行常量成员函数,因为常量成员函数确保不会修改任何非静态成员变量的值。当常
        量成员函数中出现了任何有可能修改非静态成员变量的语句,编译时就会出错。因此,常量成员函数
        内部也不允许调用同类的其它非常量成员函数(静态成员函数除外)。

    #include <iostream>
    
    using namespace std;
    
    class CTest{
        private:
            int n;
        public:
            CTest(){
                n = 1;
            }
            int GetValue() const {
                return n;
            }
            int GetValue(){
                return 2*n;
            }
    }; 
    
    int main()
    {
        const CTest object1;
        CTest object2;
        cout << object1.GetValue() << " , " << object2.GetValue() << endl;
        
        return 0;
    }
    
    // 输出结果:1 , 2 

     类还有常量型成员变量和引用型成员变量。这两种类型的成员变量必须在构造函数的初始化列表进行初始化

    #include <iostream>
    
    using namespace std;
    
    int f;
    
    class CDemo{
        private:
            const int num;
            int & ref;
            int value;
        public:
            CDemo(int n):num(n), ref(f), value(4){
                
            } 
    }; 
    
    int main()
    {
        cout << sizeof(CDemo) << endl;
        cout << sizeof(const int) << endl;
        
        return 0;
    }
  • 相关阅读:
    金丝雀发布、滚动发布、蓝绿发布到底有什么差别?关键点是什么?
    分析占用了大量 CPU 处理时间的是Java 进程中哪个线程
    阿里巴巴首部记录片问世:看哭所有创业者!
    【LBS】基于地理位置的搜索之微信 附近的人 简单实现
    【Linux】Linux 常用命令汇总
    【心灵鸡汤】为什么我会去云平台讲课
    【Mysql数据库访问利器】phpMyadmin
    【Java】一台服务器配置多个Tomcat
    tp5, laravel, yii2我该选择哪个
    网站升级2.0回滚机制
  • 原文地址:https://www.cnblogs.com/lnlin/p/7563021.html
Copyright © 2011-2022 走看看