构造函数

 

默认构造函数:(不接受任何参数的构造函数)

如果你创建了任何构造函数,编译器将不会提供默认构造函数。因此,如果需要一个不接受参数的构造函数,且已经创建了其他构造函数,则必须自己添加默认构造函数。

初始化对象:

在初始化阶段进行初始化(为佳)或者在构造函数体中进行赋值(初始化阶段赋值,函数体中再次赋值,效率不好)。在初始化阶段初始化成员变量更清晰且效率通常更高。

//    Animal::Cat():itsAge(5),itsWeight(8)    {   } 

Rectangle::Rectangle():

itswidth(5),itslength(10)  {     }

Rectangle::Rectangle(int width, int lenght):itsWidth(width),itsLength(length){    }

 

复制构造函数

编译器除提供默认构造函数和析构函数外,还提供一个默认复制构造函数(第四个为复制赋值运算符)。每当创建对象的拷贝时,都将调用复制构造函数。如按值传递对象时,无论是传入函数还是作为函数的返回值,都将创建该对象的一个临时拷贝。如果该对象是用户定义的对象,将调用相应类的复制构造函数。

所有复制构造函数都接受一个参数:指向其所属类的对象的引用。一般情况将该引用声明为const,复制构造函数不会修改传入的对象:

Cat(const Cat &theCat);

Cat构造函数接受一个指向Cat对象的const引用,该复制构造函数旨在创建一个theCat拷贝。默认复制构造函数将作为参数传入的对象的每个成员变量复制到新对象的成员变量中,这被称为成员复制(浅复制),这对大多数成员变量可行(存储在堆栈中),但对于指向自由存储区中对象的指针成员变量是不可行的。成员浅复制只是将对象成员变量的值复制到另一个对象中,两个对象中的指针最后将指向同一个内存块。而深层复制将是在堆中分配的值复制到新分配的内存。

如下操作:在Cat类中有一个名为itsAge的int指针指向自由存储区(堆)。如果启用默认复制构造函数,将复制Cat对象的这个指针,这两个指针将指向自由存储区中同一个内存块。

但是,假如其中一面,比如原始Cat对象的析构函数释放了这块内存,而新的Cat对象仍指向该块内存,将生存迷途指针(指针未初始化或者delete对象后未赋值为空)。

这种问题的解决方法是,创建自己的复制构造函数并根据内存的需要,分配内存,便可以将原来的值复制到新内存中,这称为深层复制。

      

  

复制构造函数从第29行开始,参数是rhs,表示right hand side。第31和32行在自由存储区中分配内存,然后第33和34行将原有Cat对象中的值赋给新的内存单元。参数rhs是一个作为const引用传入复制构造函数的Cat对象,rhs拥有与其他任何Cat对象相同的成员变量。

读懂第52行:使用复制构造函数,即新建了一个名为Boost的Cat对象,此时默认构造函数会被调用。然后52行传入了Frisky对象来复制,因此调用第29行的复制构造函数,rhs为Frisky的别名,此时重新分配内存,重新赋值,实现深层复制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值