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来构造一个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
using namespace::std;
#include
Person::Person(){
cout<<"person constructor one"<int p_high,int p_weight,int p_age,int p_type){
cout<<"person constructor three"</* *
*初始化参数列表
*
* */
Person::Person(int p_high,int p_weight):p_high(15),p_weight(100)
{
cout<<"person constructor three";
}
/* *
*析构函数
* */
Person::~Person(){
cout<<"Person Destructor"</* *
*成员函数的定义
*
* */
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:"<cout<<"p_weight:"<cout<<"p_age:"<cout<<"p_type:"<
/*
* ===========================================================================
*
* Filename: PersonTest.cpp
* Description:
* Version: 1.0
* Created: 2017年05月31日 22时53分03秒
* Revision: none
* Compiler: gcc
* Author: (),
* Company:
*
* ===========================================================================
*/
#include
using namespace::std;
#include
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<<"----------"<170,150,20,0);
p_lisi.print();
cout<<"------------------"<160,110);
p_xiaohua.setp_sex(1);
p_xiaohua.setp_age(18);
p_xiaohua.print();
}
return 0;
}
以上的代码都是可以直接进行run的,下面是输出的结果
总结:
构造函数与析构函数是控制了一个类的定义和结束的过程
构造函数是控制了类的对象的初始化,资源申请的过程
析构函数是控制了类对象的结束过程,资源释放的过程