构造函数
- 构造函数是类中的特殊的成员函数,其功能是对数据成员进行初始化。
- 不能被用户调用,由系统自动调用,而且只执行一次。
- 构造函数是一个与类名同名的,没有返回值的特殊成员函数。
构造函数的定义形式:
class 类名{ //类内定义
...
构造函数名(参数列表){
....
}
};
或者
类名::类名(参数列表){
...
}
默认构造函数
这种构造函数的特点是不带参数,其格式如下:
构造函数名(){
.... //函数体
}
- 如果类体中没有定义任何构造函数时,C++系统会自动创建一个默认的构造函数,该构造函数是一个无参构造函数,函数体也为空,该构造函数只负责创建对象,不做任何初始化工作。
系统默认的构造函数
类名::默认构造函数名(){
空
}
定义类时,只要显示定义了一个类的构造函数,那么编译器就不产生默认的构造函数
将不带参数的构造函数注释掉,发现编译器报错
没有相对应的构造函数A::A()。
- 产生对象时,系统必定要调用构造函数,所以任一对象的构造函数必须唯一。
带参数的构造函数
由于用户不能调用构造函数,所以不能用常规的调用函数的方法给出实参。
- 形式一:
类名 对象名(实参1,实参2,实参3,...);//使用有参数的构造函数创建对象
或者
类名 对象名;//使用无参数的构造函数创建对象
- 形式二:
类名 *指针变量名=new 类名(构造函数参数)
此时,编译系统开辟一段可以存放一个类对象的内存空间,通过构造函数给数据成员赋初值,这个对象没有名字,称为无名对象,但是该对象有地址,这个地址存放在指针变量p中,访问new运算符动态建立的对象一般是不用对象名的,而是通过指针访问
复制构造函数
- 复制构造函数又称复制初始化构造函数。也是用来初始化对象的,与一般构造函数的区别在于它是用一个已经存在的对象来对创建的对象进行初始化,即用已经存在的对象的每个数据成员的值来对创建的对象的对应数据成员进行初始化。其本质是对构造函数的重载之一
- 复制构造函数也是由系统自动调用的。
其格式如下:
class 类名{
构造函数名(形参);
构造函数名(类名 &对象引用名);
};
类名::构造函数名(类名 &对象引用名){
... //函数体
}
- 该函数的参数是该类对象的引用,且只有一个参数。
- 如果用户没有声明复制构造函数,系统将自动生成一个默认复制构造函数来实现用已知对象初始化新创建对象的功能。
- 定义复制构造函数时,一定注意,形式参数必须是该类对象的引用。
复制构造函数在四种情况下会被自动调用
- 用类的对象去初始化该类的另一个对象时
- 同类对象之间可用赋值运算符=实现相应的数据成员的复制
- 函数的形参为类的对象时,调用函数进行形参和实参的结合时
- 函数的返回值是类的对象时,系统自动调用复制构造函数
默认复制构造函数
程序员没有为类声明复制构造函数,则编译器自己生成一个复制构造函数。
上述代码隐含的复制构造函数:
A::A(A &p){
x=p.x;
y=p.y;
}