C++学习:构造函数与析构函数

来源:互联网 发布:云计算有什么意义 编辑:程序博客网 时间:2024/06/08 20:13

C++学习:构造函数与析构函数

  1. 构造函数
  2. 析构函数

摘要:
在以前学习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的,下面是输出的结果

这里写图片描述

总结:
构造函数与析构函数是控制了一个类的定义和结束的过程
构造函数是控制了类的对象的初始化,资源申请的过程
析构函数是控制了类对象的结束过程,资源释放的过程

原创粉丝点击