构造函数是类中特殊的成员函数。

创建类类型的新对象的,系统会自动调用构造函数。

构造函数的调用是为了保证每个数据成员都能被正确初始化。

构造函数的作用初始化。

通常情况下,构造函数应声明为公有函数,构造它不能像其他成员函数那样被显式的调用。

构造函数被声明为私有有特殊的用途。

构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数。

如果程序未声明构造函数,默认会生成一个空的构造函数。

不带参数的构造函数称为默认构造函数。

如果有一个构造函数,系统不再生成默认构造函数

Test.h

  1. //Test.h
  2. # ifndef _TEST_H_
  3. # define _TEST_H_
  4. class Test
  5. {
  6. public: //如果程序未声明构造函数,默认会生成一个空的构造函数
  7. Test();
  8. private:
  9. int num_;
  10. };
  11. # endif //_TEST_H_

Test.cpp

  1. //Test.cpp
  2. # include "Test.h"
  3. # include <iostream>
  4. using namespace std;
  5. Test::Test()
  6. {
  7. num_ = 0;
  8. cout << "Initializing Default " << endl;
  9. }

main.cpp

  1. # include <iostream>
  2. # include "Test.h"
  3. using namespace std;
  4. int main(void)
  5. { //自动调用构造函数
  6. Test t;
  7. return 0;
  8. }

运行结果:

//    如果有一个构造函数,系统不再生成默认构造函数

Test.h

  1. //Test.h
  2. # ifndef _TEST_H_
  3. # define _TEST_H_
  4. class Test
  5. {
  6. public: //如果程序未声明构造函数,默认会生成一个空的构造函数
  7. Test(int num);
  8. private:
  9. int num_;
  10. };
  11. # endif //_TEST_H_

Test.cpp

  1. //Test.cpp
  2. # include "Test.h"
  3. # include <iostream>
  4. using namespace std;
  5. Test::Test(int num)
  6. {
  7. num_ = num;
  8. cout << "Initializing " << num_  << endl;
  9. }

main.cpp

  1. # include <iostream>
  2. # include "Test.h"
  3. using namespace std;
  4. int main(void)
  5. { //自动调用构造函数
  6. Test t(10);
  7. return 0;
  8. }

运行结果:

构造函数重载的实例:

Test.h

  1. //Test.h
  2. # ifndef _TEST_H_
  3. # define _TEST_H_
  4. class Test
  5. {
  6. public: //如果程序未声明构造函数,默认会生成一个空的构造函数
  7. Test();
  8. Test(int num);
  9. private:
  10. int num_;
  11. };
  12. # endif //_TEST_H_

Test.cpp

  1. //Test.cpp
  2. # include "Test.h"
  3. # include <iostream>
  4. using namespace std;
  5. Test::Test()
  6. {
  7. num_ = 0;
  8. cout << "Initializing default "  << endl;
  9. }
  10. Test::Test(int num)
  11. {
  12. num_ = num;
  13. cout << "Initializing " << num_  << endl;
  14. }

main.cpp

  1. # include <iostream>
  2. # include "Test.h"
  3. using namespace std;
  4. int main(void)
  5. { //自动调用构造函数
  6. Test t1;
  7. Test t2(10);
  8. return 0;
  9. }

运行结果:

构造函数与new运算符

  1. //构造函数与new运算符
  2. # ifndef _TEST_H_
  3. # define _TEST_H_
  4. class Test
  5. {
  6. public:
  7. 可以显式的写一个默认构造函数,这样两个函数就成了重载
  8. Test();
  9. Test(int num);
  10. //析构函数不能重载
  11. //析构函数不能带参数,如果带参数就可以重载
  12. ~Test();
  13. void Display();
  14. private:
  15. int num_;
  16. };
  17. # endif

Test.cpp

  1. # include "Test.h"
  2. # include <iostream>
  3. using namespace std;
  4. void Test::Display()
  5. {
  6. cout << num_ << endl;
  7. }
  8. Test::Test()
  9. {
  10. num_ = 0;
  11. cout<<"Initializing Default" << endl;
  12. }
  13. Test::Test(int num)
  14. {
  15. num_ = num;
  16. cout<<"Initializing "<<num_ << endl;
  17. }
  18. Test::~Test()
  19. {
  20. cout << "Destory " << num_ << endl;
  21. }

main.cpp

  1. # include <iostream>
  2. # include "Test.h"
  3. using namespace std;
  4. int main(void)
  5. {
  6. Test t;
  7. t.Display();
  8. Test t2(20);
  9. t2.Display();
  10. //不仅仅分配了内存,还调用了构造函数
  11. Test * t3 = new Test(20);  //new operator
  12. t3->Display();
  13. //不仅仅释放了内存,也调用了析构函数
  14. delete t3;
  15. return 0;
  16. }

运行结果:

//全局对象的构造先于main函数

  1. # ifndef _TEST_H_
  2. # define _TEST_H_
  3. class Test
  4. {
  5. public:
  6. 可以显式的写一个默认构造函数,这样两个函数就成了重载
  7. Test();
  8. Test(int num);
  9. //析构函数不能重载
  10. //析构函数不能带参数,如果带参数就可以重载
  11. ~Test();
  12. void Display();
  13. private:
  14. int num_;
  15. };
  16. # endif

Test.cpp

  1. # include "Test.h"
  2. # include <iostream>
  3. using namespace std;
  4. void Test::Display()
  5. {
  6. cout << num_ << endl;
  7. }
  8. Test::Test()
  9. {
  10. num_ = 0;
  11. cout<<"Initializing Default" << endl;
  12. }
  13. Test::Test(int num)
  14. {
  15. num_ = num;
  16. cout<<"Initializing "<<num_ << endl;
  17. }
  18. Test::~Test()
  19. {
  20. cout << "Destory " << num_ << endl;
  21. }

main.cpp

  1. # include "Test.h"
  2. using namespace std;
  3. //全局对象的构造先于main函数
  4. Test t(10);
  5. int main(void)
  6. {
  7. cout << "Entering main ..." << endl;
  8. cout << "Exiting  main ..." << endl;
  9. return 0;
  10. }

运行结果:

默认析构函数是一个空函数

析构函数没有参数

析构函数不能被重载

析构函数与数组

Test.h

  1. //Test.h
  2. # ifndef _TEST_H_
  3. # define _TEST_H_
  4. class Test
  5. {
  6. public:
  7. 可以显式的写一个默认构造函数,这样两个函数就成了重载
  8. Test();
  9. Test(int num);
  10. //析构函数不能重载
  11. //析构函数不能带参数,如果带参数就可以重载
  12. ~Test();
  13. void Display();
  14. private:
  15. int num_;
  16. };
  17. # endif //_TEST_H_

Test.cpp

  1. //Test.cpp
  2. # include <iostream>
  3. # include "Test.h"
  4. using namespace std;
  5. void Test::Display()
  6. {
  7. cout << num_ << endl;
  8. }
  9. Test::Test()
  10. {
  11. num_ = 0;
  12. cout<<"Initializing Deafule " << endl;
  13. }
  14. Test::Test(int num)
  15. {
  16. num_ = num;
  17. cout<<"Initializing "<<num_ << endl;
  18. }
  19. Test::~Test()
  20. {
  21. cout << "Destory " << num_ << endl;
  22. }

main.cpp

  1. //main.cpp
  2. # include <iostream>
  3. # include "Test.h"
  4. using namespace std;
  5. int main(void)
  6. {      //定义对象数组
  7. Test t[2] = {10,20};
  8. //动态对象
  9. Test* t2 = new Test(2); //传递参数2
  10. delete t2;
  11. //没有传递任何参数,创建了两个对象
  12. Test* t3 = new Test[2];
  13. delete[] t3;
  14. return 0;
  15. }

运行结果:

析构函数不能重载

析构函数不能带参数,如果带参数就可以重载

析构函数可以显式调用,一般很少用到,会实现一些特殊的效果:

  1. //main.cpp
  2. # include "Test.h"
  3. int main(void)
  4. {
  5. Test t;
  6. t.~Test(); //析构函数被调用了两次
  7. //析构函数很少调用,可以显式调用
  8. return 0;
  9. }

转载于:https://blog.51cto.com/liam2199/1172398

C++构造函数和析构函数的学习(一)相关推荐

  1. 【C++】C++类的学习(二)——构造函数、析构函数、拷贝构造函数以及this指针

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 1. 前言 在之前的博文< C++类的学习(一)--初识类>中,简单地讲述了类的 ...

  2. c++ map 析构函数_C++学习刷题6--C++类的使用:构造函数、析构函数和类的使用

    一.前言 本部分为C++语言刷题系列中的第4节,主要讲解这几个知识点:构造函数.析构函数和类的使用.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 由以前知识可知,类的实现中包含成员变量 ...

  3. C++学习——构造函数,析构函数与虚函数关系

    文章目录 1.构造函数,析构函数可以为虚函数吗? 2.析构函数和构造函数的作用? 3.构造函数和析构函数调用顺序? 4.类什么时候会调用析构函数? 1.构造函数,析构函数可以为虚函数吗? 构造函数不可 ...

  4. C++基础学习9:构造函数和析构函数

    1.  构造函数用来对类对象进行初始化,它完成对内存空间的申请.赋初值等工作.   2.  析构函数主要是用来做清理工作的. 补充: 函数名或变量名前面有"::"但是没有类名,说明 ...

  5. 《C++ Primer Plus》10.3 类的构造函数和析构函数 学习笔记

    10.3.1 声明和定义构造函数 构造函数原型: // constructor prototype with some default arguments Stock(const string &am ...

  6. 【C++学习笔记2】构造函数、析构函数、函数多态、抽象类、函数模板

    这次笔记介绍构造函数.析构函数.函数多态.抽象类.函数模板 一.构造函数 1.在定义对象,构造函数程序将自动执行,他的类型跟类名一致 函数声明最好放在自己的类里面,这样才符合类的封装,也可以像下面一样 ...

  7. Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数

    一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...

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

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

  9. php中类的构造函数是,PHP 类的构造函数和析构函数

    通常一提到 PHP 的构造函数和析构函数,就会想到两个单词 construct 和 destruct,构造和解构. 在学习 PHP 的时候,了解到的构造函数和析构函数就是 __construct() ...

最新文章

  1. 设计模式笔记(18)---迭代器模式(行为型)
  2. 深圳餐厅使用iPad点餐(图)
  3. Java获取运行环境信息
  4. 30分钟正则表达式指导
  5. SDUT - 2623 The number of steps(概率dp)
  6. 【收集】ADOADO.NET 读取 Oracle 数据集
  7. visual studio-wdk8.1+vs2013中使用winusb模版开发usb设备驱动
  8. 第22篇-安卓手机端抓包软件VNET介绍
  9. 用html做祝福语朋友,朋友关怀祝福语(把祝福语化作露带给你)
  10. 蒙特卡洛(Monte Carlo)
  11. MEMS传感器领域关于薄膜性能的中国国家标准,“带状薄膜抗拉性能的试验方法”由北京智芯传感等单位发布并实施
  12. 谈谈WebService开发-基础篇
  13. 深入分析 Uniswap V3 流动性供应的数学原理
  14. 射命丸文的取材之旅题解
  15. 微信视频号怎么变现挣钱?六大变现操作方式。
  16. 缓解论文写作压力的小妙招
  17. 如何录制电脑正在播放的声音及音乐?
  18. 什么是具有舆论属性或者社会动员能力的算法推荐服务提供者
  19. 金蝶K3软件系统在Win2003环境的设置指南
  20. 虚拟空间phpMyAdmin配置

热门文章

  1. Windows核心编程 第23章 结束处理程序
  2. UVA10125和集
  3. hdu2899 三分
  4. 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )
  5. 【Groovy】集合遍历 ( “ *. “ 展开操作符 | 代码示例 )
  6. 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )
  7. 【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )
  8. 【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )
  9. 【计算机网络】HTTP 与 HTTPS ( HTTP 发展过程 | HTTP/1.1 与 HTTP/2 对比 | HTTP 报文格式 )
  10. 【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )