C++——类中的六个默认函数

对象:内存单元+资源 

定义:开辟内存,产物为变量

生成:1.开辟空间

           2.调用构造函数(给开辟的内存初始化)

销毁:1.调用析构函数(释放资源)

           2.释放空间

类中的六个默认函数:析构函数、构造函数、拷贝构造函数、赋值运算符重载函数、取地址操作符的重载函数、const修饰的求地址符重载函数

1.构造函数(实现初始化,与类名相同)

作用:给对象所占的内存初始化(赋资源)

特点:1.可以重载

           2.不依赖对象调用,不可以手动调用

CLink()
{
    phead=new NOde();
    phead->next=NULL();
}
int main()
{
    CLink cl;//1.开辟空间 2.系统调用不带参数的构造函数
    cl.show();
    cl.destroyed();
    return 0;
}
Clink(int size)//个数 带参的构造函数
{
    phead = new Node();
    phead->next=NULL;
    for(int i=0;i<10;i++)
    {
        insertHead(0);
    }
}

系统提供的构造函数为空函数,不带参数

Clink()

{

}

2.析构函数(与destroyed作用相同,函数名与类名相同)

特点:1.不可重载

           2.依赖对象的调用,手动调用析构函数-->退化成普通函数的调用(可能会造成重复释放)

作用:释放除栈以外的其他资源

系统提供的函数特点:1.public 2.inline(代码展开后为空函数)

this指针:this指向对象所占的空间

3.拷贝构造函数

    String str1("hello");
    String str2 = str1; //==>   String str2(str1);

作用:已存在的对象来生成相同类型的新对象 

	String(const String& rhs)
	{
		mptr = new char[strlen(rhs.mptr) + 1]();
		strcpy_s(mptr, strlen(rhs.mptr) + 1, rhs.mptr);
	}

特点:1.形参一定要是引用(递归调用拷贝构造函数生成形参对象,最终递归调用导致栈溢出)
           2.默认的拷贝构造函数是一个浅拷贝(类成员变量有指针类型,考虑是否实现深拷贝)

默认的拷贝构造函数

String str1("hello");
    String str2=str1;
    String(const String& rhs)
    {
        mptr = rhs.mptr;
    }

str2先释放,str1变为野指针

浅拷贝与深拷贝

浅拷贝:赋值。如果有指针,两个指针指向相同的内存

深拷贝:开辟独立内存(资源独立)。如果有指针,两个指针拥有各自的内存

4.赋值运算符的重载函数

作用:拿一个已存在的对象给另一个相同类型的已存在对象赋值

void operator=(const String& rhs)
{
	if (this == &rhs)//处理自赋值情况
	{
		return;
	}
	delete[] mptr;
	mptr = new char[strlen(rhs.mptr) + 1]();
	strcpy_s(mptr, strlen(rhs.mptr) + 1, rhs.mptr);
}

实现步骤:

1.自赋值处理

2.释放旧资源

3.开辟新资源

4.赋值

特点:默认赋值运算符重载函数也是浅拷贝


版权声明:本文为m0_43400852原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。