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;
    }
  • 相关阅读:
    几种常见SQL分页方式效率比较(转)
    jquery mobile开发笔记之Ajax提交数据(转)
    php 更新array键值
    PHP使用UTF8编码读取ACCESS的乱码问题解决方案(转)
    PropertyGrid控件动态生成属性及下拉菜单 (转)
    山穷水尽出高手,九死一生见功夫
    将MYSQL的GBK数据库转成_UTF-8数据库的简便方法
    CRM销售管理功能
    基于.net开发chrome核心浏览器【一】(转)
    1.Two Sum
  • 原文地址:https://www.cnblogs.com/lnlin/p/7563021.html
Copyright © 2011-2022 走看看