构造函数(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. flask上下文流程面试总结

  2. c++比例-libcurl多线程并发时的core【转载】

    转自: https://www.cnblogs.com/edgeyang/articles/3722035.html 浅析libcurl多线程安全问题 背景:使用多线程libcurl发送请求,在未设置 ...

  3. 【Canvas】绘制几何级数Geometric series曲线 y=1+1/2+1/4+1/8+1/16+1/32+1/64+....

    相关资料:https://baike.baidu.com/item/%E5%87%A0%E4%BD%95%E7%BA%A7%E6%95%B0/112584?fr=aladdin 图线: 代码: < ...

  4. socket服务端开发之测试使用threading和gevent框架

    socket服务端开发之测试使用threading和gevent框架 话题是测试下多线程和gevent在socket服务端的小包表现能力,测试的方法不太严谨,也没有用event loop + pool ...

  5. Quartz调度系统入门和调度高可用实现方案

    ** 版本:2.2.1 ** Hello world: https://www.jianshu.com/p/810400e6a274

  6. EasyUI动态展示用户信息

    业务需求:用户登录后展示用户名.用户对应的角色.EasyUI只不过是一个前端的框架,封装了一些组件和样式,你可以用jsp直接调后台获取到用户信息展示,但我这里想用html页面,用目前流行的说法:前后端 ...

  7. 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_12-用户退出-服务端

    实现退出 用户退出要以下动作: 1.删除redis中的token 2.删除cookie中的token controller内定义 spring securety config内放行 对这个url放行 ...

  8. PAT 甲级 1051 Pop Sequence (25 分)(模拟栈,较简单)

    1051 Pop Sequence (25 分)   Given a stack which can keep M numbers at most. Push N numbers in the ord ...

  9. Vue.js学习TodoMVC小Demo

    实现效果如下: 把玩了添加和删除功能,代码如下: index.html: <!doctype html> <html lang="en"> <head ...

  10. 使用json_encode编码中文返回null的解决方案

    在gbk的程序中,直接使用json_encode编码包含中文字符的数组,将会返回null. 解决方法: 1.把程序文件编码改为utf8 2.使用mb_convert_encoding把编码转换为utf ...