简析四大函数

构造函数

    数据成员多为私有的,要对他们进行初始化,必须使用一个共有函数进行,同时这个函数应该在且仅在定义对象时自动执行一次。

1.构造函数和类的名字是一样的,且无返回值(没有返回值不是指返回值为void)。

2.对象构造时(实例化)系统自动调用。

3.构造函数在类外也可以定义(类名::)。

4.若定义中没有给出构造函数,则编译器自动生成一个缺省的构造函数,若自己定义构造函数,系统则不会自动生成。

5.无参构造函数和全缺省值的构造函数都认为是缺省构造函数,且缺省构造函数只能有一个。

6.构造函数可以重载,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载规则选一个执行。

ps:构造函数的三个作用

1.构造对象

2.初始化对象

3.类型转换

析构函数

与构造函数相反的过程

1.在类名前加~(可以理解为构造函数取反)。

2.无参数无返回值。

3.一个类仅有一个析构函数,若未显示定义,系统自动生成缺省构造函数。

4.当对象的生命周期结束时系统自动调用。

5.仅作清理工作(回收空间,关闭文件等),而不是删除对象。


拷贝构造函数

1.创建对象时用同类对象进行初始化。

2.参数必须使用引用传参(否则会造成无限递归)。

3.拷贝构造即构造函数的一个重载,是特殊的构造函数。

4.当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。这时要在内存建立一个局部变量,并把实参拷贝到新对象中去。

5.当函数的返回值值类的对象,函数执行完成返回调用者时使用。(先建立一个临时对象,再返回调用者)。

ps,局部变量在离开建立它的函数时就凋亡了,不可能在返回调用函数后继续生存,故编译器会在调用函数的表达式中创建一个无名临时变量,该临时对象的生存周期只在函数调用处的表达式中。所谓return对象,实际上是调用拷贝构造函数吧该对象的值考入临时对象中。


赋值语句

详细解析见程序。

ps:引用返回时,虽然可以节省空间和时间,但引用返回时要注意引用的对象,看引用的对象受不受函数作用域影响,若一出函数作用域就被析构,则不能引用返回。

class Test
{
public:
	//构造函数
	Test(int data=0)
		:_data(data)
	{}
	//拷贝构造函数
	Test(const Test &t)//形参一定要引用
	{
		_data = t._data;
	}
	//赋值语句
	Test& operator=(const Test&t)
		//Test& operator=(Test*const this,const Test&t),this表示当前对象地址
		//引用传参,不用调用拷贝构造函数,不用再创建新空间存储临时对象,时间和空间均节省
		//const表示是常引用,保护原对象不在函数内部被改变
		//返回对象引用类型而不是void则在调用时可以出现连等赋值,且引用可以免去调用拷贝构造函数,时间和空间均节省
	{
		if (this != &t)//判断自赋值,自己对自己赋值,无意义,浪费时间
		{
			_data = t._data;//成员一一对应
		}
		return *this;
	}
	/*
	void operator=(Test t)
	{
	if (this != &t)
	{
	_data = t._data;
	}
	}
	若赋值语句这样写,则先调用拷贝构造函数(函数的形参是类的对象),再调用赋值语句,效率低,浪费空间
	*/
	//析构函数
	~Test()
	{
	}
private:
	int _data;
};
int main()
{
	Test t;//构造函数,构造函数
	Test t1(10);//初始化,构造函数
	Test t2 = t1;//初始化,对象构造对象,调用拷贝构造函数
	Test t3;
	//Test t3();错误,这是一个函数声明,参数为空,不再是对象
	t3 = t1;//t3.operator=(&t3,t1),直接调用赋值语句
	//int value;
	//value = t4;//错误
}
时间: 2024-10-11 22:37:29

简析四大函数的相关文章

简析C++函数指针

函数指针凭借其绚丽的外表迷惑了同学们很久,这一篇文章力争让同学们彻底明白函数指针的用法. 首先有两点是必须明白的,不明白也得先记住. 函数指针的形态 C/C++ 标示符类型的定义规则 声明函数指针的形态如下 char (*f_ptr)(int, double); //返回类型 (*标示符)(形参列表) 也就是说,与其他普通类型声明方法不同,函数指针的声明并不是 [ 类型 标示符 ](如 int a)的形式. 这样声明表达的意思是: f_ptr 是一个函数指针,指向一个函数的地址. C/C++ 标

经验模态分解法简析 (转)

http://blog.sina.com.cn/s/blog_55954cfb0102e9y2.html 美国工程院士黄锷博士于1998年提出的一种信号分析方法:重点是黄博士的具有创新性的经验模态分解(Empirical Mode Decomposition)即EMD法,它是一种自适应的数据处理或挖掘方法,非常适合非线性,非平稳时间序列的处理,本质上是对数据序列或信号的平稳化处理. 1:关于时间序列平稳性的一般理解: 所谓时间序列的平稳性,一般指宽平稳,即时间序列的均值和方差为与时间无关的常数,

Java Annotation 及几个常用开源项目注解原理简析

PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示例 Override Annotation Java 1 2 3 @Override public void onCreate(Bundle savedInstanceState); Retrofit Annotation Java 1 2 3 @GET("/users/{username}&quo

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性

RecycleView + CardView 控件简析

今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleView的“列表”样式,Support包默认包含了:LinearLayoutManager  横向或纵向的滚动列表. GridLayoutManager  网格列表.StaggeredGridLayoutManager  交错的网格列表. 2.Adapter负责处理RecycleView的数据和样式 3

仿冒公检法手机诈骗简析

1 电话诈骗中的半壁江山: 仿冒公检法诈骗 电信诈骗,让人不胜其害.也让人不堪其扰,在受害者中有人倾家荡产,也有人家破人亡.2015年,全国电信诈骗发案59.9万起,被骗走222亿元,这两个数字触目惊心. 而根据腾讯移动安全/反诈骗实验室的数据显示电话诈骗损失中高达57.39%案件都是仿冒公检法诈骗,可以说仿冒公检法类是目前电话诈骗中最大的毒瘤. 2 仿冒公检法诈骗案情回顾 这个案例中诈骗骗子的诈骗套路分为以下几个步骤: 第一步:骗取信任. 骗子通过网络购买的受害者个人信息,例如身份证号.住址等

面向对象多态简析

C#&C++多态问题简析 在学习C#面向对象时,对封装和继承基本上还是理解的,但是碰到多态,基本上就是记住了个父类引用指向子类对象,在很长时间内也是一直比较困惑.学习c++时,基本上算是有了一定了解.下面结合代码解释多态问题 首先是c#代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Duo

JDK框架简析--java.lang包中的基础类库、基础数据类型

题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含量来说.还是在一个层级上,它们都是须要被编译成字节码.在JRE中执行的,JDK编译后的结果就是jre/lib下的rt.jar,我们学习使用它的目的是加深对Java的理解,提高我们的Java编码水平. 本系列全部文章基于的JDK版本号都是1.7.16. 源代码下载地址:https://jdk7.jav

cgroup原理简析:进程调度

本篇来探究下cgroup对cpu的限制机制,前文提到过cgroup也是通过进程调度子系统来达到限制cpu的目的,因此需要了解下进程调度子系统. 因为是介绍cgroup的文章,因此只介绍进程调度中与cgroup密切关联的部分,详细完成的进程调度实现可参考进程调度的相关资料. 本文分为三个部分,首先介绍进程调度中的调度算法,在该基础上引入组调度,最后结合前面文章(cgroup原理简析:vfs文件系统)来说明上层通过echo pid >> tasks, echo n > cpu.shares等