zoukankan      html  css  js  c++  java
  • [类和对象]4 C++ static & friend

    1.静态成员变量和成员函数 

    思考:每个变量,拥有属性。有没有一些属性,归所有对象拥有?

    1.1 静态成员变量

    1)定义静态成员变量
      关键字 static 可以用于说明一个类的成员


        静态成员提供了一个同类对象的共享机制


       把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个static 成员
        

       静态成员局部于类,它不是对象成员

     

    1.2 静态成员函数

    #include <iostream>
    using namespace std;
    
    class BB {
    public: //
        BB() { }                          //无参构造函数 
        BB (int a)   { Pub_mem = a; }     //有参构造函数     
    
    //普通成员函数     
        void printC() {
            cout<<"c:"<<Pri_Static_mem<<endl;
        }
        void AddC() {
            Pri_Static_mem = Pri_Static_mem + 1;
        }    
        
    public: 
        static void getC() { //静态成员函数 
            cout<<"静态成员函数 c:"<< Pri_Static_mem <<endl;
            /**
             *  静态函数中 不能使用 普通和静态(私有/公有)成员变量 
             *  静态函数中 不能使用 普通和静态(公有)成员函数, 但可以使用 静态(私有)成员函数
             */
    //         cout<<"a:"<<a<<endl; //error C2597: 对非静态成员“BB::a”的非法引用
    //         cout<<"mem:"<<Pub_mem<<endl; //error C2597: 对非静态成员“BB::Pub_mem”的非法引用
    //         printC();//error: cannot call member function ‘void BB::printC()’ without object
            Private_Static_func();
        }
    
    private:
        static void Private_Static_func(){
            //
        }
    
    public:
        int Pub_mem;                  //公有数据成员
        static int Pub_Static_mem;    //公有静态数据成员    
        
    private:
        int a;            //私有数据成员
        int b;            //私有数据成员
        static int Pri_Static_mem;     //私有静态成员变量
    protected:    
    };
    
    /*  如果使用了静态变量:一定要注意初始化!!!!   */
    int BB::Pri_Static_mem = 10;           //声明与定义 静态数据成员变量  初始值为10  [私有]
    int BB::Pub_Static_mem = 1;            //声明与定义 静态数据成员变量  初始值为1   [公有]
    
    int main(void) {    
    /*--------------------------------------------------------------
        私有静态数据变量:只能调用函数进行访问
    --------------------------------------------------------------*/
        BB b1, b2, b3;
        b1.printC(); //10
        b2.AddC(); //11
        b3.printC(); //11
    
        //私有/公有静态成员变量/函数的调用方法   对象.    类::
        b3.getC(); 
        BB::getC();
    
        cout<<"hello..."<<endl;
    
    /*--------------------------------------------------------------
        公有静态数据变量: 可以直接调用该变量进行修改    
    --------------------------------------------------------------*/
        BB cs(7); //mem = 7  初始化
    
        for(int i = 0; i < 5; i++) { 
            BB::Pub_Static_mem += i ;
            cout << BB::Pub_Static_mem << '	' ;
        }
        cout<<endl;
    
        return 0;
    }

    c:10
    c:11
    静态成员函数 c:11
    静态成员函数 c:11
    hello...
    1 2 4 7 11


    2.友元函数和友元类

    2.1 友元函数

    ?为什么设计友元类和友元函数?
      C++中的类对成员函数和变量进行了封装,但同样为编程人员提供了一个破坏该封装的操作,
      方便程序员对类的私有成员和函数进行访问
    重点掌握友元函数即可!

    2.2 友元类

    #include <iostream>
    using namespace std;
    
    class A
    {
    public:
        //友元类B 
        friend class B;
        
        //1 声明的位置 和 public private没有关系
        //2 函数modifyA 是 类A的好朋友
        friend void modifyA(A *pA, int _a); 
        
        A(int a=0, int b=0)
        {
            this->a = a;
            this->b = b;
        }
        int getA()
        {
            return this->a;
        }
    
    private:
        int a;
        int b;
    };
    
    void modifyA(A *pA, int _a)
    {
        pA->a = _a;
    }
    
    //若B类是A类的友员类,则
    //  在B类的所有成员函数都是A类的友员函数
    //  在B中可以访问A类的私有成员 私有函数
    //
    友员类通常设计为一种对数据操作或类之间传递消息的辅助类 class B { public: void Set(int a) { Aobject.a = a; } void printB() { cout<<Aobject.a <<endl; } private: A Aobject; }; int main(void) { /* 友元函数 */ A a1(1, 2); cout<< a1.getA()<<endl; modifyA(&a1, 300); cout<< a1.getA()<<endl; /* 友元类 */ B b1; b1.Set(700); b1.printB(); cout<<"hello..."<<endl; return 0; }

    1
    300
    700
    hello...

  • 相关阅读:
    系统设计实现
    反编译
    android layout analyze
    2016.7.20-notes
    如何认识刘昊然?
    leetcode-中等-队列-二叉树的层次遍历
    leetcode-简单-栈-逆波兰表达式
    leetcode-简单-栈-有效的括号
    队列-链式队列
    队列-循环队列-顺序存储
  • 原文地址:https://www.cnblogs.com/-Mr-y/p/7804401.html
Copyright © 2011-2022 走看看