[类和对象]4 C++ static & friend

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

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

1.1 静态成员变量

1)定义静态成员变量

关键字 static 可以用于说明一个类的成员


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


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

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

[类和对象]4 C++ static & friend

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...
原文链接: https://www.cnblogs.com/-Mr-y/p/7804401.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/262883

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午3:27
下一篇 2023年2月14日 下午3:27

相关推荐