友元: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操作符重载
重载new和delete必须再关键字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++基本数据类型之一,如int,float,char *等,强制类型转换注意以下几点:
1、定义函数时不允许有参数,不允许有返回类型,但函数必须返回所需类型的值
2、重载函数只可以是类成员函数,不可以为非类成员函数
强制转化操作符重载例子
operator int()
{
return 整形变量;
}
operator int* ()
{
return 整形变量地址;
}