【c++】-对象的初始化-构造函数和析构函数区别联系-总结

本文主要是介绍【c++】-对象的初始化-构造函数和析构函数区别联系-总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

对象的初始化

1.构造函数和析构函数

构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数的功能是在创建对象时,使用给定的值来将对象初化。析构函数的功能是用来释放一个对象的,在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。下面举一例子来说明构造函数和析构函数的特点:
class TDate
{
public:
TDate(int y, int m, int d);
~TDate();
int IsLeapYear();
void Print();
private:
int year, month, day;
};

//类的实现部分
TDate::TDate(int y, int m, int d)
{
year = y;
month = m;
day = d;
cout<<“构造函数已被调用。\n”;
}

TDate::~TDate()
{
cout<<“析构函数被调用。\n”;
}

int TDate::IsLeapYear()
{
return(year%40 && year%100!=0) || (year%4000);
}

void TDate::Print()
{
cout<<year<<“.”<<month<<“.”<<day<<endl;
}

类体内说明的函数TDate()是构造函数,而~Tdate()是析构函数。

    【构造函数】的特点如下:1、构造函数是成员函数,函数体可写在类体内,也可定在类体外。2、构造函数是一个特殊的函数,该函数的名字与类名相同,该函数不指定类型说明,它有隐含的值,该值由系统内部使用。该函数可以一个参数,也可以有多个参数。3、构造函数可以重载,即可以定义多个参数个数不同的函数。4、程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。【析构函数】的特点如下:1、析构函数是成员函数,函数体可写在类体内,也可定在类体外。2、析构函数也是一个特殊的函数,它的名字同类名,并在前面加“~”字符,用来与构造函数加以区别。析构函数不指定数据类型,并且也没有参数。3、一个类中只可能定义一个析构函数。4、析构函数可以被调用,也可以系统调用。在下面两种情况下,析构函数会被自动调用。· 如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用。· 当一个对象是使用new运算符被动态创建的,在使用delete运算符释放它时,delete将会自动调用析构函数。

下面用一程序说明构造函数和析构函数的应用:

#include <iostream.h>
#include <conio.h>
#include “tdate.h” //类的定义存放在该文件中

void main()
{
TDate today(1998, 4, 9), tomorrow(1998, 4, 10);
cout<<“Today is:”;
today.Print();
cout<<“Tomorrow is:”;
tomorrow.Print();
getch();
}

读者可以自行调试该程序,并分析其结果。要在VC环境下调试该程序,要对程序进行一些参数设置,否则无法正常运行(主要是去掉MFC的支持——该程序无需MFC的支持)。

缺省构造函数和缺省析构函数

在类定义时没有定义任何构造函数时,则编译器自动生成一个不带参数的缺省构造函数,其格式如下:

<类名>::<缺省构造函数名>()
{
}

按构造函数的规定,缺省构造函数名同类名。缺省构造函数的这样格式也可由程序员定义在类体中。在程序中定义一个对象而没有指明初始化时,则编译器便按缺省构造函数来初始化该对象。用缺省构造函数对对象初始化时,则将对象的所有数据成员都初始化为零或空。同理,如果一个类中没有定义析构函数时,则编译系统也生成一个称为缺省析构函数数,其格式如下:

<类名>::~<缺省析构函数名>
{
}

<缺省析构函数名>即为该类的类名。缺省析构函数是一个空函数。

2.拷贝初始化构造函数

拷贝初始化构造函数是一种特殊的成员函数,它的功能是用一个已知的对象来初始化一个被创建的同类的对象。拷贝初始化构造函数实际上也是构造函数,它是在初始化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。拷贝初始化构造函数的特点如下:1、该函数名同类名,因为它也是一种构造函数,并且该函数也不被指定类型。2、该函数只有一个参数,并且是对某个对象的引用。3、每个类都必须有一个拷贝初始化构造函数,其格式如下:<类名>::<拷贝初始化构造函数名>(const<类名>&<引用名>)其中,<拷贝初始化构造函数名>是与该类名相同的。const是一个类型修饰符,被它修饰的对象是一个不能被更新的常量。如果类中没有说明拷贝初始化构造函数,则编译系统自动生成一个具有上术形式的缺省拷贝初始化构造函数。作为该类的公有成员。

下面举一例子说明拷贝初始化构造函数

class TPoint
{
public:
TPoint(int x, int y) {X=x; Y=y;}
TPoint(TPoint & p);
~TPoint() {cout<<“析构函数被调用。\n”;}
int Xcoord() {return X;}
int Ycoord() {return Y;}
private:
int X, Y;
};

TPoint::TPoint(TPoint & p)
{
X = p.X;
Y = p.Y;
cout<<“拷贝初始化构造 函数被调用。\n”;
}

#include <iostream.h>
void main()
{
TPoint P1(5, 7);
TPoint P2(P1);
cout<<“P2=”<<P2.Xcoord()<<“,”<<P2.Ycoord()<<endl;
}

该程序的输出结果为:

拷贝初始化构造函数被调用。
P2=5,7
析构函数被调用。
析构函数被调用。关于拷贝初始化构造函数的其他用法,可从下例看出:

#include <iostream.h>
#include “tpont.h” //类的定义放于该文件中
TPoint f(TPoint Q);
void main()
{
TPoint M(20, 35),P(0, 0);
TPoint N(M);
P = f(N);
cout<<“P=”<<p.Xcoord()<<“,”<<P.Ycoord()<<endl;
}

TPoint f(TPoint Q)
{
cout<<“ok\n”;
int x, y;
X = Q.Xcoord()+10;
Y = Q.Ycoord()+20;
TPoint R(x, y);
return R;
}

3.总结

拷贝初始化构造函数的功能就是用一个已知的对象来初始化另一个对象。在下述三种情况下,需要用拷贝初始化构造函数来用一个对象初始化另一个对象。1、明确表示由一个对象初始化另一个对象时,如:TPoint P2(P1);
2、当对象作为函数实参传递给函数形参时,如:上例 P = f(N);
3、当对象用为函数值时,如:上例 return R;

这篇关于【c++】-对象的初始化-构造函数和析构函数区别联系-总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/895783

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的