构造函数(constructor)

1.构造函数是种特殊的类成员函数,遵循如下规则:

a.函数名与类名必须相同。

b.没有返回值

例如:
class Obj
{
...
public:
Obj()
{
...
}
};

2.构造函数可以带参数,也可以重载

class Obj
{
...
public:
Obj()
{
...
}
Obj(int x, int y)
{
...
}
};

3.构造函数和普通成员函数不一样,一般不显示调用。在创建一个对象时,构造函数自动调用(编译器来完成)。

析构函数(destructor)

1.析构和构造是一对相反的过程,对象被创建时调用构造函数,对象被销毁时调用析构函数,遵循如下规则:

a.名称固定,类名前加上波浪线~

b.没有返回值

c.不能带参数

例如,
class Obj
{
public:
~Obj()
{
}
};

2.析构函数只能有一个,不允许重载。

3.析构函数不显示调用,对象销毁时编译器自动调用。

重新实现链表(使用类,构造和析构函数)

创建DataObj.h头文件

#ifndef _OBJECT_H_
#define _OBJECT_H_ struct Student
{
char name[32];
int age;
Student* pNext;
}; class DataObj
{
public:
DataObj();
~DataObj();
void add(Student* pStu);
void find(int age);
void printNode(Student* pNode);
private:
Student m_head;
}; #endif

创建DataObj.cpp源文件

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "DataObj.h" //构造有头链表
DataObj::DataObj()
{
m_head.pNext = NULL;
}
DataObj::~DataObj()
{
//指向每个节点的头部
Student* p = m_head.pNext; //释放所有节点
while(p)
{
Student *next = p->pNext;
free(p);
p = next;
} } void DataObj::add(Student* pNode)
{
//指向每个节点的头部
Student* p = &m_head; //通过头节点查找到链表尾部节点
while (p)
{
if (p->pNext == NULL)
{
break;
}
p = p->pNext;
} //添加节点到尾部
p->pNext = pNode;
}
void DataObj::find(int age)
{
//标记是否找到
bool bFind = false; Student* p = &m_head;
while(p)
{
if (p->age == age)
{
bFind = true;
printNode(p);
}
p = p->pNext;
}
if (!bFind)
{
printf("没有找到该age的节点");
}
}
void DataObj::printNode(Student* pNode)
{
printf("name = %s, age = %d\n", pNode->name, pNode->age);
} int main()
{
//构造节点
Student* pStu = (Student*) malloc(sizeof(Student));
strcpy(pStu->name, "aaaa");
pStu->age = 30;
pStu->pNext = NULL; {
DataObj dataObj; //添加节点
dataObj.add(pStu); //查找节点
dataObj.find(31);
} return 1;
}

欢迎加群交流:C/C++开发交流

【C++札记】构造函数与析构函数的更多相关文章

  1. .NET 基础 一步步 一幕幕[面向对象之构造函数、析构函数]

    构造函数.析构函数 构造函数: 语法: //无参的构造函数 [访问修饰符] 函数名() :函数名必须与类名相同. //有参的构造函数 [访问修饰符] 函数名(参数列表):函数名必须与类名相同. 作用: ...

  2. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  3. C++构造函数、析构函数与抛出异常

    [本文链接] http://www.cnblogs.com/hellogiser/p/constructor-destructor-exceptions.html [问题] 构造函数可以抛出异常么?析 ...

  4. python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  5. 内存的分配VS回收&构造函数VS析构函数

    之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就.这个问题,我想简单 ...

  6. C++C++中构造函数与析构函数的调用顺序

    http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2 ...

  7. php 的 构造函数 和 析构函数

    构造函数 在C++ java里的应用及其普遍,今天好好研究了一下 php 的 构造函数 和 析构函数 构造函数 和 析构函数 构造函数 void __construct ([ mixed $args ...

  8. C++-理解构造函数、析构函数执行顺序

    先初始化序列中的函数调用,如果基类构造函数为非引用传递,则引起参数的拷贝构造 再: 先类内的成员构造函数(拷贝/默认),再类的构造函数:先基类,再派生类: 本文主要说明对象创建时构造函数的执行顺序,对 ...

  9. C++学习之类的构造函数、析构函数

    在C++的类中,都会有一个或多个构造函数.一个析构函数.一个赋值运算操作符.即使我们自己定义的类中,没有显示定义它们,编译器也会声明一个默认构造函数.一个析构函数和一个赋值运算操作符.例如: //声明 ...

  10. C++的优秀特性3:构造函数和析构函数

    (转载请注明原创于潘多拉盒子) 构造函数和析构函数是C++中再熟悉不过的概念了,几乎每个了解一点C++的人都知道这两个概念是什么意思.一个对象的全部生命期中构造函数和析构函数执行的时机如下: 1. 为 ...

随机推荐

  1. P2320 [HNOI2006]鬼谷子的钱袋——进制(没事就别看这个了)

    就是n可以被1到n/2的所有数表示出来: 我一开始写了个把二进制数里的1拿出来,但是WA了两个点: 分治? 好多人说数据有问题,我也不知道,也不想知道: %:include<cstdio> ...

  2. Python -三目运算(三元运算)

    if 1==1: name = "jacky" else: name = "zhuyuanlu" name = 值1 if 条件 else 值2 #如果这个条件 ...

  3. 前端逼死强迫症之DOM

    Dom:document.相当于把所有的html文件,转换成了文档对象. 之前说过:html-裸体的人:css-穿上衣服:js-让人动起来. 让人动起来,就得先找到他,再修改它内容或属性. 找到标签 ...

  4. 提高python运行效率的方法

    让关键代码依赖于外部包:你可以为紧急的任务使用C.C++或机器语言编写的外部包,这样可以提高应用程序的性能 使用生成器,因为可以节约大量内存 多个if elif条件判断,可以把最有可能先发生的条件放到 ...

  5. 解决Ubuntu重启后,core_pattern失效问题——手动关闭apport

    云主机重启后,core_pattern,即/proc/sys/kernel/core_pattern和/etc/sysctl*配置失效,被系统自动修改. 配置后,重启后core_pattern被重写 ...

  6. Semaphore信号量原理

    package com.maven.info.semaphore; import java.util.ArrayList; import java.util.List; import java.uti ...

  7. Spring框架中不同类型的事件

    ContextRefreshedEvent,ApplicationContext初始化或者被更新是会触发,ConfigurableApplicationContext接口中的refresh()方法被调 ...

  8. android: requestLayout(), invalidate(), postInvalidate() 方法区别

    一.invalidate和postInvalidate 这两个方法都是在重绘当前控件的时候调用的.invalidate在UI线程中调用,postInvalidate在非UI线程中调用.因为androi ...

  9. ISO/IEC 9899:2011 条款5——5.2.4 环境限制

    5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执 ...

  10. 不同三维引擎渲染IFC数据效果对比