对象的初始化和清理也是两个非常重要的安全问题。
(1)一个对象或变量没有初始化状态,对其使用后果是未知的。
(2)同样的使用完一个对象或变量,没有及时清理,也会照成一定的安全问题。
1. c++利用构造函数和析构函数解决上述问题,这两个函数都会被编译器自动调用,完成对象初始化和清理工作。
2. 对象的初始化和清理工作是编译器强制要我们去做的事情,因此如果我们不提供构造和析构函数,编译器会自动提供,编译器提供的构造和析构函数是空实现。
构造函数:主要作用在创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无需手动调用。
构造函数替换set,例如:
#include<iostream>
using namespace std;
class A
{
public:
void setx(int a)
{
x=a;
}
private:
int x;
};
int main()
{
return 0;
}
替换为:
#include<iostream>
using namespace std;
class A
{
public:
A(int a)
{
x=a;
}
private:
int x;
};
int main()
{
return 0;
}
特点:
1)构造函数的名字与类名相同。
2)构造函数无返回值。
3)构造函数可以有多个参数(根据成员变量的数量)。
4)构造函数由系统自动调用,在创建对象的同时系统会自动调用构造函数。
注意:c++类中不是必须有默认构造函数,如果你自己实现了构造函数,就没有,如果没有实现构造函数,系统就默认加上一个默认构造函数。
构造函数调用规则如下:
(1)如果用户定义有参构造函数,c++不再提供默认无参构造函数,但是会提供默认复制构造函数。
(2)如果用户定义了复制构造函数,c++不会提供其它(默认无参构造函数、有参构造函数)构造函数了。
析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
析构函数:回收对象。
特点:
1)析构函数的名字是类名前加~。
2)析构函数没有返回值。
3)析构函数没有参数,只能定义一个。
4)在对象被回收时由系统自动调用。
例如:
#include<iostream>
using namespace std;
class A
{
public:
~A()
{
}
private:
int x;
};
int main()
{
return 0;
}