一、构造函数
1. 构造函数的定义:
1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;
2)构造函数在定义时可以有参数;
3)没有任何返回类型的声明。
2. 构造函数两种调用方式:
自动调用:一般情况下C++编译器会自动调用构造函数
手动调用:在一些情况下则需要手工调用构造函数
二、析构函数
1. 析构函数的定义:
1)C++中的类可以定义一个特殊的成员函数清理对象,这个特殊的成员函数叫做析构函数
语法:~ClassName()
2)析构函数没有参数也没有任何返回类型的声明
3)析构函数在对象销毁时自动被调用
2. 析构函数的调用:
C++编译器自动调用
构造函数和析构函数的实际应用:
构造函数:
#include <stdio.h>class Test
{
public:// 构造函数:用来对类的成员变量进行初始化// 没有返回值,函数名和类名一样// 构造函数在定义对象的时候自动调用,一般情况下,不需要手动调用Test() // 无参构造{m_a = 1; m_b = 2;printf ("构造函数被调用....\n");}// 构造函数可以被重载Test(int a) // 有参构造{m_a;printf ("1111111111111个参数的构造函数被调用\n");}Test (const char *p){}// 拷贝构造函数(赋值构造函数)Test (const Test &obj){}Test (int a, int b){m_a = a;m_b = b;printf ("22222222222222个参数的构造函数被调用\n");}void setAB(int a, int b){m_a = a;m_b = b;}void print(){printf ("a = %d, b = %d\n", m_a, m_b);}
private:int m_a;int m_b;
};int main4_2()
{// 在定义对象的时候,会自动调用构造函数,这里会调用无参构造函数
#if 0Test t1,t2,t3,t4;t1.print();t4.print();
#endif// 对象定义方式:// 1、直接定义对象:括号法Test t1; // 调用无参构造函数Test t2(10); // 调用1个参数的构造函数Test t3(10,20); // 调用2个参数的构造函数// 2、等号的方式: 只能调用一个参数的构造函数,构造函数参数类型和等号右边数据类型一致Test t4 = 10; // 调用1个参数的构造函数Test t5 = (10,20); // 调用1个参数的构造函数Test t6 = "asdsad";Test t7 = t4;// 3、手动调用构造函数Test t8 = Test();Test t9 = Test(10);Test t10 = Test(10,20);return 0;
}int main4_1()
{Test t1;t1.setAB(10,20);t1.print();return 0;
}
析构函数:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>class Test5_1
{
public:Test5_1(){m_a = 10;printf ("无参构造函数被调用\n");}// 析构函数: 没有返回值、没有参数、系统自动调用// 在对象被销毁前会自动调用对象的析构函数~Test5_1(){printf ("*******************析构函数被调用\n");}
private:int m_a;
};int main5_1()
{{Test5_1 t;printf ("hello asdsadddddddddd\n");}printf ("-----------------------------\n");return 0;
}class Test5_2
{
public:Test5_2(){m_name = (char *)malloc(sizeof(char)*20);}~Test5_2(){if (m_name != NULL){free(m_name);m_name = NULL;}}
private:char *m_name;
};int main5_2()
{Test5_2 t1;return 0;
}