【C++】默认成员函数

前言

一、什么是默认成员函数

二、构造函数

三、析构函数

四、拷贝构造

五、赋值运算符重载

六、const成员

七、&运算符重载(了解)

总结:


前言

  • 这一节主要讲四个默认成员函数、运算符重载,
  • 复习this指针的用法
  • 理解浅拷贝

一、什么是默认成员函数

  • 默认成员函数,产生在类中,就有初始化、清理、拷贝的作用。
  • 在类中,我们可以实现默认成员函数(自己写),那如果我们没有写这个函数,编译器也会自动实现,所以叫做默认成员函数

现在我们可以理解,如果一个类是空类,那么它也包含默认成员函数

二、构造函数

一个类实例化后,就应该对类进行初始化

C++提供的初始化函数叫做构造函数,类实例化后自动调用构造函数,完成初始化工作

1、无参构造函数

  •  没有参数,那么在构造函数里面,我们就要对各个数据进行初始化
  • 调用无参构造函数,就是类的实例化,因为创建时,构造函数自动调用

2、带参构造函数

  •  构造函数可以重载,所以我们在写构造函数时,一般都对参数进行重载
  • 在调用时,在实例化后要加上()

3、自动构造函数(一般不用)

在class中,没有写构造函数,那么编译器在实例化后将自动生成构造函数

生成的构造函数,初始化成随机值

如果类中有嵌套,并且嵌套的类有构造函数,那么会嵌套的类会调用自己写好的构造函数初始化

注意点:

  • 一般而言,用带参构造函数,并且有重载
  • 无返回值


三、析构函数

  • 在对象生命周期结束时,自动调用,完成类的清理工作

1、定义

  • ~+ __(类名)
  • 无参数,无返回值

  •  析构函数的调用,主要是防止内存泄漏,像栈、队列、链表等都要调用

但也有许多不需要写,由编译器自动产生即可

2、特性

  • 一个类有且只有一个析构函数
  • 类中有自定义成员,类也会调用自定义成员的析构函数


四、拷贝构造

用于对已创建好的类,进行拷贝,得出一个新类

1、 定义:

  • 类名+(const 类名 &  变量) 参数要用引用接收,否则会造成无限递归

原因:1、要先开一块空间  2、开空间就要调用构造,再次调用拷贝构造,就一直递归下去

2、特性:

  • 拷贝构造是构造函数的一个重载
  • 这里蕴含this指针
  • 不写拷贝构造函数,编译器会自动生成一个拷贝构造   

将拷贝对象 一个字节一个字节的拷贝   这种方式是浅拷贝 。编译器产生的拷贝函数会满足绝大多数环境,但涉及动态内存、内存释放等就不适用

原因:动态内存一般存储指针,那么拷贝时,俩个数据指向同一块空间,一旦一个数据生命周期结束,内存就要释放,指针就要置空,同一块内存只能释放一次,所以程序会奔溃


五、赋值运算符重载

1、operator

对于内置类型,有运算操作   比如(+、-、*、=、==)等

自定义运算符就有运算符重载 

定义:

  • 返回值类型 operator 操作符 ( 参数关系)
  • 形参看起来比实际操作数目少一个成员

原因:这里存在this指针 例如 s1=s2,那么参数是 (const 类名 形参名)代表s2,s1由this指针表示。

注意:

  •  不能是其他运算符 如@
  • 不能是 .*    ::   sizeof     ? :     .   等五种

 2、赋值运算符

 注意点:

  • 返回类型
  • 返回是*this
  • 编译器会自动生成一个赋值运算,按字节拷贝

六、const成员

  • const修饰类的函数成员,表示不能对函数的类成员进行任何修改
  • 其中隐含this指针

一般而言,对于值不改变的对象,在函数定义或者生命末尾加上const

这里就涉及权限的放大和缩小,权限可以缩小,不能放大

思考以下题目:

  • const对象可以调用非const成员函数吗?      不能,权限放大
  • 非const对象可以调用const成员函数吗?       可以,权限缩小
  • const成员函数内可以调用其它的非const成员函数吗?       不能,权限放大
  • 非const成员函数可以调用其他的const成员函数吗?           可以,权限缩小

七、&运算符重载(了解)

这个运算符一般不需要写,编译器会自动生成,而在绝大情况下,都能适用。


总结:

这一节,主要讲几个成员函数的用法和特性

  • 一般来说,构造函数必须有,析构,拷贝赋值在某些情况下可以用编译器的
  • 浅拷贝就是编译器自动生成拷贝构造和operator=  按字节拷贝

————编程没有捷径。

猜你喜欢

转载自blog.csdn.net/m0_73299809/article/details/128583371