C++构造函数和析构函数的学习(一)
构造函数是类中特殊的成员函数。
创建类类型的新对象的,系统会自动调用构造函数。
构造函数的调用是为了保证每个数据成员都能被正确初始化。
构造函数的作用初始化。
通常情况下,构造函数应声明为公有函数,构造它不能像其他成员函数那样被显式的调用。
构造函数被声明为私有有特殊的用途。
构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数。
如果程序未声明构造函数,默认会生成一个空的构造函数。
不带参数的构造函数称为默认构造函数。
如果有一个构造函数,系统不再生成默认构造函数
Test.h
- //Test.h
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public: //如果程序未声明构造函数,默认会生成一个空的构造函数
- Test();
- private:
- int num_;
- };
- # endif //_TEST_H_
Test.cpp
- //Test.cpp
- # include "Test.h"
- # include <iostream>
- using namespace std;
- Test::Test()
- {
- num_ = 0;
- cout << "Initializing Default " << endl;
- }
main.cpp
- # include <iostream>
- # include "Test.h"
- using namespace std;
- int main(void)
- { //自动调用构造函数
- Test t;
- return 0;
- }
运行结果:
// 如果有一个构造函数,系统不再生成默认构造函数
Test.h
- //Test.h
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public: //如果程序未声明构造函数,默认会生成一个空的构造函数
- Test(int num);
- private:
- int num_;
- };
- # endif //_TEST_H_
Test.cpp
- //Test.cpp
- # include "Test.h"
- # include <iostream>
- using namespace std;
- Test::Test(int num)
- {
- num_ = num;
- cout << "Initializing " << num_ << endl;
- }
main.cpp
- # include <iostream>
- # include "Test.h"
- using namespace std;
- int main(void)
- { //自动调用构造函数
- Test t(10);
- return 0;
- }
运行结果:
构造函数重载的实例:
Test.h
- //Test.h
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public: //如果程序未声明构造函数,默认会生成一个空的构造函数
- Test();
- Test(int num);
- private:
- int num_;
- };
- # endif //_TEST_H_
Test.cpp
- //Test.cpp
- # include "Test.h"
- # include <iostream>
- using namespace std;
- Test::Test()
- {
- num_ = 0;
- cout << "Initializing default " << endl;
- }
- Test::Test(int num)
- {
- num_ = num;
- cout << "Initializing " << num_ << endl;
- }
main.cpp
- # include <iostream>
- # include "Test.h"
- using namespace std;
- int main(void)
- { //自动调用构造函数
- Test t1;
- Test t2(10);
- return 0;
- }
运行结果:
构造函数与new运算符
- //构造函数与new运算符
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public:
- 可以显式的写一个默认构造函数,这样两个函数就成了重载
- Test();
- Test(int num);
- //析构函数不能重载
- //析构函数不能带参数,如果带参数就可以重载
- ~Test();
- void Display();
- private:
- int num_;
- };
- # endif
Test.cpp
- # include "Test.h"
- # include <iostream>
- using namespace std;
- void Test::Display()
- {
- cout << num_ << endl;
- }
- Test::Test()
- {
- num_ = 0;
- cout<<"Initializing Default" << endl;
- }
- Test::Test(int num)
- {
- num_ = num;
- cout<<"Initializing "<<num_ << endl;
- }
- Test::~Test()
- {
- cout << "Destory " << num_ << endl;
- }
main.cpp
- # include <iostream>
- # include "Test.h"
- using namespace std;
- int main(void)
- {
- Test t;
- t.Display();
- Test t2(20);
- t2.Display();
- //不仅仅分配了内存,还调用了构造函数
- Test * t3 = new Test(20); //new operator
- t3->Display();
- //不仅仅释放了内存,也调用了析构函数
- delete t3;
- return 0;
- }
运行结果:
//全局对象的构造先于main函数
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public:
- 可以显式的写一个默认构造函数,这样两个函数就成了重载
- Test();
- Test(int num);
- //析构函数不能重载
- //析构函数不能带参数,如果带参数就可以重载
- ~Test();
- void Display();
- private:
- int num_;
- };
- # endif
Test.cpp
- # include "Test.h"
- # include <iostream>
- using namespace std;
- void Test::Display()
- {
- cout << num_ << endl;
- }
- Test::Test()
- {
- num_ = 0;
- cout<<"Initializing Default" << endl;
- }
- Test::Test(int num)
- {
- num_ = num;
- cout<<"Initializing "<<num_ << endl;
- }
- Test::~Test()
- {
- cout << "Destory " << num_ << endl;
- }
main.cpp
- # include "Test.h"
- using namespace std;
- //全局对象的构造先于main函数
- Test t(10);
- int main(void)
- {
- cout << "Entering main ..." << endl;
- cout << "Exiting main ..." << endl;
- return 0;
- }
运行结果:
默认析构函数是一个空函数
析构函数没有参数
析构函数不能被重载
析构函数与数组
Test.h
- //Test.h
- # ifndef _TEST_H_
- # define _TEST_H_
- class Test
- {
- public:
- 可以显式的写一个默认构造函数,这样两个函数就成了重载
- Test();
- Test(int num);
- //析构函数不能重载
- //析构函数不能带参数,如果带参数就可以重载
- ~Test();
- void Display();
- private:
- int num_;
- };
- # endif //_TEST_H_
Test.cpp
- //Test.cpp
- # include <iostream>
- # include "Test.h"
- using namespace std;
- void Test::Display()
- {
- cout << num_ << endl;
- }
- Test::Test()
- {
- num_ = 0;
- cout<<"Initializing Deafule " << endl;
- }
- Test::Test(int num)
- {
- num_ = num;
- cout<<"Initializing "<<num_ << endl;
- }
- Test::~Test()
- {
- cout << "Destory " << num_ << endl;
- }
main.cpp
- //main.cpp
- # include <iostream>
- # include "Test.h"
- using namespace std;
- int main(void)
- { //定义对象数组
- Test t[2] = {10,20};
- //动态对象
- Test* t2 = new Test(2); //传递参数2
- delete t2;
- //没有传递任何参数,创建了两个对象
- Test* t3 = new Test[2];
- delete[] t3;
- return 0;
- }
运行结果:
析构函数不能重载
析构函数不能带参数,如果带参数就可以重载
析构函数可以显式调用,一般很少用到,会实现一些特殊的效果:
- //main.cpp
- # include "Test.h"
- int main(void)
- {
- Test t;
- t.~Test(); //析构函数被调用了两次
- //析构函数很少调用,可以显式调用
- return 0;
- }
转载于:https://blog.51cto.com/liam2199/1172398
C++构造函数和析构函数的学习(一)相关推荐
- 【C++】C++类的学习(二)——构造函数、析构函数、拷贝构造函数以及this指针
[fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 1. 前言 在之前的博文< C++类的学习(一)--初识类>中,简单地讲述了类的 ...
- c++ map 析构函数_C++学习刷题6--C++类的使用:构造函数、析构函数和类的使用
一.前言 本部分为C++语言刷题系列中的第4节,主要讲解这几个知识点:构造函数.析构函数和类的使用.欢迎大家提出意见.指出错误或提供更好的题目! 二.知识点讲解 由以前知识可知,类的实现中包含成员变量 ...
- C++学习——构造函数,析构函数与虚函数关系
文章目录 1.构造函数,析构函数可以为虚函数吗? 2.析构函数和构造函数的作用? 3.构造函数和析构函数调用顺序? 4.类什么时候会调用析构函数? 1.构造函数,析构函数可以为虚函数吗? 构造函数不可 ...
- C++基础学习9:构造函数和析构函数
1. 构造函数用来对类对象进行初始化,它完成对内存空间的申请.赋初值等工作. 2. 析构函数主要是用来做清理工作的. 补充: 函数名或变量名前面有"::"但是没有类名,说明 ...
- 《C++ Primer Plus》10.3 类的构造函数和析构函数 学习笔记
10.3.1 声明和定义构造函数 构造函数原型: // constructor prototype with some default arguments Stock(const string &am ...
- 【C++学习笔记2】构造函数、析构函数、函数多态、抽象类、函数模板
这次笔记介绍构造函数.析构函数.函数多态.抽象类.函数模板 一.构造函数 1.在定义对象,构造函数程序将自动执行,他的类型跟类名一致 函数声明最好放在自己的类里面,这样才符合类的封装,也可以像下面一样 ...
- Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数
一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...
- php中的构造函数和析构函数,php 中构造函数和析构函数
构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...
- php中类的构造函数是,PHP 类的构造函数和析构函数
通常一提到 PHP 的构造函数和析构函数,就会想到两个单词 construct 和 destruct,构造和解构. 在学习 PHP 的时候,了解到的构造函数和析构函数就是 __construct() ...
最新文章
- 设计模式笔记(18)---迭代器模式(行为型)
- 深圳餐厅使用iPad点餐(图)
- Java获取运行环境信息
- 30分钟正则表达式指导
- SDUT - 2623 The number of steps(概率dp)
- 【收集】ADOADO.NET 读取 Oracle 数据集
- visual studio-wdk8.1+vs2013中使用winusb模版开发usb设备驱动
- 第22篇-安卓手机端抓包软件VNET介绍
- 用html做祝福语朋友,朋友关怀祝福语(把祝福语化作露带给你)
- 蒙特卡洛(Monte Carlo)
- MEMS传感器领域关于薄膜性能的中国国家标准,“带状薄膜抗拉性能的试验方法”由北京智芯传感等单位发布并实施
- 谈谈WebService开发-基础篇
- 深入分析 Uniswap V3 流动性供应的数学原理
- 射命丸文的取材之旅题解
- 微信视频号怎么变现挣钱?六大变现操作方式。
- 缓解论文写作压力的小妙招
- 如何录制电脑正在播放的声音及音乐?
- 什么是具有舆论属性或者社会动员能力的算法推荐服务提供者
- 金蝶K3软件系统在Win2003环境的设置指南
- 虚拟空间phpMyAdmin配置
热门文章
- Windows核心编程 第23章 结束处理程序
- UVA10125和集
- hdu2899 三分
- 【Linux 内核】进程管理 task_struct 结构体 ③ ( real_parent 字段 | parent 字段 | group_leader 字段 | real_cred、cred字段 )
- 【Groovy】集合遍历 ( “ *. “ 展开操作符 | 代码示例 )
- 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )
- 【Android 逆向】代码调试器开发 ( 等待进程状态改变 | detach 脱离进程调试 PTRACE_DETACH | 调试中继续运行程序 PTRACE_CONT )
- 【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )
- 【计算机网络】HTTP 与 HTTPS ( HTTP 发展过程 | HTTP/1.1 与 HTTP/2 对比 | HTTP 报文格式 )
- 【MATLAB】流程控制 ( 循环结构 | for 循环 | while 循环 | 分支结构 | if end 分支结构 | if else end 分支结构 | switch case 分支结构 )