一.类::构造函数
1.编码规范:声明变量赋初值
int i=0;
int *p=NULL; //最新版本为nullptr
malloc申请到的内存区域使用memset进行设置
2.对象在定义时进行初始化
完成对象初始化的函数即构造函数
类的对象的初始化只能由类的成员函数来进行;
简历对象的同时,自动调用构造函数;
类对象的定义涉及到一个雷鸣和一个对象名;
由于类的唯一性和对象的多样性,用类名而不是对象名来作为构造函数名;
默认构造函数:没有定义构造函数时,编译器会提共一个默认构造函数;(C++规定,类必须有一个构造函数)
只要定义一个构造函数,C++编译器就不再提供默认的构造函数;
与定义变量类似,在默认构造函数创建对象时,如果创建的是全局对象或静态对象,则对象的位模式全为0,否则对象值是随机的;
例如:
class Car{
public:
voidrun();
voidstop();
private:
int m_price;
int m_carNum;
};
此类中没有定义构造函数,编译器的默认构造函数为在定义对象时给予m_price,m_carNun一个默认的随机值。
定义一个构造函数:
class Car{
public:
Car();//构造函数也可以重载;此也为默认的构造函数
Car(int price=1000,int number=0); //实参必须给初始值 否则定义构造函数将会出错
voidrun();
voidstop();
void set(int price, int number);
private:
int m_price;
int m_carNum;
};
实现:Car::Car(int price, int number) //定义放在类的的外部时的格式 “类名::”
{
set(price,number); //调用类的成员函数set();
}
构造函数另一个特殊之处是它没有返回类型,函数体中也不允许有返回值,但可以有无值返回语句 " return;".
如果建立一个对象数组:Desk dd[5]; //对象数组dd,构造函数会被调用5次
3.构造函数的初始化列表中数据的初始化顺序和声明的顺序相同
例如:
class Student{
public:
Student(int id):m_id(id),m_score(100) //冒号表示后面要对类的数据成员进进行初始化(性能更快)
{
//一般情况下使用这种构造函数初始化
/*
m_id=id;
m_score=100;
*/
private:
int m_id;
int m_score;
};
构造函数可以有多个,可以被重载;构造函数可以用于隐式类型转换;//加关键字explicit来防止隐式类型转换
二.类::析构函数
一个类可能在构造函数里分配资源,这些资源需要在对象不复存在以前被释放;
析构函数也是特殊类型的成员,没有返回类型,没有参数,不能随意调用,也没有重载。只是在类对象生命期结束的时候,由系统自动调用;
析构函数名,就是在构造函数名前加上一个逻辑非运算行“~”,表示逆构造函数。
例如:
4 class Student{
5 public:
6 explicit Student(int id); //构造函数
7 ~Student(); //析构函数
8 inline int getId()
9 {
10 return m_id;
11 }
12 void setId(int id)
13 {
14 m_id=id;
15 }
16 inline int getScore()
17 {
18 return m_score;
19 }
20 void setScore(int score)
21 {
22 m_score=score;
23 }
24 private:
25 int m_id;
26 int m_score;
27 };
如果类没有自定义析构函数,编译器提供一个默认的析构函数,而且只有一个。