构造函数
构造函数的用处是初始化对象的成员变量,它需要在类中定义。比如举个构造函数的例子
看到了吗,上面的类Myclass里面还有一个Myclass的函数,而那个函数就是构造函数,负责在对象生成时对成员变量进行初始化。
构造函数有以下几个特点
1.函数名与类名是一样的
2.构造函数时绝对没有返回值的,C++规定如此。
加返回值会编译报错
3.在生成一个实例化对象时,会自动调用类的构造函数将对象初始化。
4.构造函数是可以重载的
从这两对截图看出构造函数是可以重载的,由于初始化调用的实参不同导致调用的构造函数不同
5.默认生成的构造函数
如果我们没有定义构造函数那么编译器就会自动生成一个无参的默认构造函数,一旦我们定义了一个构造函数,那么就不会生成编译器就不会自动生成构造函数.
6.默认构造函数
全缺省构造函数和无参构造函数和编译器自动生成的构造函数都为默认构造函数,但是无参构造函数不能和全缺省构造函数同时存在否则编译器会报错
像这种同时存在无参和全缺省的构造函数就会发生编译错误。
因为如果你让MyClass MD;那么编译器就不知道要调用那个构造函数,存在歧义。
意思就是说不传实参也能调用的构造函数都为默认构造函数,且不能同时存在。
7.设置自定义类型默认调用它的初始化
C++把类型分为内置类型和自定义类型,内置类型就是语言提供的原生数据类型,如int/char/double/指针等,自定义类型就是我们自己定义的类型比如用class和struct定义的类型。
对于内置类型类中的默认构造函数可以将它初始化,但是对于自定义类型,类中的默认函数无法将它初始化,但在这个类中生成对象时,会自动调用自定义类型的类中的默认构造函数,但是如果这个自定义类型中的类没有默认构造函数那么编译器就会报错,默认构造函数又分为,无参构造函数,全缺省构造函数,我们不写编译器自动生成的构造函数,
假如我们写一个半缺省的构造函数
那么这时编译器运行就会报错
自定义类型没有调用默认函数初始化就会报错
那么内置类型被初始化后的值是什么呢??
让我们看代码
你们看这个代码,调用了默认的构造函数,但是对内置类型初始化是一个随机值。
析构函数
1.析构函数的定义
1.析构函数名和类名差不多,就是在类名前加一个~符号比如
2.无参数也无返回值(和构造函数差不多,不需要加了类型什么void的之类的)
3.一个类只能有一个析构函数,若未显示定义,系统会自动生成默认的析构函数。
4.对象生命周期结束时,系统会自动调用析构函数
5.和构造函数类似,我们不写编译器会自动生成一个析构函数,但这个析构函数对内置类型不做处理,自定义类型会调用它的类的析构函数,自定义类型无论什么时候都会调用它的析构函数,但是和类不同的时自定义类型的析构函数不会因为定义的问题而发生报错
6.对于类如果它的类型全是内置类型数据,那么我们可以不写析构函数,但是如果它有对内存空间的申请,那么我们就需要写析构函数,否则会发生内存泄漏问题
7.一个局部域的对各对象,C++规定后定义的先析构
2.析构类型的用法
当类创建对象时可能会向系统申请空间比如:
像这种在建立对象时有对系统申请空间,那我们要怎么访问这个arr然后去向系统还掉这份空间呢
难道是在类的内部建立一个释放空间的函数吗比如:
难道我们要这样去写吗,每次建立一个对象都要再调用它的销毁函数???
C++为我们提供了更加简单的方案,
当对象中没有对系统申请空间的程序时,编译器会生成默认的析构函数,这时我们也就不需要写析构函数,但当我们有对系统申请空间时,我们需要自己写析构函数,如下图
当对象的生命周期结束时,就会自动调用它的析构函数,这样之后写代码就不需要我们挨个去销毁了。