美文网首页
常函数/常对象/友元

常函数/常对象/友元

作者: Sheik | 来源:发表于2021-07-31 15:10 被阅读0次

环境:ide:Mac+clion

视频链接:
https://www.bilibili.com/video/BV1Hb411Y7E5?p=5

const 修饰成员函数:称为常函数。

1.如果想修改对象属性的值,那么加入mutable。this本身就是一个const 的指针,指针地址不变,那么加入了const 那么它的值也不会改变。
2.const 修饰对象,叫做常对象,常对象只能调用常函数。

class Person {

public :
    Person():m_B(2) {

    }
    //在函数后面加入const 修饰的是this 指针。让this指向的值不修改。
    void show() const {//这个就相当于const Person118 * const this; 常函数,常量指针常量。都不允许修改。
        m_A = 10;//加入了mutable 之后,即是在常函数中,也可以修改
//        m_B = 100;
    }

    void func() {

    }
    mutable int m_A;//加入了mutable 进行修饰。
    int m_B;
};

 const Person person;//常对象。也不允许修改这个对象的值。常对象只能调用常函数。如果调用普通函数,那么有可能在普通函数中修改其对应的属性值。
//    person.m_B = 100;//这里不允许被修改
    person.m_A = 100;
    cout << person.m_B<<endl;//2
    cout << person.m_A<<endl;//100
    person.show(); //ok,没有问题。常对象调用常函数。
    //person.func();//不允许调用普通函数。如果在func里面修改值是不允许的。

友元:friend 就是声明一些特殊的函数或者类,来访问另一个类的私有成员。

友元的三种实现:
1.全局函数做友元。
2.类做友元。
3.成员函数做友元。

全局函数做友元

class Builder{
    friend void goodGay(const Builder &builder);
public:
    Builder():m_Room("客厅"),m_BedRoom("卧室"){
    }
    string m_Room;
private :
    string m_BedRoom;
};

void goodGay(const Builder &builder){
    cout <<"正在访问客厅:"<<builder.m_Room<<endl;
    cout <<"正在访问卧室:"<<builder.m_BedRoom<<endl;
}

Builder builder;
goodGay(builder);

类做友元

class Building{
    friend class GoodGay;
public:
    Building():m_B("卧室"),m_A("客厅"){

    }
    string m_A;
private:
    string m_B;
};

class GoodGay{

public:
    GoodGay();
    GoodGay(const GoodGay &goodGay){
        this->building = goodGay.building;
    }
    Building *building;
    void visit(){
        cout<<"正在访问:"<<building->m_A<<endl;
        cout<<"正在访问:"<<building->m_B<<endl;
    }
    ~GoodGay(){
        if (building != NULL){
            delete building;
            building = NULL;
        }
    }
};

GoodGay::GoodGay() {
    building = new Building;
}

void test(){
    GoodGay goodGay;
    goodGay.visit();
}

成员函数做友元

class Building{
    //这句话的意思是,GoodGay::visit成员方法能访问Building 类的私有成员。
    friend void GoodGay::visit();
public :
    Building();
    string m_SittingRoom;
private :
    string m_BedRoom;
};

class GoodGay{
public:
    GoodGay();
    Building *building;
    void visit();
    GoodGay(const GoodGay &goodGay){
        building = goodGay.building;
    }
    ~GoodGay(){
        if(building != NULL){
            delete building;
            building = NULL;
        }
    }
};

相关文章

网友评论

      本文标题:常函数/常对象/友元

      本文链接:https://www.haomeiwen.com/subject/zpnhvltx.html