C++的六个函数
一、构造函数
在C++中,构造函数是六个函数中的第一个,当一个对象被创建时,在它的整个周期中,是一个由生到死的
过程,即构造函数创建对象,析构函数析构对象。在对象被创建时,调用构造函数创建一个对象,这是对象的创
建过程。在C++中,当你创建一个对象时需要调用构造函数创建对象,在类中,有默认的构造函数,当然你也可
以去使用构造函数去创建对象,对数据进行初始化。看下面的例子:
class Base
{
public:
Base()
{}
Base(int a=):num(a)
{}
Base(int a=,int b=):num(a),age(b)
{}
Base(int a=,int b=,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")+];
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")+];
strcpy(p,"default");
}
Base(const Base &s)
{
p= new char[strlen(s.p)+];
strcpy(p,s.p);
}
~Base()
{
if(p != NULL)
{
delete[] p;
p=NULL;
}
}
private:
char *p;
};
int main()
{
Base a;
Base b(a);
return ;
}
由于在主函数中出现了对对象的拷贝赋值,那么就需要拷贝构造函数,如果没有拷贝构造函数,则会使用默认的
拷贝构造函数,那么此时进行的是浅拷贝,那么会产生析构函数对内存重复释放的错误。那么此时就需要进行深拷贝
操作,重新编写拷贝构造函数对对象进行拷贝赋值。而在编写拷贝构造函数时要注意参数必须是“&”引用传递,否则
则是语法错误。
四、赋值函数
在C++中,赋值函数为第四个函数,如果在构造函数中有申请内存的操作,且在其他程序中有两个对象直接或间接
进行赋值操作,就需要赋值函数。
class Base
{
public:
Base()
{}
Base()
{
p= new char[strlen("default")+];
strcpy(p,"default");
}
Base(const Base &s)
{
p= new char[strlen(s.p)+];
strcpy(p,s.p);
}
Base& operator=(const Base &s)
{
if(&s==this)
return *this;
delete[] p;
p= new char[strlen(s.p)+];
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 ;
}
由于在主函数中进行了对象的赋值操作,如果没有对“=”运算符进行重载定义,则会产生两次释放同一个内存的
操作的错误。在“=”重载操作中,如果涉及到指针操作,则必须判断两个对象是否为同一个对象即自赋值操作,否则
当进行释放指针的操作时,就可能产生错误。然后要用delete释放原有的内存资源,否则将造成内存泄漏。
五、对一般对象的取址函数
在C++中,对一般对象的取址函数为第五个函数。
class Base
{
public:
Base* operator&()
{
return this;
}
};
在一般对象的取址函数是直接返回该对象的地址,则为取其地址。
六、对常对象的取址函数
在C++中,对常对象的取址函数为第六个函数。
class Base
{
public:
const Base* operator&() const
{
return this;
}
};
在常对象的取址函数也是直接返回该常对象的地址,则为取其地址。
C++的六个函数的更多相关文章
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- [SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式
SQL 基础知识梳理(六)- 函数.谓词.CASE 表达式 目录 函数 谓词 CASE 表达式 一.函数 1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”. 2. ...
- Python学习(六) —— 函数
一.函数的定义和调用 为什么要用函数:例如,计算一个数据的长度,可以用一段代码实现,每次需要计算数据的长度都可以用这段代码,如果是一段代码,可读性差,重复代码多: 但是如果把这段代码封装成一个函数,用 ...
- 第六章 函数、谓词、CASE表达式 6-2 谓词
一.什么是谓词 需要满足返回值为真值的函数.谓词的返回值全都是真值(TRUE/ FALSE/UNKNOWN) 如:LIKE/BETWEEN /IS NULL/IS NOT NULL/IN/EXISTS ...
- Python(六) Python 函数
一.认识函数 help(方法名字) help(round) 1.功能性 2.隐藏细节 3.避免编写重复的代码 4.组织代码 自定义函数 二.函数的定义及运行特点 # 递归 def sum_num(n ...
- JavaScript初探系列(六)——函数
一.概述 (一)函数的声明 JavaScript 有三种声明函数的方法. (1)function 命令 function命令声明的代码区块,就是一个函数.function命令后面是函数名,函数名后面是 ...
- Python第六章-函数04-递归函数和拉姆达表达式
五.递归函数 什么叫递归(recusive)? 你拿两个镜子互相面对着, 然后去看镜子, 会发现每个镜子中很多个镜子, 层层的嵌套, 无穷尽, 这就是一种递归! 从前有坐山, 山里有座庙, 庙里有个老 ...
- 【Python基础学习六】函数
1.创建函数 Python中函数的关键字def来定义. def fibs(num): f=[0,1] for i in range(1,num): f.append(f[-1]+f[-2]) retu ...
- MySQL(六) —— 自定义函数
自定义函数 用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 参数,返回值 创建自定义函数 CREATE FUNCTION f ...
随机推荐
- intelliJ IDEA 怎么添加本地的idea web项目
概述:这篇文章主要讲述idea开发工具怎么添加本地的idea web项目. 一:首先介绍一下idea web项目的目录结构: 上图详细简单的说了一下idea web项目的文件情况. 二:说明一下部署本 ...
- 移动 App 接入 QQ 登录/分享 图文教程
移动 App 接入 QQ 登录/分享 图文教程 这里先要提两个平台,腾讯开放平台和 QQ 互联平台: (一)腾讯开放平台 官网地址:https://open.tencent.com/ 介绍:腾讯开放平 ...
- 你真的了解Fragment的生命周期吗?
Android Framwork开发人员中的传奇人物Dianne Hackborn在2010年将Fragment引入了Android,也就是在android3.0之后引入Fragment,他在提交信息 ...
- 三层构架 和 MVC 是什么?
作者:肖继潮链接:https://www.zhihu.com/question/24291079/answer/27339010著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 企 ...
- maven(18)-mybatis generator插件
generator的作用 使用mybatis框架,在初始项目或修改数据库时,相应的要在JAVA项目中去写一些数据模型文件,DAO,映射XML等配置,而这个插件的作用就是自动生成这些文件,以节省大 ...
- 使用mybatis plus自动生成controller、service、dao、mapper、entity代码
官网:http://mp.baomidou.com(这个项目不仅仅可以用于代码生成,还有分页等其他功能,是对mybatis的一层封装) 要求:基于sql自动生成domain.controller.se ...
- Stop-VM
stop-vm vm01 -force 正常关机,留给Guest 5分钟保存数据,然后关闭 stop-vm vm02 -turnoff 断电关机 Windows Server 2008 R2默认没有 ...
- [tools]excel转lua的python实现
time:2015/04/13 描述:需要将excel表格内容转成lua,并且作为工具使用,能够批量转换 步骤: (1)文章[1]已经做了大部分的内容,而且也已经能够使用了 (2)根据自己新的需求: ...
- Office 365实现单点登录系列(1)—域环境搭建
Hello 小伙伴们, 2018新年快乐,作为2018年首篇文章,怎么能不给大家带来点干货呢?这篇文章其实我9月底的时候已经在MSDN上发布过了,为表诚意,我更新了这篇文章,并把它组成了一个系列,2. ...
- 简单转java-web项目