一:函数作用
对象的初始化和清理是程序中非常重要的安全问题:一个对象或者变量没有初始状态,对其使用后果是未知,同样的使用完一个对象或变量,没有及时清理,也会造成—定的安全问题。
C++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工作。对象的初始化和清理工作是编译嚣强制要我们做的事情,因此如果我们不提供构造和析构,编译器会提供的构造函数和析构函数是空实现。
一般我们在写一个类的时候,编译器会帮我们自动生成构造函数和析构函数,但是是空的
class MyClass
{
public:
MyClass(); //默认构造函数
~MyClass(); //默认析构函数
private:
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
- 构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用,无须手动调用。
- 析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。
二:函数语法
2.1构造函数语法:类名(){}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发生重载
4.程序在调用对象时候会自动调用构造,无须手动调用,而且只会调用一次
2.2析构函数语法:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前加上符号~
3.析构函数不可以有参数,因此不可以发生重载
4.程序在对象销毁前会自动调用析构,无须手动调用,而且只会调用一次
三:构造函数的分类以及调用
3.1两种分类方式:
按参数分为:有参构造和无参构造(默认构造)
按类型分为:普通构造和拷贝构造
3.2 三种调用方式:
括号发
显示法
隐式转换法
#include<iostream>
#include<algorithm>
using namespace std;
class Person
{
public:
// 无参构造函数
Person() {
}
//有参构造,变量的初始化
Person(int a) {
age = a;
}
//拷贝构造,将一个对象身上的属性拷贝到另一个对象上面
Person(const Person &p) {
age = p.age;
}
~Person();
int age;
private:
};
//调用方法
void test01() {
//1.括号法
Person p1; //默认构造函数调用 注意:这里不加(),加()之后编译器会认为这是一个函数声明
Person p2(10); //有参构造函数调用
Person p3(p2); // 拷贝构造函数调用
//2.显示法 注意:等号的右边为匿名对象,当前执行结束后系统会立刻回收掉匿名对象
Person p1;
Person p2 = Person(10);
Person p3 = Person(p2);
// 3.隐式转换法
Person p4 = 10;
Person p5 = p4;
}
int main()
{
Person p;
system("pause");
return 0;
}
四:拷贝函数的调用时机
- 使用一个已经创建完毕的对象来初始化一个新的对象
- 值传递的方式给函数传值
- 以值方式返回一个局部对象
#include<iostream> #include<algorithm> using namespace std; class Person { public: Person() {} Person(int a) { m_age = a; } Person(const Person &p) { m_age = p.m_age; } ~Person(); int m_age; private: }; //1.使用一个已经创建完毕的对象来初始化一个新的对象 void test01() { Person p2(10); Person p3(p2); } //2.值传递的方式给函数传值 void doWork(Person p) { } void test02() { Person p; doWork(p); } //3.以值方式返回一个局部对象 Person doWork2() { Person p6; return p6; } void test02() { Person p = doWork2(); } int main() { system("pause"); return 0; }