友元及操作符重载

友元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
原文地址:https://www.cnblogs.com/Oude/p/6475947.html