深刻理解--->类的六大默认成员函数

来源:互联网 发布:单片机程序编写 编辑:程序博客网 时间:2024/04/27 16:23

一、类默认的六个函数

1.构造函数开辟空间,strcpy()函数,字符串拷贝,可以重载,不同的基本数据类型字符串指针类型的话,需要考虑为NULL的情况。

2.析构函数:在不为空的情况下,释放字符串数组,然后赋空预防野指针。

3.拷贝构造函数:对象给对象赋值,牵扯到资源分配(成员中含有指针),就必须重写深拷贝构造函数和赋值运算符的重载避免浅拷贝:只是简单的拷贝一个指针指向,最后析勾对象的时候,会出现多次析勾,造成程序奔溃),深拷贝:真实的为新对象开辟空间。拷贝构造函数还要注意,其函数参数必须是引用,否者会出现无限递归,所以语法要求函数参数必须是引用。

4.赋值运算符的重载:四步骤 :判断自赋值 +析勾当前对象 +构造当前对象(赋值)+返回当前指针

注意:

A、赋值运算符的重载函数参数列表应该是const引用,不能修改它的参数,起到保护参数的左右,还有一个作用就是const引用形参可以接受非cons实参和const形参, 而非const形数就不能接受const的实参,引用传递还有不会产生副本,避免了实参对象给形参对象初始化,调动拷贝构造函数

B.函数返回值,不必要产生副本,直接返回当前对象,即把*this返回,函数返回值以引用接受。

就不会产生副本,也就不会调动拷贝构造函数(构造无名临时对象),析构函数,程序效率大大提高。

C.自赋值的判断是必要的,如果对象给对象自己赋值,没有意义就没有必要再去开辟空间,直接返回*this,提高效率,还有一个功能是假如p = _p ,一般情况我们的p的空间都是new出来的,赋值之前先要释放空间然后赋空,最后再重新开辟空间,,如果p和_p指向同一块空间,先释放p,相当于也把_p的空间释放了,造成错误,所以自赋值的检查是必要的!

D. String A;    

A = "Hello";这是赋值;因为A对象是已经构造过的,即已经分配空间,所以是赋值

String A = "Hello"; 这个是实例化,初始化对象,调动响应的构造函数,A对象还没有构造出来,还没分配空间,所以是初始化也叫实例化对象。

5.取地址运算符的重载(普通方法)

Test * operator&()

{

    return this;

}

6.取地址运算符的重载(常方法)常引用,常返回

const Test * operator&()const

{

    return this;

}

常引用可以接受常量,或者非常量, 但是常量只能接受常量引用

扩展什么是常方法

第一个const是函数的返回值具有常性,不能修改

第二个const是函数的形参具有常性,与你传过来的实参是不是常量没有关系,又不是引用传递,只是值传递。

第三个const是修饰整个方法具有常性,其实质就是*this 具有常性,函数改写过来就是

即常方法不能修改数据成员。

什么是this指针?

在C++中,如果是类的成员方法,通过对象调动类方法,系统会自动给我们默认生成一个指针名字叫this,指向当前对象,其中*this就是当前对象(调动类方法的那个对象)。


 

 

什么是常引用?

引用的变量b具有常性就是常引用,即常量必须常引用

引用的变量不具有常性,我们就可以常引用或者非常引用

原创粉丝点击