对象的初始化
- 不能在声明类时初始化数据成员
- 对象的初始化方法
- 调用对外接口public成员函数实现
- 构造函数实现
构造函数
构造函数是一种特殊的成员函数 它主要用于为对象 分配空间 进行初始化
特点:
- 函数名与类名相同
- 没有返回类型(有隐含的返回值,系统内部使用)
- 不能被显式调用
- 函数体可以写在类体内或类体外
- 可以重载
- 不能继承
- 一般声明为公有函数
两种方式:
- 构造函数体内赋值语句
class Date{
public:
Date(int y, int m, int d) {
year = y;
month = m;
day = d;
}
private:
int year, month, day;
};
- 构造函数的初始化列表
class Date{
public:
Date(int y, int m, int d): year(y), month(m), day(d) { };
private:
int year, month, day;
};
构造函数的调用
在声明类时如果没有定义类的构造函数,编译系统就会在编译时自动生成一个默认形式的构造函数,默认构造函数是构造对象时不提供参数的构造函数。
除了无参数构造函数是默认构造函数外,带有全部默认参数值的构造函数也是默认构造函数。
(注意这两者情况不能同时算为默认构造函数;当同时出现时,一般是没有参数的那个算)
一个类只能有一个默认构造函数
自动调用:构造函数在定义类对象时自动调用,不需用户调用,也不能被用户调用。在对象使用前调用。
调用顺序:在对象进入其作用域时对象使用前调用构造函数。
初始化列表的注意点
对于常量类型和引用类型的数据成员不能在构造函数中用赋值语句直接赋值的情况,提供初始化表进行赋初值。
#include<iostream>
using namespace std;
class A
{
public:
A(int x1) : x(x1), rx(x), pi(3.14) {};
void print() {
cout << "x=" << x << " "
<< "rx=" << rx << " "
<< "pi=" << pi << endl;
}
private:
int x;
int& rx;
const float pi;
};
int main()
{
A a(10);
a.print();
return 0;
}
如果需要将数据成员存放在堆中或数组中,则应在构造函数中使用赋值语句(即使构造函数有成员初始化表)。
class C
{
public:
C(int I, char Ch, float F, char N[]) : i(I), ch(Ch), f(F)
{
strcpy(name, N);
}
private:
int i;
char ch;
float f;
char name[25];
};
类成员是按照它们在类里被声明的顺序初始化的,与它们在初始化表中列出的顺序无关
class D{
private:
int mem1;
int mem2;
public:
D(int i): mem2(i), mem1(mem2 + 1)
{
cout << "mem1:" << mem1 << endl;
cout << "mem2:" << mem2 << endl;
}
};
int main()
{
D d(15);
return 0;
}
/*
输出结果:
mem1:-858993459
mem2:15
*/
问题
#include<iostream>
using namespace std;
class X {
public:
X();
X(int x = 0) :x(x) {};
private:
int x;
};
void main()
{
X a(10);
X b; // ERROR,包含多个默认构造函数
}