1.构造函数

  • 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。构造函数的名称与类的名称的完全相同的,并且不会返回任何数据类型,也不会返回void。构造函数用于为某些成员变量设置初始值。

  • 构造函数实例如下:

        #include "iostream"using namespace std;class Line{public:void setLength(double len);double getLength();Line();   // 构造函数private:double length;};// 构造函数的定义Line::Line(){cout << "Line的对象line正在被创建..." << endl;}// 成员函数的定义void Line::setLength(double len){length = len;}double Line::getLength(){return length;}int main(){Line line;  // 创建一个line对象,此时会去执行构造函数line.setLength(4.0);cout << "Line的长度是: " << line.getLength() << endl;return 0;}
    
  • 带参数的构造函数:默认的构造函数是没有任何参数的,但如果需要参数,构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值,如下面的例子:

        #include "iostream"using namespace std;class Line{public:void setLength(double len);double getLength();Line(double len);   // 带参数的构造函数private:double length;};// 构造函数的定义Line::Line(double len){cout << "Line的对象line正在被创建, length = " << len << endl;length = len;}// 成员函数的定义void Line::setLength(double len){length = len;}double Line::getLength(){return length;}int main(){// 获取默认设置的长度Line line(10.0);  // 创建一个line对象,此时会去执行带参数的构造函数line.setLength(4.0);cout << "Line的长度是: " << line.getLength() << endl;return 0;}
    
  • 使用初始化列表来初始化字段,见下面的实例:

        class Box{public:void setLength(double len);double getLength();void setWidth(double wid);double getWidth();void setHeight(double hei);double getHeight();// 使用初始化列表来初始化字段----构造函数Box(double len, double wid, double hei): length(len), width(wid), height(hei){cout << "Box的对象box正在被创建,length = " << len << " width = " << wid << " height = " << hei << endl; }private:double length;double width;double height;};// Box类的成员函数定义void Box::setLength(double len){length = len;}double Box::getLength(){return length;}void Box::setWidth(double wid){width = wid;}double Box::getWidth(){return width;}void Box::setHeight(double hei){height = hei;}double Box::getHeight(){return height;}Box box(3.0, 4.0, 5.0);box.setLength(33.0);cout << "Box的长度是: " << box.getLength() << endl;box.setWidth(44.0);cout << "Box的宽度是: " << box.getWidth() << endl;box.setHeight(55.0);cout << "Box的高度是: " << box.getHeight() << endl;
    
  • 假设一个类C,具有多个字段X,Y,Z等需要进行初始化,同理,可以使用上面的语法,只需要在不同的字段使用逗号进行分隔即可。如下面的实例:

        C::C(double a, double b, double c): X(a), Y(b), Z(c){语句;}
    

2.析构函数

  • 类的析构函数也是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。析构函数的名称与类的名称完全相同。只是在前面加上一个波浪号~作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于跳出程序前释放内存资源。实例如下:

        #include "iostream"using namespace std;class Line{public:void setLength(double len);double getLength();Line(double len);   // 带参数的构造函数~Line();  // 析构函数不能带有任何参数private:double length;};class Box{public:void setLength(double len);double getLength();void setWidth(double wid);double getWidth();void setHeight(double hei);double getHeight();// 使用初始化列表来初始化字段----构造函数Box(double len, double wid, double hei): length(len), width(wid), height(hei){cout << "Box的对象box正在被创建,length = " << len << " width = " << wid << " height = " << hei << endl; }// 析构函数~Box(){cout << "对象box正在被删除...\n";}private:double length;double width;double height;};// 构造函数的定义Line::Line(double len){cout << "Line的对象line正在被创建, lenght = " << len << endl;length = len;}// 析构函数定义Line::~Line(){cout << "Line的对象正在被删除..." << endl;}// // 使用初始化列表来初始化字段// Line::Line(double len): length(len){//     cout << "Line的对象line正在被创建, lenght = " << len << endl;    // }// 成员函数的定义void Line::setLength(double len){length = len;}double Line::getLength(){return length;}// Box类的成员函数定义void Box::setLength(double len){length = len;}double Box::getLength(){return length;}void Box::setWidth(double wid){width = wid;}double Box::getWidth(){return width;}void Box::setHeight(double hei){height = hei;}double Box::getHeight(){return height;}int main(){// 获取默认设置的长度Line line(10.0);  // 创建一个line对象,此时会去执行带参数的构造函数line.setLength(4.0);cout << "Line的长度是: " << line.getLength() << endl;cout << "-------------------------------------------\n";Box box(3.0, 4.0, 5.0);box.setLength(33.0);cout << "Box的长度是: " << box.getLength() << endl;box.setWidth(44.0);cout << "Box的宽度是: " << box.getWidth() << endl;box.setHeight(55.0);cout << "Box的高度是: " << box.getHeight() << endl;return 0;}
    
    • 注意:上面的程序中,创建了两个对象line和box,由于是先创建的line对象,后创建的是box对象;所以在执行析构函数时,必须先删除box对象,后删除line对象。
  • C++初始化类成员时,是按照声明的顺序初始化的,而不是按照出现在初始化列表中的顺序!,见下面的实例:
    class Student1{public:int a;int b;// 普通成员函数void fprint(){cout << "a = " << a << ",b = " << b << endl;}// Student1(int i): b(i), a(b){} 异常顺序:发现a的值是0,b的值是2;说明初始化仅仅对b有效,对a没有起到初始化的作用Student1(int i): a(i), b(a){} // 正常顺序:a = b = 2// 默认构造函数Student1(){cout << "默认构造函数Student1\n";}// 拷贝构造函数Student1(const Student1& t1){cout << "拷贝构造函数Student1\n";this->a = t1.a;}};Student1 A(2);        //进入默认构造函数 A.fprint();            //输出前面初始化的结果

C++中的构造函数VS析构函数相关推荐

  1. php中的构造函数和析构函数,php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...

  2. C++:继承中的构造函数和析构函数

    C++:继承中的构造函数和析构函数 1.继承中构造函数和析构函数调用顺序 a.调用父类构造函数: b.调用其他成员的构造函数: c.调用子类构造函数: d.析构调用顺序相反. #include < ...

  3. 7-15 单继承中的构造函数与析构函数 (10 分)

    7-15 单继承中的构造函数与析构函数 (10 分 编写代码实现一个表示点的父类Dot和一个表示圆的子类Cir,求圆的面积. Dot类有两个private数据成员 float x,y; Cir类新增一 ...

  4. 【C++深度剖析教程33】C++中的构造函数与析构函数是否可以为虚函数

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 问题一:构造函数与析构函数可以成为虚函数么? 答案: 1.构造函数不可以成为虚函数 因为在构造函数执行结束后,虚函 ...

  5. C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则

    一.继承中的构造函数 根据构造函数的执行流程我们知道: 派生类定义时,先执行基类的构造函数,再执行派生类的构造函数 拷贝构造函数与上面是相同的原理 二.继承中的析构函数 根据析构函数的执行流程我们知道 ...

  6. c++中的构造函数和析构函数

    构造函数:  C++提供了构造函数(constructor)来处理对象的初始化.在建立对象时自动执行.构造函数的名字必须与类名同名,它不具有任何类型,不返回任何值. 构造函数总结: ①构造函数是C++ ...

  7. C++学习笔记day47-----C++98-继承中的构造函数,析构函数,拷贝构造函数,拷贝赋值函数,多重继承,虚继承

    继承中的构造函数 当通过一个子类创建一个新的对象时,编译器会根据子类在初始化表中指明的基类的初始化方式去调用基类相应的构造函数.如果子类的初始化表中,并没有指明基类的初始化方式,编译器将会调用基类的无 ...

  8. 初识C++中的构造函数和析构函数

    构造函数 作用: 主要用来进行对象的初始化操作 需要注意的几个点: 函数名与类名相同 没有返回值 也不写void 构造函数可以有参数(有参构造函数),可以发生重载,也可以没有参数(默认构造函数) 创建 ...

  9. c语言构造函数和析构函数,深入解析C++中的构造函数和析构函数

    构造函数:在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数:在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载,只能 ...

最新文章

  1. 网站建设中这些图片优化小技巧需掌握
  2. [CF407B] Long Path
  3. 五天带你学完《计算机网络》·第三天·传输层
  4. 10个相似图片搜索以图找图的网站
  5. 平安iq测试没通过的话影响入职吗_从外包测试到阿里巴巴,一位三本女生逆袭之路...
  6. 今天,Java编程周末提高班(第一期)正式结束
  7. java config 类_Spring ----JavaConfig类代替XML配置Bean
  8. ThinkPHP框架 _ 学习11
  9. SQL注入漏洞与参数化查询
  10. application配置和profile隔离配置(转)
  11. IOS Andriod 抖音无水印下载和快手无水印下载
  12. 斐讯K1、K2、K2P 刷机、刷入Breed 辅助工具
  13. 【云计算】阿里云-pyodps处理指南
  14. 计算机网络实验三:使用网络协议分析器捕捉和分析协议数据包
  15. Win 开机自动启动 WSL 服务
  16. 计算机辅助公差技术主要研究内容,计算机辅助形位公差类型生成技术的分析研究.pdf...
  17. android前置拍照镜像代码,在Android中镜像前置摄像头
  18. 论文略读 | Pointing the Unknown Words
  19. postgresql统一把字段小写转大写
  20. 理解CU微操作命令(控制信号)

热门文章

  1. 创建虚拟环境 安装pytorch 0.3.1
  2. 在.net中Regex(正则)的应用
  3. linux笔记 1-13-软件安装
  4. 提高PHP编码的一些技巧
  5. 思科3750开启策略路由功能
  6. 在 Virt-manager 图形界面中使用桥接网络
  7. 论坛社区做推广要精心的策划
  8. 跑了4个实验,实战讲解 MySQL的行锁、间隙锁...​
  9. TiDB 在中通的落地与进化
  10. 某程序员吐槽:免费教妹子Java编程,妹子却不让自己找她闲聊!