博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++面向对象-2-类的构造函数和析构函数
阅读量:4301 次
发布时间:2019-05-27

本文共 2568 字,大约阅读时间需要 8 分钟。

上一篇学习了C++中的类定义,用了两个练习题来演示一个class的属性和行为的定义和调用,以及展开了权限控制和一个类的属性还可以是其他类的一个实例。其中有好多代码是set和get, 写多了有时候很烦,当然写set和get方法是一个好习惯。例如Point,我们需要setX和setY, 有没有一个方法直接SetPoint(X,Y)呢, 这个就本篇要学习的类的构造函数。

 

区别:struct vs class

在学习构造函数之前,我们先学习一下C++中struct和class的区别,在C中struct是结构体,class和struct几乎没有区别,如果你不想使用class去写一个类,当然可以使用struct去写相关代码。简单来说,struct中的属性默认是public, 而class中的属性默认是private的,下面用代码来证明一下。

#include 
using namespace std;struct A{ int a;};class B{ int b;};int main(){ A a1; a1.a = 100; B b1; b1.b = 100; system("pause"); return 0;}

不需要运行上面代码,在b1.b这个位置,IDE会报错,提示 11行不可以访问,原因如下:

在struct中,属性的权限默认是public, 在class中属性的权限默认是private, 行为也是一样。

 

构造函数

在C++中,类的构造函数会在类初始化的过程中就会执行构造函数。我们希望在一个类初始化的时候,就给这个类的属性进行设置初始化值,在C++中通过构造函数来实现。格式是这样的

class Point{    //构造函数    Point()    {    }private:    int X;    int Y;};

构造函数的特点,函数名称和类的名称相同,前面没有返回值,可以有参数,也可以无参数。有参加就叫有参构造,无参数就叫无参构造。上面就是一个无参构造,主要我们定义了一个类,如果我们没有写这个无参构造,编译器在编译和运行代码的时候会自动给我们添加这个无参构造(空实现)。如果我们在定义类的时候,写了有参构造,编译器不会自动帮我们添加无参构造,建议我们自己写代码的时候,自己添加有参和无参构造函数。

下面代码来证明,类在初始化的时候,调用了构造函数,以下用无参构造函数演示。

#include
using namespace std;class Point{public: //构造函数 Point() { cout << "调用了构造函数"<< endl; }private: int X; int Y;};int main(){ Point p; system("pause"); return 0;}

执行结果

总结:

构造函数语法:类名(){}

1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发送重载
4.程序在调用对象的时候会自动调用构造函数。

 

析构函数

和类初始化相反的事情叫事后清理,在C++中,采用析构函数来实现类的运行结束前的清理操作。

析构函数语法:~类名(){}

1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前面加上符号~
3.析构函数不可以有参数,因此不可以发送重载
4.程序在对象销毁前会自动调用析构函数,无需手动调用而且只会调用一次

在上面构造函数基础上,添加析构函数的代码

#include
using namespace std;class Point{public: //构造函数 Point() { cout << "调用了构造函数"<< endl; } //析构函数 ~Point() { cout << "调用了析构函数" << endl; }private: int X; int Y;};int main(){ Point p; system("pause"); return 0;}

运行这个看起来并没有打印调用了析构函数,实际上是在输入任意键的一瞬间打印了调用析构函数。因为main函数是在内存的全局区,运行到system("pause"); 这里,我们main函数并没有结束,所以这个时刻的Point p这个对象没有结束,自然没有调用析构函数,但是执行return 0的一瞬间应该打印了析构函数的调用。为了看到打印效果,我们把类初始化代码放到一个内存代码局部区去。

#include
using namespace std;class Point{public: //构造函数 Point() { cout << "调用了构造函数"<< endl; } //析构函数 ~Point() { cout << "调用了析构函数" << endl; }private: int X; int Y;};void test01(){ Point p;}int main(){ test01(); system("pause"); return 0;}

运行结果:

在main()方法执行到test01()的时候,调用了test01()里面的Point p, 这个时候执行了Point类的初始化和清理操作,因为test01()执行完就从main()方法中弹出栈,Point p就从内存中回收,所以回收内存之前编译器自动调用了析构函数,所以能看到打印效果。

 

       构造函数分类:安装是否带参数,可以分无参构造和有参构造,按照类型分普通构造和拷贝构造,关于这个分类和构造函数的调用方法,下一篇来介绍。本篇学习了构造函数和析构函数,构造函数的作用是类初始化过程运行一次,给属性设置初始化值。析构函数的作用是,在类销毁之前执行一些操作,也只调用一次。

 

转载地址:http://iqxws.baihongyu.com/

你可能感兴趣的文章
iOS在Xcode6中怎么创建OC category文件
查看>>
Expanding User-Defined Runtime Attributes in Xcode with Objective-C
查看>>
iOS7 UITabBar自定义选中图片显示为默认蓝色的Bug
查看>>
提升UITableView性能-复杂页面的优化
查看>>
25 iOS App Performance Tips & Tricks
查看>>
那些好用的iOS开发工具
查看>>
iOS最佳实践
查看>>
使用CFStringTransform将汉字转换为拼音
查看>>
更轻量的 View Controllers
查看>>
Chisel-LLDB命令插件,让调试更Easy
查看>>
时间格式化hh:mm:ss和HH:mm:ss区别
查看>>
Objective-C Autorelease Pool 的实现原理
查看>>
编程语言大牛王垠:编程的智慧,带你少走弯路
查看>>
ios指令集以及基于指令集的app包压缩策略
查看>>
iOS开发者的福利 — — iOS9+Xcode7免越狱免证书直接调试
查看>>
3、JavaWeb学习之基础篇—JSP
查看>>
4、JavaWeb学习之基础篇—Session
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>