构造函数是一种特殊的成员函数,名字与类名完全相同,没有返回类型。
1.构造函数的作用
对象的数据成员一般在构造函数中初始化,构造函数可以保证对象在创建后其数据成员都已经被初始化,构造函数在创建对象是被自动调用,不能指定其返回类型。
2.构造函数的执行时机
- 对象被声明或创建时,构造函数将被自动调用。
- 全局对象在所有程序执行之前就被创建,也就是说在main函数执行之前。
- 局部动态对象和局部静态对象(static关键字声明)在程序执行到声明语句时被创建。
- 动态创建的对象(new运算符创建)在程序被执行到该语句时被创建。
3.构造函数重载
- 重载构造函数的类具有多个构造函数,这些构造函数的函数名完全相同,都没有返回类型,只是参数列表不同。
- 在调用时,系统根据函数名和参数列表共同确定该调用哪个函数,而且只会调用一次,并不会调用类的所有构造函数。
//A.h
#ifndef __A__H__
#define __A__H__
#include <iostream>
class A{
public:
A();
A(int z, int x, int c); // 重载类的构造函数
A(int z);
~A();
};
#endif
4.默认构造函数
- 不提供参数的构造函数是默认构造函数.
- 一个类不能有多个构造函数。
- 所有参数都是默认参数的构造函数也是默认构造函数。
class A{
public:
A(int a = 1, int b = 2); //含有默认参数的默认构造函数
};
5.复制构造函数
- 根据类的某个对象复制出一个完全相同的新对象的构造函数称为复制构造函数。
- 对象中包含指向动态分配空间的指针数据成员时,简单的赋值会导致两个指针数据成员指向同一块内存空间,这样很容易导致内存管理上的错误。正确的做法是为当前新建对象的指针数据成员分配新的空间,然后将参数对象中指针数据成员所指的动态分配空间中的数据复制过来。
//A.h
#ifndef __A__H__
#define __A__H__
#include <iostream>
class A{
public:
A();
//复制构造函数
A(A &a)
{
x = a.x;
y = a.y;
z = a.z;
}
~A();
private:
int x, y, z;
};
#endif