目录
1.数组类
2.运算符重载
2.1加号运算符
2.1.1成员函数实现
2.1.2全局函数实现
2.1.3加号重载
2.2左移运算符
2.3递增运算符
2.4指针运算符
2.5赋值运算符
1.数组类
//默认构造函数
MyArray::MyArray()
{
m_Size = 0;
m_Capacity = 100;
pAddress = new int[m_Capacity];
}
//析构函数
MyArray::~MyArray()
{
if (nullptr != pAddress)
{
delete[] pAddress;
pAddress = nullptr;
}
}
//有参构造
MyArray::MyArray(int capacity)
{
m_Size = 0;
m_Capacity = capacity;
pAddress = new int[m_Capacity];
}
//拷贝构造
MyArray::MyArray(const MyArray& arr)
{
m_Size = arr.m_Size;
m_Capacity = arr.m_Capacity;
pAddress = new int[arr.m_Capacity];
for (int i = 0; i < arr.m_Size; i++)
{
pAddress[i] = arr.pAddress[i];
}
}
//根据位置设置数据
void MyArray::setData(int pos, int data)
{
pAddress[pos] = data;
}
//获取数据
int MyArray::getData(int pos)
{
return pAddress[pos];
}
//尾插
void MyArray::pushBack(int data)
{
if (m_Size > m_Capacity)
{
return;
}
pAddress[m_Size] = data;
m_Size++;
}
//获取容量
int MyArray::getCapacity()
{
return m_Capacity;
}
//获取大小
int MyArray::getSize()
{
return m_Size;
}
2.运算符重载
给运算符新的含义,可以实现不同数据类型的运算。
- 运算符需要两个参数时,局部实现只传一个参数,全局实现传两个参数;
- 运算符需要一个参数时,局部实现不传参数,全局实现传一个参数。
2.1加号运算符
例如,此时p1+p2编译器不知道如何运算,需要我们自定义
2.1.1成员函数实现
2.1.2全局函数实现
2.1.3加号重载
只要将函数名改成operator+即可。
2.2左移运算符
cout << 10;
cout << p1;
输出一个自定义对象时,编译器懵了,此时需要重载左移运算符。
ostream& operator<<(ostream& cout, Person& p)
{
cout << p.m_A << p.m_B;
return cout;
}
cout返回的还是cout对象,因此,返回值类型是ostream&。
2.3递增运算符
//前置递增
cout << ++myInter;
后置递增
cout << myInter++;
对一个对象进行自增操作,编译器懵了,此时需要重载递增运算符。
//前置递增
MyInter& operator++()
{
m_Num++;
return *this;
}
//后置递增
int operator++(int)
{
int temp=m_Num;
m_Num++;
return temp;
}
- 前置递增返回值的类型是引用,后置递增返回值的类型是int;
- 后置递增添加一个int做占位参数,来区分前置和后置。
2.4指针运算符
//sp释放时,会自动释放Person
smartPoint sp(new Person(18));
智能指针smartPoint本质上是一个类,可以托管new出的对象,使其自动释放。
但此时,sp本质是个对象,无法像指针一样操作Person的成员,所以需要重载“->”和“*”。
Person* m_Person;
Person* operator->()
{
return m_Person;
}
Person& operator*()
{
return *m_Person;
}
2.5赋值运算符
有属性指向堆区,并用到赋值运算时,需要重载赋值运算。因为默认的赋值行为是值拷贝的。
class Person
{
public:
Person(char* name, int age)
{
m_Name = new char[strlen(name) + 1];
strcpy(m_Name, name);
m_Age = age;
}
//赋值运算符的重载
Person& operator=(const Person& p)
{
m_Age = p.m_Age;
if (nullptr != m_Name)
{
delete m_Name;
m_Name = nullptr;
}
m_Name = new char[strlen(p.m_Name) + 1];
strcpy(m_Name, p.m_Name);
}
char* m_Name;
int m_Age;
};