C++中的六个函数
一、构造函数
在C++中,构造函数是六个函数中的第一个,当一个对象被创建时,在它的整个周期中,是一个由生到死的过程,即构造函数创建对象,析构函数析构对象。在对象被创建时,调用构造函数创建一个对象,这是对象的创建过程。在C++中,当你创建一个对象时需要调用构造函数创建对象,在类中,有默认的构造函数,当然你也可以去使用构造函数去创建对象,对数据进行初始化。看下面的例子:
class Base { public: Base() {} Base(int a=0):num(a) {} Base(int a=0,int b=0):num(a),age(b) {} Base(int a=0,int b=0,double c=0.0):num(a),age(b),slaroy(c) {} private: int num; int age; double slaroy; };
在上面的构造函数中,构造函数必须与类名相同,构造函数是无类型的,第一个构造函数是默认的构造函数,第二个构造函数是只对一个数据成员进行初始化,其它的数据成员是随机值。第二个构造函数是对两个数据成员进行初始化,其它的数据成员为随机值。第三个构造函数是对所有的数据成员进行初始化。
二、析构函数
在C++中,构造函数是创建一个对象时,那么析构函数则是这个对象由生到死的死亡过程。同时析构函数也在析构对象时可以将已经分配的内存空间进行回收。
class Base { public: Base() {} Base() { p= new char[strlen("default")+1]; strcpy(p,"default"); } ~Base() { if(p != NULL) { delete[] p; p=NULL; } } private: char *p; };
析构函数如上所示,它无类型、无参数、无返回值,如果在构造对象时没有进行空间的开辟内存的分配时,那么
析构函数如同默认的析构函数一样,如果进行了内存的分配时,当一个对象被析构时同时还要对其所分配的内存进行回收,否则就会造成内存泄漏。
三、拷贝构造函数
在C++中,如果在构造函数中有申请内存的操作,且在其他函数中出现对象的拷贝,那么就会需要拷贝构造函数。
class Base { public: Base() {} Base() { p= new char[strlen("default")+1]; strcpy(p,"default"); } Base(const Base &s) { p= new char[strlen(s.p)+1]; strcpy(p,s.p); } ~Base() { if(p != NULL) { delete[] p; p=NULL; } } private: char *p; }; int main() { Base a; Base b(a); return 0; }
由于在主函数中出现了对对象的拷贝赋值,那么就需要拷贝构造函数,如果没有拷贝构造函数,则会使用默认的
拷贝构造函数,那么此时进行的是浅拷贝,那么会产生析构函数对内存重复释放的错误。那么此时就需要进行深拷贝
操作,重新编写拷贝构造函数对对象进行拷贝赋值。而在编写拷贝构造函数时要注意参数必须是“&”引用传递,否则
则是语法错误。
四、赋值函数
在C++中,赋值函数为第四个函数,如果在构造函数中有申请内存的操作,且在其他程序中有两个对象直接或间接
进行赋值操作,就需要赋值函数。
class Base { public: Base() {} Base() { p= new char[strlen("default")+1]; strcpy(p,"default"); } Base(const Base &s) { p= new char[strlen(s.p)+1]; strcpy(p,s.p); } Base& operator=(const Base &s) { if(&s==this) return *this; delete[] p; p= new char[strlen(s.p)+1]; strcpy(p,s.p); return *this; } ~Base() { if(p != NULL) { delete[] p; p=NULL; } } private: char *p; }; int main() { Base a,c; Base b(a); c=a; return 0; }
由于在主函数中进行了对象的赋值操作,如果没有对“=”运算符进行重载定义,则会产生两次释放同一个内存的
操作的错误。在“=”重载操作中,如果涉及到指针操作,则必须判断两个对象是否为同一个对象即自赋值操作,否则
当进行释放指针的操作时,就可能产生错误。然后要用delete释放原有的内存资源,否则将造成内存泄漏。
五、对一般对象的取址函数
在C++中,对一般对象的取址函数为第五个函数。
class Base { public: Base* operator&() { return this; } };
在一般对象的取址函数是直接返回该对象的地址,则为取其地址。
六、对常对象的取址函数
在C++中,对常对象的取址函数为第六个函数。
class Base { public: const Base* operator&() const { return this; } };
在常对象的取址函数也是直接返回该常对象的地址,则为取其地址。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 自建的纯净dns服务拦截部分广告,南方推荐
- Nginx安装lua-nginx-module模块
- IPinfo 多接口IP查询工具源码
- 教你CentOS7下如何更换内核安装BBR加速
- we-extract解析和采集微信公众号文章的账号及内容必备工具
- android九宫格可分页加载控件使用详解
- WordPress用插件实现MarkDown语法支持
- Android中实现长按照片弹出右键菜单功能的实例代码
- Android Studio无法执行Java类的main方法问题及解决方法
- PlayTube优秀的视频CMS系统/支持本地和youtube导入
- Android Studio 中运行 groovy 程序的方法图文详解
- android studio按钮监听的5种方法实例详解
- AndroidStudio3.6.1打包jar及AndroidStudio4.0打包jar的一系列问题及用法
- 教你如何在js中split函数分割字符串为数组
- [折腾]小型HTTP web服务Caddy及配置PHP