一、简答题
当定义类时,编译器会为类自动生成哪些函数?这些函数各自都有什么特点?
对于一个空类,会自动生成默认构造函数、析构函数、拷贝(复制)构造函数、赋值函数
类型 | 特点 |
---|---|
构造函数 | ①***没有显示定义析构函数时,编译器会自动为该类型生成默认构造函数,完成对象的初始化,函数名与类名相同、没有返回值、没有返回类型,用来初始化数据成员*** ②全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到才被调用 ③然而一个外部对象的引用性声明时,并不调用相应的构造函数,因为这个外部对象只是引用在其他地方声明的对象,并没有真正地创建一个对象。 |
析构函数 | ①函数名为~类名、没有返回值、没有返回类型,当程序执行后,系统将自动调用自动创建的析构函数,将对象释放* ②默认的析构函数不能删除new在自由存储器中分配的对象和对象成员,需要自己自定义析构函数,然后显示使用delete运算符来释放new运算符分配的内存 |
拷贝(复制)析构函数 | ①***默认拷贝构造函数:为新对象分配内存并赋值相应成员变量,函数名与类名相同、没有返回值、没有返回类型、参数为const类&*** ②显示拷贝构造函数一般要求: a)确保作为形参的引用变量(this!=&rhs) b)需要释放左操作数,防止内存泄漏 c)自己显示拷贝要用深拷贝,否则删除被引用的参数,引用的参数就会发生错误 ③若不主动编写拷贝构造函数和赋值函数,编译器将以"位拷贝"的方式自动生成缺省的函数。倘若类中有指针变量,那么这两个缺省的函数就隐含了错误 |
赋值函数 | 〇***函数名为operator=、返回值为类名、参数为const类&,用来对已存在的对象进行赋值*** ①定义类时引用符号不可以去掉,若去掉会多执行一次拷贝构造函数,效率会降低 ②不可去掉const,若右操作数是右值(不可取地址),会产生废const左值引用不大于右值的报错 ③返回类型不能是void型,否则函数连载会发生错误 |
什么是左值与右值,拷贝构造函数中的引用与const为什么不能去掉?
左值:可以取地址,内存中有实际存储
右值:不能取地址,例如临时对象、匿名对象、临时变量、字面值常量(100)都属于右值
this指针是什么?
①指针常量;
②用来指向对象本身,隐藏于非静态成员函数的第一个参数位置
必须在构造函数列表中初始化的3种情况?