4)带参数的构造函数
用于:不同对象赋予不同的初值
# include <iostream>
# include <algorithm>
using namespace std;
//方式一
class Time{
public:
Time(int a, int b, int c);
void show_time();
private:
int hour;
double minute;
int sec;
};
Time::Time(int a, int b, int c) {
hour = a;
minute = b;
sec = c;
}
void Time::show_time() {
cout << hour << endl;
cout << minute << endl;
cout << sec << endl;
}
int main() {
int hour;
double minute;
int sec;
//根据输入的值给对象初始化更加灵活
cin >> hour >> minute >> sec;
Time t(hour, minute, sec);
t.show_time();
return 0;
}
5)用参数初始化表对数据成员初始化
:这是另一种初始化数据成员的方法。
用于:参数的初始化表法可以减少函数体的长度,使结构函数显得精炼简单,可在类体中直接定义构造函数。
# include <iostream>
# include <algorithm>
using namespace std;
class Time{
public:
//参数初始化表法效果与上一段代码相同
Time(int a, int b, int c) :hour(a), minute(b), sec(c) {
}
void show_time();
private:
int hour;
double minute;
int sec;
};
void Time::show_time() {
cout << hour << endl;
cout << minute << endl;
cout << sec << endl;
}
int main() {
int hour;
double minute;
int sec;
cin >> hour >> minute >> sec;
Time t(hour, minute, sec);
t.show_time();
return 0;
}
特点:数据成员为数组时,应当在构造函数的函数体中用语句对其赋值,不可在表中对其初始化。
Time(int a,char b[],int c):hour(a),sec(c){
strcpy(name,b);
}
6)构造函数的重载:
有默认值的构造函数可以代替构造函数的重载
构造函数具有相同的名字,而参数个数或参数类型不相同。
# include <iostream>
# include <algorithm>
using namespace std;
class Time {
public:
//两个同名的函数,前者有三个参数,后者没有参数
Time(int a, int b, int c) :hour(a), minute(b), sec(c) {
}
Time();
void show_time();
private:
int hour;
double minute;
int sec;
};
//构造函数
Time::Time() {
hour = 3;
minute = 2;
sec = 99;
}
//输出函数
void Time::show_time() {
cout << hour << endl;
cout << minute << endl;
cout << sec << endl;
}
int main() {
int hour;
double minute;
int sec;
cin >> hour >> minute >> sec;
Time t(hour, minute, sec);
t.show_time();
//t和t2分别调用其中一种构造方法
Time t2;
t2.show_time();
return 0;
}
运行结果:
第一行输入t的三个数值
第二行到第四行输出t的三个值
第五行到第七行,输出t2的初始值
特:
①在建立对象时不必给出实参的构造函数,称之为默认构造函数。如以上代码,t2就是一个默认构造函数。
②无参构造函数属于默认构造函数(有参的构造函数也可以是默认构造函数,比如给出所有变量默认值的构造函数)。
③ 一个类只可有一个默认构造函数。
④ 用户未定义构造函数时,系统会自动提供一个默认构造函数。
⑤ 若建立对象时选用的是无参构造函数,需注意书写定义对象的语句:
Time T;
Time T();//错误 ,构造函数是不可被用户显示调用的,
//此处不过是声明了一个普通的函数T()
⑥对于每一个对象来说,建立对象时只执行其中一个构造函数。
7)使用默认参数的构造函数
① 在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值,为了让用户知道在建立对象时怎么使用默认值(函数的定义在内部用户看不到)。
②在声明构造函数时,形参名可以省略
Box(int = 10,int = 10,int = 10);
③ 所有参数均被指定了默认值的构造函数与无参构造函数不可同时使用,
原因:构造函数的全部参数都被指定了默认值,则定义对象的时候既可以给一个,或多个甚至不给实参都是可以的,不给实参也可调用,所以其也属于默认构造函数,但是一个类中只能有一个默认构造函数,所以相冲突。
如下代码所示:
# include <iostream>
# include <algorithm>
using namespace std;
class Time{
public:
Time(int a = 10, int b = 10, int c = 10);
Time();
void show_time();
private:
int hour;
double minute;
int sec;
};
//以下两种定义构造函数的方法
Time::Time() {
hour = 3;
minute = 2;
sec = 99;
}
Time::Time(int a, int b, int c) :hour(a), minute(b), sec(c) {
}
void Time::show_time() {
cout << hour << endl;
cout << minute << endl;
cout << sec << endl;
}
int main() {
int hour;
double minute;
int sec;
cin >> hour >> minute >> sec;
Time t(hour, minute, sec);
t.show_time();
Time t2;//错误
//此处代码有歧义报错
//分不清楚时使用第一个构造函数还是无参的构造函数
t2.show_time();
return 0;
}
④一般构造函数的重载和有默认参数的构造函数不会同时使用,很容易出现歧义。
# include <iostream>
using namespace std;
class Time{
public:
Time();
//重载
Time(int, int);
//默认值
//Time(int x = 1);这一行不注释则会报错
int hour;
double mint;
int num;
};
Time::Time() {
hour = 1;
mint = 9;
num = 0;
}
//给定默认值
//Time::Time(int x) {不注释则会报错
//hour = x;
//}
int main() {
Time t;//上面两个位置不注掉则这一行会报错
cout << t.hour << endl;
}