C++ 构造函数_析构函数
什么是析构函数
如果说构造函数是对象来到世间的第一声哭泣,那么析构函数就是对象死亡前的最后遗言。
析构函数在对象销毁时会被自动调用,完成的任务是归还系统的资源。
特性:
1、如果没有自定义的析构函数,则系统自动生成
2、析构函数在对象销毁时自动调用
3、析构函数没有返回值、没有参数也不能重载

定义格式
~类名()
例如:
class Student
{
public:
Student() {cout<<"Student"<<endl;}
~Student() {cout<<"~Student"<<endl;} // 析构函数不允许加任何参数
private:
string m_strName;
}
定义析构函数的必要性
class Student
{
public:
Student() {m_pName = new char[];}
~Student() {m_pName = new char[20];}
private:
char *m_pName;
}
我们在定义 m_pName 这个变量时,没有用string类型的数组,而是用char类型的指针,并且在函数的定义中,我们把这个指针指向了一个堆中的内存。当这块空间被使用完后,如果没有被释放,那么就会造成内存的泄漏。要释放掉这些内存的最好时机就是在对象被销毁之前。
代码示例
#include <iostream>
#include <stdlib.h>
#include <string>
#include "Teacher.h"
using namespace std; /*************************************************************************
Teacher类
自定义析构函数
普通方式实例化对象,在销毁对象时是否自动调用析构函数
通过拷贝构造函数实例化对象,在销毁对象时是否自动调用析构函数 数据成员:
姓名
年龄 成员函数:
数据成员的封装函数 *************************************************************************/
class Teacher
{
public:
// 声明构造函数,参数给定默认值
Teacher(string name = "cjj",int age = ); // 声明拷贝构造函数
Teacher(const Teacher &tea); // 声明析构函数
~Teacher(); // 声明成员函数,把所有的成员函数都罗列出来
void setName(string _name);
string getName();
void setAge(int _age);
int getAge(); private:
string m_strName;
int m_iAge; }; // 定义构造函数,使用初始化列表,初始化构造函数的参数
Teacher::Teacher(string name,int age):m_strName(name),m_iAge(age)
{
cout << "Teacher(string name,int age)" << endl;
}
// 定义拷贝构造函数
Teacher::Teacher(const Teacher &tea)
{
cout<<"Teacher::Teacher(const Teacher &tea)"<<endl;
}
// 定义析构函数
Teacher::~Teacher(){cout<<"证明析构函数被调用"<<endl;} // 类外定义,写出成员函数的函数体
void Teacher::setName(string _name)
{
m_strName = _name;
}
string Teacher::getName()
{
return m_strName;
}
void Teacher::setAge(int _age)
{
m_iAge = _age;
}
int Teacher::getAge()
{
return m_iAge;
} int main(void)
{
Teacher t1; // 从栈中实例化对象
Teacher *p = new Teacher(); // 从堆中实例化对象
delete p;
Teacher t2(t1); system("pause");
return ;
}
C++ 构造函数_析构函数的更多相关文章
- C++_构造函数与析构函数
构造函数与析构函数 OOP第二课 1 构造函数 1.1 构造函数具有一些特殊的性质 1.2 定义构造函数的一般形式 1.3 利用构造函数创建对象 2 成员初始化表 3 缺省参数的构造函数 4 重载构造 ...
- .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]
构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++构造函数、析构函数与抛出异常
[本文链接] http://www.cnblogs.com/hellogiser/p/constructor-destructor-exceptions.html [问题] 构造函数可以抛出异常么?析 ...
- python中的构造函数和析构函数
python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...
- 内存的分配VS回收&构造函数VS析构函数
之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就.这个问题,我想简单 ...
- C++C++中构造函数与析构函数的调用顺序
http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...
- php 的 构造函数 和 析构函数
构造函数 在C++ java里的应用及其普遍,今天好好研究了一下 php 的 构造函数 和 析构函数 构造函数 和 析构函数 构造函数 void __construct ([ mixed $args ...
- C++-理解构造函数、析构函数执行顺序
先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...
随机推荐
- shell 判断字符串长度是否不为0
test.sh #!/bin/bash s1="" if test $s1 ;then echo "length is not zero" else echo ...
- GitLab 使用指南(IntelliJ IDEA)
一.环境 GitLab Community Edition 10.6.4 IntelliJ IDEA 2017.03 二.Git 使用 (Linux/MAC,cmd 模式) 本地新建项目(从Git服务 ...
- 3321 Apple Tree 树状数组
LIANJIE:http://poj.org/problem?id=3321 给你一个多叉树,每个叉和叶子节点有一颗苹果.然后给你两个操作,一个是给你C清除某节点上的苹果或者添加(此节点上有苹果则清除 ...
- IOS-网络(NSURLSession)
一.NSURLSession的基本用法 // // ViewController.m // NSURLSession // // Created by ma c on 16/2/1. // Copyr ...
- python3连接MySQL数据库实例
#python3连接MySQL实例 import pymysql """导入连接MySQL需要的包,没有安装pymysql需要先安装 使用命令行切换到python的安装路 ...
- 【javascript基础】之【__lookupSetter__ 跟 __lookupSetter__】
描述: 返回getter setter所定义的函数 语法: obj.__lookupGetter__(sprop) 参数: getter setter中定义的字符串属性 注意:这不是标准的方法,ecm ...
- 如何修改windows系统的host文件
方法/步骤 首先我们打开我的计算机 然后我们进入C盘的C:\Windows\System32\drivers\etc这个目录下面找到host这个文件 双点击打开,选择计算本打开,这时可 ...
- Tensorflow 模型文件结构、模型中Tensor查看
tensorflow训练后保存的模型主要包含两部分,一是网络结构的定义(网络图),二是网络结构里的参数值. 1. .meta文件 .meta 文件以 "protocol buffer&qu ...
- ZetCode PyQt4 tutorial Drag and Drop
#!/usr/bin/python # -*- coding: utf-8 -*- """ ZetCode PyQt4 tutorial This is a simple ...
- InputStream,String和Reader之间的转换
1.String –> InputStreamInputStrem is = new ByteArrayInputStream(str.getBytes());orByteArrayInputS ...