C++学习:构造函数与析构函数
来源:互联网 发布:云计算有什么意义 编辑:程序博客网 时间:2024/06/08 20:13
C++学习:构造函数与析构函数
- 构造函数
- 析构函数
摘要:
在以前学习java的时候,都知道,java中的在定义class类的时候,都是可以定义一个构造函数,不定义的时候都是会采用默认的,构造函数是用来对类的对象进行初始化的过程.而java是吸取了C++中的优点.所以这样的一种构造函数同样也是吸取的是C++中的部分.但是在C++中却有两种初始化的过程,当然这两种是有一些区别的.在后续会讲解.构造函数是面向对象编程在初始化过程中及其重要的一部分.
友情提示
友情提示:
本文为笔记,如有写的不对的地方,欢迎指出
本文原创作者:章飞_906285288
作者的博客:http://blog.csdn.net/qq_29924041
构造函数
在正常的情况下,我们一般在声明变量的时候都是需要去赋予初值的.
如:
int a = 10; int *ptr = NULL; 在使用内存分配函数malloc,calloc,realloc进行堆内存分配的时候,需要memset来初始化内存区域
所以在类的对象在定义的时候同样也是需要进行初始化的
1:定义:完成对象初始化的函数就是构造函数
2:类的对象的初始化是由类的成员函数类进行的
3:在建立对象的时候就直接去调用构造函数了
4:类对象的定义涉及到类名和对象名
5:由于类具有唯一性,而对象具有多样性,所以使用类名来作为构造函数名字
6:默认构造函数,如果没有定义构造函数,编译器会提供默认构造函数
构造函数功能:
构造函数是负责对象的初始化工作,将数据成员初始化
创建对象的时候,其类的构造函数确保:在用户操作对象之前,系统保证初始化的进行
构造函数给对象分配空间和初始化
构造函数的语法规则:
构造函数名字与类名一样
构造函数没有返回类型
方法的实现主要是为对象来赋初值
放在外部进行定义的构造函数需要在函数名前面加”::”
构造函数是在定义对象的时候自动定义的
构造函数可以进行隐式的类型转换(ecplict禁止构造函数进行隐式转换)
注意:
如果类似 Student mStudent[5],这个定义一个Student数组,这个时候构造函数会调用5次
构造函数的初始化列表形式:
//变量定义要与初始化的顺序一致Student::Student(int id):m_id(id),m_score(0){};
隐式转换过程
void func(Student stu){}Student stu(10001);fun(stu);//隐式转换,通过10002来构造一个stufun(10002);
析构函数
定义
1:一个类可能在构造函数里面分配资源,这些资源要在对象不复存在以前被释放掉
2: 析构函数也是一种特殊的成员,它没有返回类型,没有参数,不能随意的调用,也没有重载.只是在类对象生命期结束的时候,会由系统自动的调用
3:析构函数名,就是在构造函数前面加一个逻辑非运算符号”~”,表示”逆构造函数”
4:如果类没有提供析构函数,那么编译器会为类提供一个默认的析构函数
5:析构函数不能重载,只有一个
/* * =========================================================================== * * Filename: person.h * Description: * Version: 1.0 * Created: 2017年05月31日 22时31分28秒 * Revision: none * Compiler: gcc * Author: (), * Company: * * =========================================================================== */#ifndef __PERSON_H__#define __PERSON_H__#ifdef __cplusplusextern "C"{#endifclass Person{ private: int p_high; int p_weight; int p_age; int p_sex; public: Person(); //构造函数,explict主要是避免隐士转换的过程 Person(int p_high,int p_weight,int p_age,int p_type); Person(int p_high,int p_weight); //析构函数 ~Person(); //声明并定义成员函数 void setp_high(int high){ p_high = high; }; void setp_weight(int weight){ p_weight = weight; }; void setp_age(int age); void setp_sex(int p_sex); int getp_high(); int getp_weight(); int getp_age(); int getp_sex(); void print();};#ifdef __cplusplus}#endif#endif
/* * =========================================================================== * * Filename: person.cpp * Description: * Version: 1.0 * Created: 2017年05月31日 22时43分45秒 * Revision: none * Compiler: gcc * Author: (), * Company: * * =========================================================================== */#include<iostream>using namespace::std;#include <person.h>Person::Person(){ cout<<"person constructor one"<<endl;}Person::Person(int p_high,int p_weight,int p_age,int p_type){ cout<<"person constructor three"<<endl; p_high = p_high; p_weight = p_weight; p_age = p_age; p_sex = p_type;}/* * *初始化参数列表 * * */Person::Person(int p_high,int p_weight):p_high(15),p_weight(100){ cout<<"person constructor three";}/* * *析构函数 * */Person::~Person(){ cout<<"Person Destructor"<<endl;}/* * *成员函数的定义 * * */void Person::setp_age(int age){ p_age = age;}void Person::setp_sex(int p_sex){ p_sex = p_sex;}int Person::getp_high(){ return p_high;}int Person::getp_weight(){ return p_weight;}int Person::getp_age(){ return p_age;}int Person::getp_sex(){ return p_sex;}void Person::print(){ cout<<"p_high:"<<p_high<<endl; cout<<"p_weight:"<<p_weight<<endl; cout<<"p_age:"<<p_age<<endl; cout<<"p_type:"<<p_sex<<endl;}
/* * =========================================================================== * * Filename: PersonTest.cpp * Description: * Version: 1.0 * Created: 2017年05月31日 22时53分03秒 * Revision: none * Compiler: gcc * Author: (), * Company: * * =========================================================================== */#include<iostream>using namespace::std;#include <person.h>int main(int agrc ,char *argv[]){ Person p_zhangsan(178,105); p_zhangsan.setp_high(178); p_zhangsan.setp_weight(140); p_zhangsan.setp_age(25); p_zhangsan.setp_sex(0); p_zhangsan.print(); cout<<"----------"<<endl; Person p_lisi(170,150,20,0); p_lisi.print(); cout<<"------------------"<<endl; { Person p_xiaohua(160,110); p_xiaohua.setp_sex(1); p_xiaohua.setp_age(18); p_xiaohua.print(); } return 0;}
以上的代码都是可以直接进行run的,下面是输出的结果
总结:
构造函数与析构函数是控制了一个类的定义和结束的过程
构造函数是控制了类的对象的初始化,资源申请的过程
析构函数是控制了类对象的结束过程,资源释放的过程
- 【学习C++】学习C++ -> 构造函数与析构函数
- c++-构造函数与析构函数
- C++--构造函数与析构函数
- 【c++】构造函数与析构函数
- C++:构造函数与析构函数
- 【C++】初始化与清除(构造函数与析构函数)
- C++学习笔记11 构造函数与析构函数
- 一步一步学习C++(类)之构造函数与析构函数
- 学习C++——构造函数和析构函数
- [C++]构造函数与析构函数讲解
- 构造函数与析构函数(C++)
- C语言的构造函数与析构函数
- C++_构造函数与析构函数
- 初识C#——构造函数与析构函数
- 关于Object-c 中的构造函数与析构函数
- C++(构造函数与析构函数)
- C/C++面试题:构造函数与析构函数
- 3.4构造函数与析构函数【C++】
- 关于java用文件保持数据
- php基础2012
- VS2010调试Fiddler源码并对其他部分进行删除整合
- Navicat连接本地Mysql出现10061错误
- 单点登录系统开发
- C++学习:构造函数与析构函数
- Windows下搭建TensorFlow环境1(CPU版本)
- Ember旅程系列(四) -- 模型钩子
- 打造急速开发框架FastApp
- VLC搭建RTSP服务器的过程 -测试通过
- C++ const 和static 区别
- JDBC
- hdu-3183(贪心+RMQ)
- PyTorch读取Cifar数据集并显示图片