• 友元及操作符重载


    友元C++控制类对象私有部分的访问,但有时候需要在类的外部访问类的私有成员,这种情况下C++提供了友元机制。

    友元函数,友元类;声明为某一类(class 1)的友元函数(test()),或则友元类(class 2)后,在test() ,或则class 2 中可以访问class 1 的私有成员。

    在类里面声明:eg)   friend void test();   friend class demo;   注意,定义时不需要使用friend关键字.

    友元只是面对面的关系,也就是只能一层,友元的友元关系不成立。

    两个类可以互为友元,但是友元关系是单向的

    左值和右值的去别,左值能取地址,右值不能。

    创建友元函数步骤:

    1,将函数声明放到类的声明中,并在原型前加上关键字friend

    friend 返回值 函数名称(参数列表);

    friend class classname;

    2、编写友元函数定义,不需要在定义中使用关键字friend

    friend int 友元函数名(const classname &a);

    操作符重载 

    操作符重载规则 

    可以重载的操作符:

    + - * / % ^ & | ~

    ! = < > += -= *= /= %

    ^= &= |= << >> >>= <<= == !=

    <= >= && || ++ -- ->* ‘ ->

    [] () new delete new[] delete[]

     不能重载的算符  

         .      ::      .*      ?:       sizeof

    重载操作符函数可以对操作符作出新的解释,但原有基本语义不变:

    不改变操作符的优先级

    不改变操作符的结合性

    不改变操作符所需要的操作数 

    不能创建新的操作符

     操作符函数是一种特殊的成员函数或友员函数

     成员函数的语法形式为:

    类型   类名  ::  operator  op ( 参数表 )

    {

          // 相对于该类定义的操作

    }

     赋值操作符重载用于对象数据的复制 

     operator= 必须重载为成员函数 

    void operator = (const classname &it);

     classname &operator = (const classname &it);

    返回引用会支持如下语法obj1 = obj2 = obj3;

    重载+-*/运算操作符操作符

    classname operator +(const classname &a) 一元

    classname operator + (const char *s, const classname str) 二元

    重载+=运算操作符操作符

    void operator +=(const classname &a)

    <<>>操作符重载

    void operator <<(const classname &b)(一元)

    classname operator <<(classname &a, const classname &b)(二元)

    void operator >> (class &a)

    ++--操作符重载

     classname operator ++ (int),类成员函数重载++--必须带一个int参数,int仅供编译器识别,实际调用的时候不需要任何参数传递。

    在代码当中不但要使用object++,还需要使用++object的语法,所以需要定义一个非类成员函数的++重载,语法如下:

    classname operator ++ (classname &a),非类成员函数重载++--必须带一个指向类实例引用的参数。

    new/delete操作符重载

    重载newdelete必须再关键字operator和操作符之间留下空格,及如下形式:operator new

    重载new第一个参数一定是size_t类型参数,函数必须返回无类型指针。

    重载delete第一个参数一定是一个无类型的指针,函数必须没有返回值。

    new/delete操作符重载案例

    void *operator new(size_t size)

    {

    classname *p = (classname *)malloc(size);

    return p;

    }

    void operator delete(void *object)

    {

    free((classname *)object);

    object = NULL;

    }

    重载new[],delete[]

    void *operator new[](size_t size)//size总比实际分配空间大4个字节存放一些系统内部的处理数据,也就是delete[]释放内存时所需要的数据。

    void *operator new[](size_t size)

    {

    classname *p = (classname *)malloc(size);

    return p;

    }

    void operator delete[](void *object)

    {

    free((classname *)object);

    object = NULL;

    }

    关系操作符==重载

    bool operator == (const abc &a);//类成员函数重载==操作符

    bool operator == (const clasname &a1, const classname &a2);///非类成员函数重载==操作符

    下标操作符[]重载

    int operator[](int i);//[]返回int

    int &operator[](int i);//支持object[1] = 8语法

    函数调用操作符()重载

    返回类型 operator () (参数1,参数2)

    int operator()()//重载无参数的()操作符,返回int

    int operator()(int i) //重载一个int型参数的()操作符,返回int.

    地址操作符*/&重载

    int operator * ()//重载*操作符,返回int

    int *operator & ()//重载&操作符,返回int *.

    自动转换和强制类型转换

    C++将一个类型赋值给另一个类型是,如果这两种类型兼容,那么C++会自动将这个值转化为接收变量类型。

    C++不能自动转化的时候,需要强制转化

    classname a;

    int *p = (int *)a;//强制转化失败,因为a是对象实例名称,C++无法实现将对象实例名称转化为int *

    强制转化操作符重载

    C++不但允许重载运算操作符,还可以重载强制类型转换操作符,不过强制类型转换必须是C++基本数据类型之一,如intfloat,char *等,强制类型转换注意以下几点:

    1、定义函数时不允许有参数,不允许有返回类型,但函数必须返回所需类型的值

    2、重载函数只可以是类成员函数,不可以为非类成员函数

    强制转化操作符重载例子

    operator int()

    {

    return 整形变量;

    }

    operator int* ()

    {

    return 整形变量地址;

    }

    Always Believe Something Beauitful Will Be Happen
  • 相关阅读:
    Windows消息机制
    inherited 为什么可以调用父类的private函数? [问题点数:100分,结帖人:h2plus0]
    C++Buidler6中需要注意的几个问题
    BGA封装芯片拆装全程纪实
    Delphi组件开发教程指南(四)组件生成过程(TWinControl)
    Delphi技巧集六 (等待执行完一个外部程序再执行另一个程序)
    C++ Builder高级应用开发指南
    干掉“Spirale”病毒
    完全看懂新世代x86指令集結構
    Delphi 组件撰写常问问题delphi 在整合环境中如何找出组件所产生的问题
  • 原文地址:https://www.cnblogs.com/Oude/p/6475947.html
Copyright © 2020-2023  润新知