美文网首页
10 B 类型转换 友元函数

10 B 类型转换 友元函数

作者: LuckTime | 来源:发表于2016-06-18 09:56 被阅读16次

    /*
    四大类型转换
    1,static_cast< int >(100.5) 静态数据类型之间转化
    有类型指针和void* 之间转换
    无名对象支持转换
    2,const_cast 把常量转换成变量 ,只能用一次
    eg:
    const date;
    const_cast <>(date)
    xxx_cast<类型>(数据)
    3,reinterpret_cast 最危险的转换 不同类型指针之间的转换
    4,dynamic_cast 动态类型转换(父类子类之间的转换)
    父类向子类转换时需要把关。dynamic_cast<子类*>(父类地址)
    */

    register int n;//直接将数据存在寄存器中,快速的访问变量。。但是寄存器空间有量

    //========================
    //========================

    include <iostream>

    include <string>

    using namespace std;

    class A{
    const int date; //注意是常量
    public:
    A(int d=4 ): date(d){}
    virtual void show() const{
    cout << "date = " << date <<endl;
    }

    void set(int d){
    const_cast<int&>(date) = d;
    }

    };

    class B : public A
    {

    public :
    void say()
    {
    cout << "welcome to Nanyang" <<endl;
    }
    };

    int main()
    {

    static_cast<A>(100).show(); //======静态转换
    A obj(200);
    obj.show();
    obj.set(300);
    obj.show();

    int n = 1;
    typedef unsigned int UI; //重新进行数据类型定义,1定义一个&类型的变量,2把变量名改为想起的悲鸣& 3在左边加typedef,4这样就给&类型起了新的别名。
    typedef unsigned char UC; //搜别名用法,没理解 (作用:整型变量在内存中放置方法)
    UC* p = NULL;
    p = reinterpret_cast<UC*>(&n);

    for(int i = 0; i < 4 ; i++ )
    cout << (int)*p++<<' ';
    cout <<endl;//数据 n = 1,在计算机的位置中可能保存位置不同。。0001或者1000,不同计算机,储存位置都有可能

    A oa;
    B ob;
    B* pb = NULL;
    A* pa = &oa;
    pb = dynamic_cast<B*>(pa);//warning
    cout <<"pb = "<<pb<<endl;
    }
    //====================================
    //====================================
    //====================================
    //========友元函数==静态成员===============
    友元函数:
    是什么: 在类内部用friend 声明
    怎么用:外面的函数或者另一个类,直接访问某个类私有成员的桥梁
    静态成员 :static members
    凡是所有对象共用一份数据,都需要生命静态数据成员
    所有的同一类对象,都是用一份数据
    静态数据又称为类变量(属于这个类,被该类全体成员共享)(像全局变量一样,在所有函数之外初始化)
    class Counter{
    static int cnt;
    }
    int Counter :: cnt;
    int Counter :: cnt = 0;//静态变量初始化
    或:

    include <iostream>

    include <string>

    using namespace std;

    class A{
    int date;
    public:
    A(int d) :date(d){}
    A() :date(0){}
    ~A(){
    cout << "~A()" << endl;
    }
    void show(){
    cout << "DATE = " << date <<endl;
    }
    //friend A add(A a1, A a2); //友元函数。只要是类A成员,都可以访问(A类把B类当做友元,B类不一定是A的友元,不能继承)
    friend class B;
    friend A add(const A& a1,const A& a2); //凡是调用对象,且不打算复制一份值给形参。可以用引用。。可以少调用构造,析构函数(用const + 引用,是不需要改变数据采用,如果需要交换数据或改变数值,则不用const)
    };
    //=======================================友元类
    class B
    {
    public:
    void twice(A a){
    a.date *= 2;//指明对象的来源 a.date
    cout << a.date<<endl;
    }

    };
    //=======================================友元函数
    A add(const A& a1, const A& a2){ //定义一个A类型的函数,如果没有友元函数的声明,则不通过编译(但是,如果函数在类内部实现,则可以编译成功)
    int sum = a1.date + a2.date;
    return A(sum);
    }

    class Sb111
    {
    public:
    string name;
    static string teacher;
    static int room;
    Sb111(const string& n):name(n){}
    void show(){
    cout << "我是 " << name << ",在 " << room;
    cout << "教室听 " << teacher << "讲课" <<endl;
    }
    static void newTeacher(const string & t)
    {
    teacher = t;
    }
    };
    string Sb111 :: teacher = "刘思";
    int Sb111 :: room =123;

    int main(int argc, char argv[])
    {
    A a1=8;
    A a2 =9;
    add(a1,a2).show(); //a1与a2的和,返回的值也是类A

    B ob;
    ob.twice(20);
    Sb111 s1("张三 ");
    s1.show();//静态成员
    Sb111 :: newTeacher("赵二");
    s1.show();
    s1.newTeacher("王八");
    s1.show();
    }

    相关文章

      网友评论

          本文标题:10 B 类型转换 友元函数

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