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++ 构造函数 析构函数相关推荐

  1. C++派生类含有成员对象构造函数析构函数顺序

    参考博客:传送门1 当类中含有对象成员时: 类的构造函数要包含对成员对象的初始化,如果构造函数的成员初始化列表没有包含对成员对象的初始化,系统会自动调用成员对象的无参构造函数.顺序上:先调用成员对象的 ...

  2. C++构造函数/析构函数 设置成private的原因

    C++构造函数/析构函数 设置成private的原因 标签(空格分隔): c/c++ 将构造函数,析构函数声明为私有和保护的,那么对象如何创建? 已经不能从外部调用构造函数了,但是对象必须被构造,应该 ...

  3. 在构造函数/析构函数中调用virtual函数带来的影响

    在构造函数/析构函数中调用virtual函数,那么调用的一定是本类中的virtual函数. 先看一段代码: #include<iostream>class Base { public:Ba ...

  4. C++反汇编第一讲,认识构造函数,析构函数,以及成员函数

    C++反汇编第一讲,认识构造函数,析构函数,以及成员函数 以前说过在C系列下的汇编,怎么认识函数.那么现在是C++了,隐含有构造和析构函数 一丶认识构造函数 高级代码: class MyTest { ...

  5. c++ 构造函数析构函数 数据安全_C++知识点 16:构造函数和析构函数的语法

    #define _CRT_SECURE_NO_WARNINGS #include using namespace std;// 创建一个类( 类内包括: 2个构造函数,一个析构函数) class Pe ...

  6. C++——构造函数析构函数

    目录 类的构造函数 普通构造函数 带参数的构造函数 初始化列表来初始化字段 类的析构函数 类的构造函数 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行. 构造函数的名称与类的名称 ...

  7. c++远征之继承篇——继承的概念、继承时构造函数/析构函数的先后顺序

    1.继承的概念 2.继承中,构造函数和析构函数的先后顺序

  8. PHP面向对象构造函数,析构函数

    构造函数 用来生成对象的函数 <body> <?php class Ren{ public $name;//姓名 public $sex;//性别 性别是人一出生就知道的,可以用构造 ...

  9. 类和对象编程(三):构造函数析构函数

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

最新文章

  1. 在运筹学中什么样的解决方案是最优的
  2. 每日一皮:没有好好测试就运行,还自信的不得了...
  3. IplImage简介
  4. 使用ML.NET实现情感分析[新手篇]
  5. 转换图片保持画质_图片格式怎么相互转换,如何转换jpg、 bmp、png格式
  6. C#中你可能不知道的8件事(zz)
  7. 在向服务器发送请求时发生传输级错误。
  8. Word Frequency(Leetcode192)
  9. 论站长赚钱之七剑下天山
  10. JAVA中输出分两栏,老司机搞定Java 设置Word分栏
  11. typedef typename解释
  12. 【JZOJ A组】登山
  13. keil5如何设置可在一行任意位置输入代码或注释
  14. RS485接口电路设计
  15. 常用正则表达式爬取网页信息及HTML分析总结
  16. dynamixel AX-12A
  17. 三国志战略版S3开荒阵容搭配推荐
  18. 在不同的 BSV 钱包软件间迁移
  19. 图像拼接——多波段融合(multi blend)
  20. 全网稀缺的快应用开源项目-熊宝儿歌故事QuickApp

热门文章

  1. SAP 财务固定资产常用BAPI
  2. C++发送HTTP请求---亲测可行
  3. 架构杂谈——也谈互联网系统架构演进
  4. 2022thusc游记
  5. matlab 滑动平均滤波,滑动平均滤波器实验报告
  6. 微信企业号创建自定义菜单
  7. 民生银行数据中台体系的构建与实践
  8. D3Dshader,像素着色器实现黑白、复古、反色特效。
  9. 星界边境的服务器信息,怎么用vps开星界边境服务器
  10. Java 图形验证码