[类和对象]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 << '\t' ;
    }
    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...

posted @ 2017-11-08 15:45  _Mr_y  阅读(639)  评论(0编辑  收藏  举报
levels of contents