c++ 之类的控制与封装

class和struct的区别

我们可以使用class 和struct 的任何一个来定义类,唯一的一点区别就是struct和class的访问权限不太一样。

当我们希望定义的类的所有成员是publ的是,使用struct,反之,如果希望成员是private的,使用class

friend 友元

类可以允许其他类或者函数访问他的非公有成员,方法是领其他类或者函数称为他的友元。

class Sales_data {

//声明为友元
friend Sales_data add(const Sales_data&, const Sales_data&);
friend std::ostream &print(std::ostream&, const Sales_data&);
friend std::istream &read(std::istream&, Sales_data&);
public:
    // 构造函数
    Sales_data() = default;
    Sales_data(const std::string &s): bookNo(s) { }
    Sales_data(const std::string &s, unsigned n, double p):
               bookNo(s), units_sold(n), revenue(p*n) { }
    Sales_data(std::istream &);

    // 
    std::string isbn() const { return bookNo; }
    Sales_data& combine(const Sales_data&);
    double avg_price() const;
private:
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};


//Sales_data接口的非成员组成部分
Sales_data add(const Sales_data&, const Sales_data&);
std::ostream &print(std::ostream&, const Sales_data&);
std::istream &read(std::istream&, Sales_data&);

友元的声明只能出现在类定义的内部。友元的声明仅仅指定了访问的权限,而非一个普通意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行一次声明

类之间的友元关系

举个例子,我们的Window_mgr类的某些成员可能需要访问它管理的Screen类的内部数据。例如,我们需要为Window_mgr添加一个名为clear的成员,它负责吧一个指定的Screen的内容设置为空白,为了完成这一任务,clear需要访问Screen的私有成员,而想要另这种访问合法,Screen需要把Window_mgr指定为它的友元。

class Screen{
//Window_mgr 的成员可以访问Screen类的私有部分
    friend class Window_mgr;
    //Screen类的剩余部分
}

友元关系不具有传递性,也就是说,如果Window_mgr有它自己的友元,则这些友元并不能理所淡然的具有访问Screen的特权。

令成员函数作为友元

除了让整个Window_mgr作为友元之外,Screen还可以只为clear提供访问权限。当把一个成员函数声明为友元时,我们必须明确指出该成员函数属于哪个类。

class Screen{
//Window_mgr::clear 必须在Screen类之前被声明
    friend void Window_mgr::clear(ScreenIndex);
    //Screen类的剩余部分
}

友元声明和作用域

即使我们仅仅是用声明友元的类的成员调用该函数,它也必须是被声明过的。

struct X{
friend void f(){//友元函数可以定义在类的内部}
X(){
f();//错误,f还没有被声明
}
void g();
void h();

};

void X::g(){return f();}//错误,f还没有被声明

void f();//声明哪个定义在X中的函数

void X::h(){return f();}//正确:现在f的声明在作用域中了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值