1.数据成员初始化:
基于对象的程序中,在定义对象时,需要做初始化工作,即对数据成员赋值,类是一种抽象类型,并不占存储空间,不能容纳数据。如果一个类中的所有成员都是公用的,则可以在定义对象时对数据成员进行初始化。
构造函数实现数据成员的初始化。不需要用户调用它,而是在建立对象时自动执行。
例如:声明一个时间类,实现构造函数对类的数据成员初始化:
#include <iostream>
using namespace std;
class Time //声明Time类
{
public:
Time()
{
hour = 0; //定义构造函数,函数名与类名相同
min = 0; //利用构造函数对对象中的数据成员赋初值
sec = 0;
}
void set_time(); //成员函数声明
void show_time();
private: //私有数据
int hour;
int min;
int sec;
};
void Time::set_time() //定义成员函数,向成员函数赋值
{
cin >> hour;
cin >> min;
cin >> sec;
}
void Time::show_time() //定义成员函数,输出数据成员的值
{
cout << hour << ":" << min << ":" << sec << endl;
}
int main()
{
Time t1; //建立对象t1,同时调用构造函数t1.Time()
t1.set_time(); //对t1的数据成员赋值
t1.show_time(); //显示t1的数据成员的值
Time t2;
t2.show_time();
Time t3;
t3.set_time();
t3.show_time();
system("pause");
return 0;
}
2.带参数的构造函数:
带参的构造函数中的形参,其对应的实参是在建立对象时给定的,即在建立对象时同时指定数据成员的初值。
定义不同对象时用的实参是不同的,它们反映不同对象的属性。用这种方法可以方便地实现对不同对象进行不同的初始化。使用起来方便,直观,从定义语句中可以直接看到数据成员的初值。例如:
#include <iostream>
using namespace std;
class Box
{
public:
Box(int, int, int); //声明带参数的构造函数
//Box::Box(int h, int w, int l) :_height(h), _width(w), _length(l){}
//用参数初始化表对成员数据初始化,与类外定义构造函数初始化效果等价
int volume(); //声明计算体积的函数
private:
int _height; //类的成员变量,习惯前加"_"或"m_"表示类的成员
int _width;
int _length;
};
Box::Box(int h, int w, int l) //在类外定义带参数的构造函数
{
_height = h;
_width = w;
_length = l;
}
int Box::volume() //定义计算体积的函数
{
return(_height*_width*_length);
}
int main()
{
Box V1(10, 10, 3); //建立对象V1,并指定长宽高
cout << V1.volume() << endl;
system("pause");
return 0;
}
3.参数初始化表
用参数初始化表对数据成员初始化,这种方法不在函数体内对数据成员初始化,而是在函数首部实现,如:Box::Box(int h, int w, int l) :_height(h), _width(w), _length(l){},即在原来函数首部末尾加冒号,然后列出参数的初始化表,上面初始化表示:用形参h的值初始化数据成员_height,用形参w的值初始化数据成员_width,用形参l的值初始化数据成员_length,后面的花括号是空的,即函数体是空的,没有任何执行语。用参数初始化表法可以减少函数体的长度,是结构函数显得精炼简单。这样就可以直接在类体中定义构造函数。尤其当需要初始化的数据成员较多时更显优越性。
类名::构造函数名([参数表])[:成员初始化表]
{
[构造函数体]
} //其中方括号内为可选项(可有可无)
如果数据成员是数组,则应当在构造函数的函数体中用语句对其赋值,而不能在参数初始化列表中对其初始化,如:
#include <iostream>
#include <string.h>
using namespace std;
class Student
{
public:
Student(int n, char s, char nam[]) :num(n), sex(s)
{ strcpy_s(name, nam); }
void Display()
{
cout << num <<" "<< sex <<" "<<name << endl;
}
private:
int num;
char sex;
char name[20];
};
int main()
{
Student s1(1021, 'm', "lily");
s1.Display();
system("pause");
return 0;
}
4.函数重载:
在同一个作用域类,一组函数的函数名相同,参数列表不同(个数/类型不同),返回值可同可不同。函数重载与返回类型无关,通过参数类型,调用不同的函数。
构造函数的重载 在一个类里可以定义多个构造函数,以便为对象提供不同的初始化方法,供用户选用,这些构造函数具有相同的名字,而参数的个数或参数类型可以不同。
#include <iostream>
using namespace std;
class Box
{
public:
Box(); //声明一个无参的构造函数
Box(int h, int w, int l) :_height(h), _width(w), _length(l){}
//定义一个有参的构造函数,用参数的初始化表对数据成员初始化
int volume();
private:
int _height;
int _width;
int _length;
};
Box::Box()
{
_height = 10;
_width = 10;
_length = 10;
}
int Box::volume()
{
return (_height*_width*_length);
}
int main()
{
Box box1;//建立一个box1对象,不对其进行赋值,则其值则是构造函数初始化中的值
cout << box1.volume() << endl;
Box box2(12, 1, 2);//建立对象box2,指定3个实参
cout << box2.volume() << endl;
system("pause");
return 0;
}