首页 / C++ / C++入门——类的六个默认成员函数
C++入门——类的六个默认成员函数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++入门——类的六个默认成员函数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3097字,纯文字阅读大概需要5分钟。
内容图文
1. 构造函数
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,并且在对象的生命周期内只调用一次。构造函数的主要任务并不是开空间创建对象,而是初始化对象。
特征如下:
- 函数名与类名相同
- 无返回值
- 对象实例化时编译器自动调用对应的构造函数
- 构造函数可以重载
- 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成
- 默认构造函数最多只能有一个。无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。
- 初始化列表
- 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式
- 成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
- 构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用(隐式转换)
单参构造函数隐式转换举例:
class A {
public:
A(int x):a(x) { }
private:
int a;
};
int main() {
A a = 1;
return 0;
}
在main函数中,使用了一个int类型的变量对A类型的对象a进行赋值,实际上是编译器自己构造了一个匿名对象给对象a进行赋值。
为了禁止隐式转换,可以使用explicit修饰构造函数。
class A {
public:
explicit A(int x):a(x) { }
private:
int a;
};
int main() {
A a = 1;
return 0;
}
这样编译器就会禁止将 1 赋值给 a 的操作。
2. 析构函数
对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
特征如下:
- 函数名:~类名
- 无参数无返回值
- 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数
- 对象生命周期结束时,C++编译系统系统自动调用析构函数
- 析构函数的函数名是确定的,不能重载
注:程序运行时会在初始化对象前先将其对应的析构函数压栈,因此在生命周期相同时,先构造的对象后析构,原理和出栈相同。
3. 拷贝构造函数
拷贝构造函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
特征:
- 拷贝构造函数本质上是构造函数的一种重载形式
- 拷贝构造函数的参数只有一个且必须使用引用传参
- 若未显示定义,系统生成默认的拷贝构造函数(浅拷贝)
- 为什么必须使用引用传参
先看下面的代码:
在使用a1对a2进行初始化的时候,先把a1作为参数传给函数A(A a)class A { public: A(int x = int()):_x(x) { } A(A a) { _x = a._x; } private: int _x; }; int main() { A a1(0); A a2(a1); return 0; }
但是a作为一个A类型的形参,它也需要调用拷贝构造来完成它自己的初始化,于是它又将a1作为参数传给了形参它自己的拷贝构造
于是乎,一层套一层,形成了一个死循环。
所幸,编译器禁止套娃。
4. 赋值运算符重载
赋值运算符主要需要注意几点:
- 参数类型
- 返回值
- 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成浅拷贝
- 参数类型
参数类型不多说了,最好使用const引用类型的参数 - 返回值
返回值可以使用void,这样就可以禁止连续赋值。
也可以使用引用类型支持连续赋值,最好传引用,传值需要重新拷贝构造一个匿名对象作为返回值,可能会由于匿名对象的生命周期而出现问题(当然前提是你的拷贝构造最好不要有什么问题) - 什么情况下会调用
有下面两种情景
-
int a = b;
-
情景1在定义的同时赋初值,这叫初始化,直接调用拷贝构造;int a; a = b;
情景2才会调用赋值函数。
5. . 取地址及const取地址操作符重载
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容。
最好还是不要重载,除非不想用指针了(引用还是可以用的)。
内容总结
以上是互联网集市为您收集整理的C++入门——类的六个默认成员函数全部内容,希望文章能够帮你解决C++入门——类的六个默认成员函数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。