一、只要类中带有指针,则类中必须有Big Three。
Big Three 分别是:
1.拷贝构造函数: string(const string& other);
简称 copy ctor
2.拷贝赋值:string& operator = (const string& other);
简称 copy op=
3.析构函数: ~string();
拷贝赋值不等于拷贝构造
string s3(s1);
与s3 = s1;
不一样,前者是拷贝构造的方式进行初始化,而后者是赋值,需要重载=,是拷贝赋值。
在构造函数中,需要对指针进行动态内存分配,而在析构函数中,需要消除该内存空间。
new 与 delete对应;
new TypeName[] 与 delete[] pointer name 对应
拷贝赋值经典写法:
-检查赋值对象与被赋值对象是否是同一地址(检测自我赋值),是的话直接地址返回被赋值对象。一方面可以提高效率,另一方面是比较出现赋值对象的内存空间被同一地址的被赋值对象消除,以至于在接下来的步骤中出错;
-先清空被赋值对象的内存空间;
-再动态创建一个被赋值对象的新内存空间;
-再赋值。
二、stack(栈)与heap(堆)
图中表示的是动态分配所得到的内存块
红色的称为cookies,用来表示内存块的起始位置与终点位置;
灰色的是调试模式下才有的
绿色的则是类在栈中的内存模型
浅绿色的是为了内存对齐,需要能够被16整除,所以原本是占了52个单元,但实际上是占用了64个单位的内存空间。
三、Singleton
有时候一个类不希望被其他人创建对象,则可以将构造函数设为私有,此时该类的使用方式会比较特别:
class A{
public:
static A& getInstance(return a;);
setup() {...}
private:
A();
A(const A& rhs);
static A a;
...
};
使用方法:
A::getInstance().setup();
或者是另一种写法
class A{
public:
static A& getInstance(return a;);
setup() {...}
private:
A();
A(const A& rhs);
...
};
A& A::getInstance()
{
static A a;
return a;
};
使用方法:
A::getInstance().setup();
网友评论