十七章 包含,友元,嵌套

学到这里,首先要恭喜你,你的C++之旅快要接近尾声了。是个值得庆贺的事情。不过还是不能太松懈,因为重头戏模板和STL你还没了解了。别急,先学下本章吧。言归正传,我们先来了解下包含.

包含
   什么是包含?顾名思义,就是一个对象包含另一个对象C++的语法我们已了解了不好了,相信自己也尝试了离开书籍的帮助编写了一些小程序,我们有这些基础相信学习本章不会有很大难度

。首先请看下面这个简单的包含Demo

 

#include<iostream>
using namespace std;
//包含的简单Demo
class A//被包含的类A
{
public:
    A();
    A(int);
    void get();
private:
    int x;
};
A::A(int y){x=y;}
void A::get(){cout<<x<<endl;}

class B
{
public:
    B(int y):a(y){;}
    void get(){a.get();}
private:
    A a;//包含类A对象a
};
int main()
{
    B b(50);
    b.get();
    system("pause");
    return 0;
}

 

 

 

demo代码中类B对象包含一个私有对象类a,这里的类A被类B包含.在类B里只能访问L类A提供的共有函数接口.我们是不是觉得和私有继承类似呢?由于代码较简单,我们在这里不在一一讲解..

在本章节最后会讲解包含和私有继承的区别,以及什么时候选择包含,什么时候选择私有继承.

 

友元类
什么是友元类?我们举个生活中的例子.比如小朋友的遥控汽车,如果这里我们把汽车看成一个类的话,那么遥控器就是汽车的友元类,因为它可以控制汽车,而汽车不可以控制遥控器.汽车和遥

控器本身并不关联.但是将遥控器变成汽车的友元类,那么要控制就可以控制汽车了。。
  友元类怎么声明呢?比如汽车类Car,我们只需要在汽车的Car里面添加friend说明,那么遥控器车就可以控制汽车呢.请看Demo演示

#include<iostream>
using namespace std;
//友元类Demo演示
class Car
{
public:
    friend class Tele;//请注意这行(关键)
    Car(int i);
    void set(int i);//添加该方法主要是演示在友元类中可以访问(设置汽车开关)
    void get();//添加该方法主要是演示在友元类中可以访问(获取汽车开关状态)
private:
    int on_off;
};
Car::Car(int i):on_off(i){}
void Car::set(int i){on_off=i;}
void Car::get()
{
    if(on_off==0)
    {
        cout<<"汽车是开关处于关闭状态"<<endl;
    }
    else
    {
        cout<<"汽车是开关处于打开状态"<<endl;
    }
}

class Tele
{
public:
    void set(Car &c,int i)
    {
        c.set(i);
        //c.on_off=1;
    }
    void get(Car &c)
    {
        c.get();
    }
};
int main()
{
    Car c(0);
    Tele t;
    t.set(c,1);
    t.get(c);
    system("pause");
    return 0;
}

 

聪明的读者获取尝试着注释friend class Tele;//请注意这行(关键)这句话,发现程序依然可以访问.那么获取会问,既然能访问,为什么要增加友元了?好像没必要.其实错了.我们这里注释

friend能访问的原因是因为在Tele类里访问的都是Car类的共有函数,如果我们尝试着注释那句话然后在Tele的set函数里添加c.on_off=1;这句话在运行就会提示错误呢?为什么呢?因为on_off

是私有.外部不可以访问,而添加friend程序就可以运行了。友元类可以访问类的共有,私有.就相当于是在类内部访问一样…还有说明的是friend可以放在public,protected,private任何一个

模块内,没有限制。


嵌套类
  顾名思义,一个类中嵌套另外一个类.我们看下Demo代码

 

#include<iostream>
using namespace std;
//嵌套 Demo
class A
{
public:
    class B//被嵌套的类B
    {
    public:
        B(int i):x(i){}
        void get(){cout<<x<<endl;}
    private:
        int x;
    };
    A(int i):b(i){}
    void get(){b.get();}
private:
        B b;
};
int main()
{
    A a(30);
    a.get();
    system("pause");
    return 0;
}

 

 

 

我们在类A内部定义了一个类B.私有变量定义了这个类B变量b.在类A构造函数中给类B进行了初始化.用类A的get()方法成功的访问了内部类型类B的方法..

 

以上就是本章节的全部内容.代码很简单.目的也很简单。就是希望大家能通过观看简单的代码了解C++..

 

posted @ 2012-06-10 22:25  依人  阅读(1131)  评论(3编辑  收藏  举报