天天看點

C++ 了解public private protected friend 的使用                       C++ 了解public private  protected friend的使用

                       C++ 了解public private  protected friend的使用

public:類或成員可以由同一程式集中的任何其他代碼或引用它的另一個程式集通路。

private:隻能通過同一個類或結構中的代碼通路類型或成員。

protected:類或成員隻能由同一個類中的代碼通路,或者在從該類派生的類中通路。

C++ 了解public private protected friend 的使用                       C++ 了解public private  protected friend的使用

 繼承後的屬性變化

public, protected, private三種繼承方式,它們相應地改變了基類成員的通路屬性。

1.public繼承:基類public成員,protected成員,private成員的通路屬性在派生類中分别變成:public, protected, private

2.protected繼承:基類public成員,protected成員,private成員的通路屬性在派生類中分别變成:protected, protected, private

3.private繼承:基類public成員,protected成員,private成員的通路屬性在派生類中分别變成:private, private, private

例子1 public 繼承

class base0
{
public:
    int public_b=1;
protected:
    int protected_c=2;
private:
    int private_a=3;

};
class child: public base0
{
private:
      int d;
public:
     void printpublic( )
     {
         qDebug()<<"print:"<<public_b;
     }
     void printprotected( )
     {
         qDebug()<<"print:"<<protected_c;
     }
     void printprivate( )
     {
        // qDebug()<<"print:"<<private_a;// 不能在子類裡通路基類私有變量
     }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

     child ls;
     ls.printprivate();
     //ls.private_a=0; //不能通路 
    // ls.protected_c=3;//不能通路
     ls.printprotected();
     ls.public_b=2;
     ls.printpublic();
    return a.exec();
}
           

注:Child繼承public base0後,基類public成員,protected成員,private成員的通路屬性在派生類中分别變成:public, protected, private。Child繼承 不能通路private成員,可以通路public成員,protected成員。

例子2 protected 繼承

class child: protected base0
{
private:
      int d;
public:
     void printpublic( )
     {
         qDebug()<<"print:"<<public_b;
     }
     void printprotected( )
     {
         qDebug()<<"print:"<<protected_c;
     }
     void printprivate( )
     {
        // qDebug()<<"print:"<<private_a;// 不能在子類裡通路基類私有變量
     }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

     child ls;
     ls.printprivate();
     //ls.private_a=0; //不能通路
    // ls.protected_c=3;//不能通路
     ls.printprotected();
    // ls.public_b=2;//public成員變成了protected 不能通路
     ls.printpublic();
    return a.exec();
}
           

注:protected繼承:基類public成員,protected成員,private成員的通路屬性在派生類中分别變成:protected, protected, private。

 Friend 友元操作

          C++中的友元機制允許類的非公有成員被一個類或者函數通路,友元按類型分為三種:普通非類成員函數作為友元,類的成員函數作為友元,類作為友元。同友元函數一樣,一個類可以将另一個類聲明為友元類。若A類為B類的友元函類,則A類中的所有成員函數都是B類的友元函數,都可以通路B類的私有和保護成員。

右元函數的使用:

class base0
{
public:
    int public_b=1;
    friend void setVal(base0 &a,int dat);

protected:
    int protected_c=2;
private:
    int private_a=3;


};

//右元函數定義
void setVal(base0 &a,int dat)
{
a.private_a=dat;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
      base0 k;
     setVal(k,3);
     return a.exec();
}
           

右元類的使用: 

class ClassA
{
  friend class ClassB;//聲明ClassB 為右元 這樣ClassB 就可以通路ClassA私有成員了。
public:
    ClassA()
    {

    }
    void printX()
    {
        qDebug()<<"privatex:"<<privatex<<",m_age"<<m_age<<endl;
    }
private:
    int privatex=0;
    static int static_age;
};
//靜态類必須聲明
int ClassA::static_age=1;

class ClassB
{
public:
    void set(int x);
    ClassA m_A;
};
void ClassB::set(int dat)
{
    m_A.privatex = dat;//由于B類是A類的友元類,是以在B的成員函數中可以通路A類對象的私有成員
    ClassA::static_age = dat;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    ClassB b;
    b.m_A.printX();
    b.set(10);
    b.m_A.printX();
    return a.exec();
}
           

注意:

1.友元不具有互相性/友元關系是單向的:隻具有單項性 若類B是類A的友元,類A不一定是類B的友元,要看在類中是否有相應的聲明。

2.友元不能被繼承:B是A的友元類,C是B的子類,推不出C是A的友元

3.友元不具有傳遞性:B是A的友元,C是B的友元,推不出C是A的友元

2、
class A
{
    friend class B;
};
class C:class B;
{ 
};
3、
class A
{
    friend class B;
};
class B
{
    friend class C;
};
           

繼續閱讀