zoukankan      html  css  js  c++  java
  • 友元及操作符重载

    友元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
  • 相关阅读:
    LeetCode OJ 112. Path Sum
    LeetCode OJ 226. Invert Binary Tree
    LeetCode OJ 100. Same Tree
    LeetCode OJ 104. Maximum Depth of Binary Tree
    LeetCode OJ 111. Minimum Depth of Binary Tree
    LeetCode OJ 110. Balanced Binary Tree
    apache-jmeter-3.1的简单压力测试使用方法(下载和安装)
    JMeter入门教程
    CentOS6(CentOS7)设置静态IP 并且 能够上网
    分享好文:分享我在阿里8年,是如何一步一步走向架构师的
  • 原文地址:https://www.cnblogs.com/Oude/p/6475947.html
Copyright © 2011-2022 走看看