C++提供了构造函数来处理对象的初始化。
构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行。
构造函数不需要用户调用,也不能被用户调用。
构造函数的名字与类名同名,以便编译系统识别。
不具有任何类型,不返回任何值。
也可以在类内对构造函数进行声明,而在类外定义。
如果用户没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数。
这个函数叫做默认构造函数
对于有参数的构造函数,实参是在定义对象时给出的。
C++还提供另一种初始化数据成员的方法-参数初始化表 来实现对数据成员的初始化。
在一个类中可以定义多个构造函数,以便对类对象提供不同的初始化方法,这些构造函数具有相同的名字,而参数不同,这称为构造函数的重载。
构造函数说明:
- 调用构造函数时不必给出实参的构造函数,称为默认构造函数。(无参构造函数属于默认构造函数,一个类只能有一个默认构造函数)
- 如果建立对象时使用的是无参构造函数,应正确书写定义对象的语句
- 尽管一个类中可以包含多个构造函数,但对一个对象来说,建立对象时只执行其中一个构造函数。
构造函数初始化:
- 类名 对象(实参1,实参2....) //point p1(1,2);
- 参数初始化表 // void get_cube(int a,int b,int c):width(a),length(b),height(c){}
如果在一个类中定义全部默认参数的构造函数,不能在定义重载构造函数。//会产生二义性
C++中,初始化和赋值是两个完全不同的操作。
某些类不能依赖默认构造函数:
- C++编译器只有在发现类不包含任何构造函数的情况下才会替我们生成一个默认构造函数
- 对于某些类来说,默认构造函数可能执行错误的操作
- C++编译器不能为某些类生成默认构造函数 (这个类包含一个其他类类型的成员且这个成员没有默认构造函数)
对象在以下情况下会发生拷贝:
- 初始化变量时 //调用构造函数
- 以值的方式传递参数 //实参传递对象给形参
- 返回一个对象 //函数返回
A test() {
return *this;
}
A test1(A a2) { //这里参数传递的是对象,而不是引用
a = a2.a;
b = a2.b;
return *this;
}
A a1(1, 2);
A a2 = a1; //属于第一种情况
A a1(1, 2);
A a2(a1); //属于第一种情况
A a1(1, 2);
A a2(2, 3);
a1.test1(a2); //属于第二种情况
A a1(1, 2);
A a2 = a1.test(); // 属于第三种情况
构造函数的初始值不可缺少: //通过参数初始化表
- 数据成员是const
- 数据成员是引用
如果我们没有为类定义拷贝构造函数,编译器会为我们定义一个。 与默认构造函数不同,即使我们定义了其他构造函数,编译器也会为我们生成一个拷贝构造函数。