武汉PHP培训
达内武汉民大中心

15827352908

热门课程

构造函数和析构函数

  • 时间:2017-12-13 18:57
  • 发布:武汉PHP培训
  • 来源:互联网

今天,达内武汉php培训的小编将要给大家带来的是构造函数和析构函数

构造函数:

①构造函数一般是公有的,作用是初始化数据成员。

②构造函数一般不能被显式调用,他们总是被编译器自动调用的。一个类可以有多个构造函数。

③构造函数和类同名。一个类里如果有多个构造函数,那么参数(个数/类型)必然不同。

④构造函数返回一个类的对象。但是构造函数却没有返回类型,也不允许有(void都不能有)。

⑤如果一个构造函数没有参数,这个构造函数叫“默认构造函数”。如果在类里没有定义构造函数,编译器将生成一个默认的构造函数。默认的构造函数将不会初始化数据成员。如果我们显式的定义了一个构造函数。编译器将不再会自动生成一个默认的构造函数。

拷贝构造函数:从已经存在的一个对象来拷贝一份,用拷贝的东西来创建一个新的对象。

例:

class A

{

public:

☆  A(); //默认构造函数;

☆  A(int, int); //标准的构造函数;

☆  A(int a=1); //变体的默认构造函数;

☆  A(const A& a); //拷贝构造函数;

};

int main()

{

A b;

☆  A a(b); //拷贝构造;

☆  A c=b; //拷贝构造,在赋值之前c不存在,所以不是赋值,而是拷贝构造一个新的对象c;

A d;

☆  d=b;    //对象之间成员的一一赋值,因为d是已经存在的对象;

A x;

☆  A* p=new A(x); //调用拷贝构造函数,把对象的地址赋给了p。在栈上分配的空间有名字,在堆上分配的空间没有名字,只有地址;

A a;

a.foo();

A* pa=new A();

pa->foo();

}

拷贝构造被条用的情况:

①用已经存在的对象来初始化另一个对象;

②用对象做函数的参数传值的时候,或者函数返回一个对象值时调用拷贝构造函数;

③用new来动态分配内存的时候;【A* p=new A(x);】

例:

void func(A a); //值传递;

A func();

A c;

func(c); //传值的时候形参是实参的一个拷贝;

△在特殊情况下,参数必须传引用,如果传值,拷贝函数将陷入一个无限的循环。

?如果没有定义拷贝构造函数,编译器会提供一个默认的拷贝构造函数,但这个拷贝函数只实现一个浅拷贝(logic copy)。

析构函数:是一个特殊的函数,是用来释放内存的,当对象离开作用域的时候。

①析构函数不能被显式调用;

②析构函数和类同名,多了一个“~”;

③析构函数没有返回值,也不允许有返回类型;

④如果没有定义一个析构函数,编译器会默认的生成一个析构函数,但是这个析构函数只释放数据成员所占用的内存。如果数据成员里面有指针,则只释放指针所占的内存,不释放指针指向的堆内存。所以在数据成员有指针的情况下,必须自定义析构函数来释放指针指向的堆内存。以免内存泄露。

如果一个数据成员有指针动态分配内存,那么在类里面我们应该定义拷贝构造函数,析构函数和重载的赋值函数。称为三要素。要定义这三个要素的原因是为了实现深拷贝。

以上就是今天的分享干货,更多内容敬请关注达内武汉php培训的官网!

马上预约七天免费试听课

姓名:

电话:

上一篇:学PHP,自学还是培训?
下一篇:工作5年,转行难不难?

达内教育集团总裁韩少云:双师模式的实践与思考

达内与广西教育学院携手签约,共建专业开启校企合作新阶段!

Java工程师岗位面试总结,看完了才发现知识不够用!

PHP中的堆是如何工作?

选择城市和中心
贵州省

广西省

海南省

有位老师想和您聊一聊