友元:非类成员函数可以访问类的非公有成员(protected、private)
工程作用:提高程序运行效率(省去了函数调用返回等一系列时间)
友元的种类分为:友元函数、友元类(不传递,不继承、单向的)、友元成员函数
友元类注意事项:不传递 、不继承、单向;
友元成员函数注意事项 :
1.类前置声明必须将类的成员函数类外实现;
2.含有友元成员函数的类必须在代码最前
#include <iostream>
using namespace std;
class Test;
class A
{
public:
friend class Test;
void print(Test &t);
//void print1(Test &t);
private:
int count;
};
class Test
{
public:
//friend class A;
friend void A::print(Test &t);
// friend void A::print1(Test &a);
Test();
Test(int num);
void setNum(int num);
int getNum();
void print();
void print1(A &a);
friend void func(Test &other); //友元函数
private:
int num;
};
Test::Test()
{
}
Test::Test(int num):num(num)
{
}
void Test::setNum(int num)
{
this->num = num;
}
int Test::getNum()
{
return this->num;
}
void Test::print()
{
cout << "num = " << this->num << endl;
}
void Test::print1(A &a)
{
cout << a.count << endl;
}
void A::print(Test &t)
{
cout << "num = " << t.num << endl;
}
// void A::print1(Test &t1)
// {
// cout << t1.num << endl;
// }
void func(Test &other)
{
for (int i = 0; i < 100000; i++)
{
cout << other.num << endl;
//cout << other.getNum() << endl;
}
}
int main()
{
Test t;
t.setNum(5);
cout << t.getNum() << endl;
return 0;
}
运算符重载:实际是函数的重载 ;
运算符重载规则 :
运算符重载 不允许发明新的运算符;
不能改变运算符操作对象的个数 ;
运算符被重载后, 其优先级和结合性不会改变;
成员函数重载和友元函数重载的选择 ;
成员函数重载和友元函数重载的选择 :
- 一般情况下,单目运算符最好重载为类的成员函数;
- 双目运算符则最好重载为类的友元函数;
- 以下一些双梦运算符不能重载为类的友元函数 : = 、() 、[ ]、->。
- 类型转换运算符只能以成员函数方式重载 ;
- 流运算符只能以友元的方式重载 ;
特殊运算符 :
- 赋值运算符 =:如果没有重载(没有移动拷贝构造函数),必须以成员函数重载,系统会默认重载 。
注意 :默认生成的重载是浅拷贝 ; - [ ]:是双目运算符 ,但是必须以成员函数重载 ;
- +=:利用+实现 +=;
- !:单目运算符,只能用成员函数重载 ;
- 类型转换运算符 :
static_cast<类型 >(变量 )要转换成整型
operator int()
{
}
- 流运算符 : << (输出流) >> (输入流)
必须是友元函数重载;
cin对象——istream
cout对象——ostream - ++i (先+后用)
Test &operator++()
{
}
i++(先使用,后+)
Test & operator++
- 移动赋值运算符重载: 解决临时对象拷贝开销问题 ;