一.构造函数
类似于java,C++中也有构造函数的概念,相关用法如下:
1.1 构造函数的定义
#includeusing namespace std;class Student{private: char *m_name; int m_age; float m_score;public: //声明构造函数 Student(char *name, int age, float score); //声明普通成员函数 void show();};//定义构造函数Student::Student(char *name, int age, float score){ m_name = name; m_age = age; m_score = score;}//定义普通成员函数void Student::show(){ cout< <<"的年龄是"< <<",成绩是"< < show(); return 0;}
运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是961.2 构造函数的重载
构造函数同样也支持重载操作:
#includeusing namespace std;class Student{private: char *m_name; int m_age; float m_score;public: Student(); Student(char *name, int age, float score); void setname(char *name); void setage(int age); void setscore(float score); void show();};Student::Student(){ m_name = NULL; m_age = 0; m_score = 0.0;}Student::Student(char *name, int age, float score){ m_name = name; m_age = age; m_score = score;}void Student::setname(char *name){ m_name = name;}void Student::setage(int age){ m_age = age;}void Student::setscore(float score){ m_score = score;}void Student::show(){ if(m_name == NULL || m_age <= 0){ cout<<"成员变量还未初始化"< show(); pstu -> setname("李华"); pstu -> setage(16); pstu -> setscore(96); pstu -> show(); return 0;}
运行结果:
小明的年龄是15,成绩是92.5
成员变量还未初始化李华的年龄是16,成绩是961.3 默认构造函数
类似于java,如果用户自己没有定义构造函数,那么编译器会自动生成一个默认的构造函数,只是这个构造函数的函数体是空的。
注意:调用没有参数的构造函数也可以省略括号。
Student *stu = new Student;
Student *stu = new Student();
以上两种写法是等价的。
1.4 构造函数的参数初始化表
构造函数的主要目的是用于对成员变量进行初始化, 为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用参数初始化表。具体写法如下:
#includeusing namespace std;class Student{private: char *m_name; int m_age; float m_score;public: Student(char *name, int age, float score); void show();};//采用参数初始化表Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ //TODO:}void Student::show(){ cout< <<"的年龄是"< <<",成绩是"< < show(); return 0;}
运行结果:
小明的年龄是15,成绩是92.5
李华的年龄是16,成绩是961.5 使用参数初始化表来初始化const成员变量
参数初始化表还有一个很重要的作用,那就是初始化 const 成员变量。初始化 const 成员变量的唯一方法就是使用参数初始化表。例:
class VLA {private: const int m_len; int *m_arr;public: VLA(int len);};VLA::VLA(int len):m_len(len) { m_arr = new int[len];}
二.析构函数
创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存、关闭打开的文件等,这个函数就是析构函数。
析构函数(Destructor)也是一种特殊的成员函数,没有返回值,不需要程序员显式调用(程序员也没法显式调用),而是在销毁对象时自动执行。构造函数的名字和类名相同,而析构函数的名字是在类名前面加一个~
符号。
注意:析构函数没有参数,不能被重载,因此一个类只能有一个析构函数。如果用户没有定义,编译器会自动生成一个默认的析构函数。
class VLA {public: VLA(int len); ~VLA(); // 析构函数private: const int m_len; int *m_arr;};VLA::VLA(int len):m_len(len) { // 构造函数初始化 if (len > 0) {m_arrz = new int[len];}; else {m_arr = NULL;};}VLA::~VLA() { delete []m_arr; // 在析构函数中释放堆区申请的内存}
C++ 中的 new 和 delete 分别用来分配和释放内存,它们与C语言中 malloc()、free() 最大的一个不同之处在于:用 new 分配内存时会调用构造函数,用 delete 释放内存时会调用析构函数。构造函数和析构函数对于类来说是不可或缺的,所以在C++中我们非常鼓励使用 new 和 delete。