C++ 构造函数 析构函数
C++ 构造函数
- 构造函数
- 默认构造函数
- 有参构造函数
- 析构函数
- 析构函数例子
- 析构函数执行时机
- 局部对象
- 全局对象
构造函数
构造函数 (constructor) 是一种特殊的成员函数. 它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的, 并且不会返回任何类型. 构造函数可用于为某些成员变量设置初始值.
格式:
Class::Class(); // 构造函数
默认构造函数
如果用户自己没有定义构造函数, C++ 系统会自动生成一个默认构造函数. 这个构造函数体是空的, 没有参数, 不执行初始化操作.
例如:
Time.h:
class Time {
private:int hour;int minute;int second;
public:Time(); // 默认构造函数void set_time(int h, int m, int s);void show_time();
};
Time.cpp:
#include "Time.h"
#include <iostream>using namespace std;Time::Time() {hour = 0;minute = 0;second = 0;
}void Time::set_time(int h, int m, int s) {hour = h;minute = m;second = s;
}void Time::show_time() {cout << hour << ":" << minute << ":" << second << endl;
}
main:
#include "Time.h"
#include <iostream>using namespace std;int main() {Time time1; // 实例化timetime1.show_time(); // 调用show_timereturn 0;
}
输出结果:
0:0:0
重点:
- 即使提供了其他构造函数, 提供一个默认构造函数几乎总是对的
- 通常在默认构造函数中, 给成员提供的初始值应该指出该对象是 “空” 的
有参构造函数
构造函数中参数可以指定默认值. 如果童虎不指定实参指, 编译西永就使形参取默认值.
例如:
Time 类:
#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_Hclass Time {
private:int hour;int minute;int second;
public:Time(); // 默认构造函数Time(int h, int m=0, int s=0); // 有参构造函数void show_time();
};#endif //PROJECT1_TIME_H
Time.cpp:
#include "Time.h"
#include <iostream>
using namespace std;// 默认构造函数
Time::Time() : hour(0), minute(0), second(0) {}// 有参构造函数
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}void Time::show_time() {cout << hour << ":" << minute << ":" << second << endl;
}
main:
#include "Time.h"
#include <iostream>
using namespace std;int main() {Time time1;time1.show_time();Time time2(8);time2.show_time();Time time3(8, 8);time3.show_time();Time time4(8, 8, 8);time4.show_time();return 0;
}
输出结果:
0:0:0
8:0:0
8:8:0
8:8:8
析构函数
析构函数 (destructor) 也是一个特殊的成员函数. 当对象的生命期结束时, 会自动执行析构函数. 析构函数的名字是类名前面加一个 “~” 符号.
格式:
Class::~Class(); // 析构函数
析构函数的作用在撤销对象占用的内存之前完成一些清理 & 善后的工作.
析构函数例子
Student 类:
#ifndef PROJECT1_STUDENT_H
#define PROJECT1_STUDENT_H#include <string>
using namespace std;class Student {
private:int num;string name;char gender;
public:Student();Student(int num, string name, char gender);~Student();void display();
};#endif //PROJECT1_STUDENT_H
Student.cpp:
#include "Student.h"
#include <iostream>
using namespace std;// 无参构造
Student::Student() : num(-1), name("None"), gender('N') {}Student::Student(int n, string p, char g) : num(n), name(p), gender(g) {cout << "执行构造函数: " << "Welcome, " << name << endl;
}void Student::display() {cout << "num: " << num << endl;cout << "name: " << name << endl;cout << "gender: " << gender << endl;cout << "===============" << endl;
}Student::~Student() {cout << "执行析构函数: " << "Bye bye, " << name << endl;
}
main:
#include "Student.h"
#include <iostream>
using namespace std;int main() {Student student1(1, "Little white", 'f');Student student2(2, "Big white", 'f');student1.display();student2.display();return 0;
}
输出结果:
执行构造函数: Welcome, Little white
执行构造函数: Welcome, Big white
num: 1
name: Little white
gender: f
===============
num: 2
name: Big white
gender: f
===============
执行析构函数: Bye bye, Big white
执行析构函数: Bye bye, Little white
析构函数执行时机
对于函数中定义的自动局部对象, 当函数被调用结束时, 对象释放. 在对象释放前自自动执行析构函数.
局部对象
static 局部对象只在 main 函数结束或调用 exit 函数结束程序时, 调用 static 局部对象的洗后函数.
全局对象
对于全局对象, 在程序的流程离开其作用域时 (如 main 函数结束或调用 exit 函数) 时, 调用该全局对象的析构函数.
C++ 构造函数 析构函数相关推荐
- C++派生类含有成员对象构造函数析构函数顺序
参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...
- C++构造函数/析构函数 设置成private的原因
C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...
- 在构造函数/析构函数中调用virtual函数带来的影响
在构造函数/析构函数中调用virtual函数,那么调用的一定是本类中的virtual函数. 先看一段代码: #include<iostream>class Base { public:Ba ...
- C++反汇编第一讲,认识构造函数,析构函数,以及成员函数
C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...
- c++ 构造函数析构函数 数据安全_C++知识点 16:构造函数和析构函数的语法
#define _CRT_SECURE_NO_WARNINGS #include using namespace std;// 创建一个类( 类内包括: 2个构造函数,一个析构函数) class Pe ...
- C++——构造函数析构函数
目录 类的构造函数 普通构造函数 带参数的构造函数 初始化列表来初始化字段 类的析构函数 类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称 ...
- c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序
1.继承的概念 2.继承中,构造函数和析构函数的先后顺序
- PHP面向对象构造函数,析构函数
构造函数 用来生成对象的函数 <body> <?php class Ren{ public $name;//姓名 public $sex;//性别 性别是人一出生就知道的,可以用构造 ...
- 类和对象编程(三):构造函数析构函数
类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void.构造函数可用于为某些成员变量设置 ...
最新文章
- 在运筹学中什么样的解决方案是最优的
- 每日一皮:没有好好测试就运行,还自信的不得了...
- IplImage简介
- 使用ML.NET实现情感分析[新手篇]
- 转换图片保持画质_图片格式怎么相互转换,如何转换jpg、 bmp、png格式
- C#中你可能不知道的8件事(zz)
- 在向服务器发送请求时发生传输级错误。
- Word Frequency(Leetcode192)
- 论站长赚钱之七剑下天山
- JAVA中输出分两栏,老司机搞定Java 设置Word分栏
- typedef typename解释
- 【JZOJ A组】登山
- keil5如何设置可在一行任意位置输入代码或注释
- RS485接口电路设计
- 常用正则表达式爬取网页信息及HTML分析总结
- dynamixel AX-12A
- 三国志战略版S3开荒阵容搭配推荐
- 在不同的 BSV 钱包软件间迁移
- 图像拼接——多波段融合(multi blend)
- 全网稀缺的快应用开源项目-熊宝儿歌故事QuickApp