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

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来构造一个stu
fun(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 __cplusplus
extern "C"{
#endif

class 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的,下面是输出的结果

这里写图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值