1.构造函数
1.概念
百度百科:构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
2.调用的时机
创建对象时进行调用,类似于 python 中定义类时的 init 方法。
3.是否可重载
可以对构造函数进行重载,比如多写几个构造函数进行重载。
class CPerson
{
private:
int m_age;
bool m_sex;
public:
CPerson()
{
m_age = 20;
m_sex = true;
}
CPerson(int age, bool sex)
{
m_age = age;
m_sex = sex;
}
};
2.析构函数
1.概念
百度百科:析构函数(destructor)与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
课上所学:当一个对象生命周期结束时,其所占的空间需要被释放,析构函数就是要删除类内指针成员在堆区分配的空间。
2.调用时机
在对象的生命周期结束时自动调用。
3.例子
class CPerson
{
private:
int m_age;
bool m_sex;
char *m_name;
public:
CPerson()
{
m_age = 18;
m_sex = true;
m_name = new char;
}
~CPerson()
{
delete m_name;
m_name = 0;
}
};
2.接口函数
1.定义
百度百科:接口函数就是某个模块写了(主要)给其它模块用的函数。简单的说接口函数就是类中的公有函数。
课上所理解:在定义一个类时用来使用其中私有属性的共有函数(方法)。
2.例子
class CPerson
{
private:
int m_age;
bool m_sex;
char *m_name;
public:
CPerson()
{
m_age = 18;
m_sex = true;
m_name = new char;
}
~CPerson()
{
delete m_name;
m_name = 0;
}
public:
void SetCPersonParam(int age, bool sex, char *name) // 接口函数
{
m_age = age;
m_sex = sex;
m_name = name;
}
};
3.构造函数小知识
1.当一个类有成员属性时,一定要有构造函数
2.未完待续…
4.完成一个单链表类的声明
有瑕疵编程(瑕疵存在于会在return时出现内存错误)
class CList
{
private:
typedef struct NODE
{
int node_id;
string node_name;
struct NODE *node_p_next;
}Node;
Node *p_head;
Node *p_end;
int length_of_list;
public:
CList()
{
p_head = new Node;
p_head = 0;
p_end = new Node;
p_end = 0;
int length_of_list = 0;
}
CList(int length)
{
length_of_list = length;
}
~CList()
{
delete p_head;
p_head = 0;
delete p_end;
p_end = 0;
}
public:
Node *CreateNode(int id, string name)
{
Node *p_node = new Node;
p_node->node_id = id;
p_node->node_name = name;
p_node->node_p_next = 0;
return p_node;
}
void PushBack(int id, string name)
{
Node *new_node = CreateNode(id, name);
if(p_head)
{
(p_end)->node_p_next = new_node;
}
else
{
p_head = new_node;
}
p_end = new_node;
return;
}
void PopInfront()
{
Node *p_flag = p_head;
if(p_flag)
{
p_head = p_head->node_p_next;
delete p_flag;
p_flag = 0;
}
return;
}
void GetLength()
{
Node *p_flag = p_head;
while (p_flag)
{
CList::length_of_list += 1;
p_flag = p_flag->node_p_next;
}
}
};
int main()
{
CList list1;
list1.PushBack(1, "1");
list1.PushBack(2, "2");
list1.GetLength();
system("pause");
return 0;
}
------------------------------------分割线-------------------------------------------
5.补充
1.对于一个对象的定义,有三种方法:
1.先声明类型,然后再定义对象
class CPerson
{
};
int main()
{
class CPerson ps1;
CPerson ps2;
}
2.在声明类的同时定义对象
class CPerson
{
}ps1, ps2;
3.不出现类名,直接定义对象
class
{
}ps1, ps2;
2.C++中结构体与类的异同
1.结构体与类都可以包括成员函数;
2.用struct可以声明类,与class声明的类的不同之处在于若不加以private或public的声明,系统将默认为public;而class则会被默认为private;
3.在类外声明成员函数
class CPerson
{
private:
int n_age;
int n_sex;
public:
void ShowPersonInfo(); // 公用成员函数原型声明
}
void CPerson::ShowPersonInfo()
{
cout << n_age << endl;
cout << n_sex << endl;
}
4.内置成员函数
1.定义
在类体中定义的成函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的,调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在 类体中 定义的成员函数中 不包括循环等控制结构 ,C++系统会自动的对它们作为 内置(inline)函数 来处理。也就是说,在程序调用这些成员函数时,并不是真正地执行函数的调用过程,而是把函数代码嵌入程序的调用点。
2.实现
class CPerson
{
private:
int n_age;
int n_sex;
public:
inline void ShowPersonInfo();
};
inline void CPerson::ShowPersonInfo()
{
cout << n_age << endl;
cout << n_sex << endl;
}