Class with pointer member(s)设计注意事项:
1. Big Three,必须有的三个特殊函数
拷贝构造(copy ctor)、拷贝赋值(copy op=)、析构函数(dtor)
2. 拷贝构造函数(copy ctor)
必须重新申请空间并写入内容(深拷贝),否则拷贝构造时对象一旦修改会互相影响,且发生内存泄漏
3. 拷贝赋值函数(copy op=)
首先检查是否自我赋值,若自我赋值,直接return *this;
。
若非自我赋值:
第一步,释放原有空间。
第二步,申请和被拷贝对象内容相同大小的新空间。
第三步,写入被拷贝内容。
最后,返回return *this;
。
4. 析构函数(dtor)
析构函数是对象在死亡前会自动调用的函数。在有指针成员的类中,必须重写一份析构函数,释放指针所指向的空间,避免造成内存泄漏。
静态相关:
1. 定义静态函数or静态数据
在声明前加static
2. 静态数据必须在类外定义
class Account
{
public:
static double m_rate;
static void set_rate(const double& x) { m_rate = x; }
};
double Account::m_rate = 8.0;
3. 静态函数没有this指针
故而只能处理static数据
4. 调用静态函数的两种方式
int main()
{
Account::set_rate(5.0);
Account a;
a.set_rate(7.0);
}
模版相关:
template<typename T>
class Complex
{
public:
Complex(T r = 0, T i = 0)
:re(r), im(i)
{}
Complex& operator +=(const Complex&);
T real() const { return re; }
T imag() const { return im; }
private:
T re, im;
};
{
Complex<double> c1(2.5, 1.5);
Complex<int> c2(2, 6);
}
补充内容
以下是在第二周的学习中写出的String.h头文件
#ifndef __MYSTRING__
#define __MYSTRING__
#include <iostream>
class String;
std::ostream& operator <<(std::ostream& os, const String str);
class String
{
public:
String(const char* cstr = nullptr);
String(const String& str);
String& operator =(const String& str);
~String();
char* get_c_str() const { return m_data; }
private:
char* m_data;
};
inline String::String(const char * cstr)
{
if (cstr)
{
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
m_data = new char[1];
*m_data = '\0';
}
}
inline String::String(const String & str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
inline String & String::operator=(const String & str)
{
if (this->m_data == str.m_data)
return *this;
delete[] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
inline String::~String()
{
delete[] m_data;
}
std::ostream & operator<<(std::ostream & os, const String str)
{
return os << str.get_c_str();
}
#endif