目录
构造函数
一般的构造函数都会有参数来初始化成员,而默认构造函数是没有参数的构造函数,在创建对象的时候如果对象名后面不加括号,那么系统就会调用默认构造函数,
//面向对象2
//作者:分解机226
#include <iostream>
using namespace std;
class BOLI
{
public:
BOLI()
{
xin = 5;
li = 20;
mian = 1;
shi = 314;
}
int xin;
int li;
int mian;
int shi;
};
int main()
{
BOLI boli;
cout << "想法是:" << boli.xin << boli.li << boli.mian << boli.shi << endl;
return 0;
}
我们可以看到BOLI类的构造函数没有参数,所以他就是一个默认构造函数,我们在主函数中声明变量boli的时候没有加参数列表,,就好像是声明了一个未初始化的变量那样,如果一个类没有任何的构造函数,系统就会自动生成一个默认函数,但是有些编译器声明不带参数却没有默认构造函数的对象有可能会报错。
重载构造函数
构造函数在重载的时候业满足一般函数的重载规则。
//面向对象2
//作者:分解机226
#include <iostream>
using namespace std;
class BOLI
{
public:
BOLI(int a,int b)
{
area = a * b;
}
BOLI(int a)
{
area = a*a;
}
int getBOLI()
{
return area;
}
private:
int area;
};
int main()
{
int a = 56;
int b = 456;
int c = 45;
BOLI area1(a, b);
BOLI area2(c);
cout << "a*b=" << area1.getBOLI() << endl;
cout << "c*c=" << area2.getBOLI() << endl;
}
上面的一段代码展示了和一般的函数重载原理相同构造函数的重载,由于实参的个数不同,编译器很容易就找到了相应版本的函数。
初始化列表
前面我们展示了一个构造函数的实例,类成员的初始化都在函数体中用赋值进行,我们也可以使用初始化列表来初始化
//面向对象2
//作者:分解机226
#include <iostream>
using namespace std;
class TIME
{
public:
TIME(int hr, int min ,int sec) :hour(hr), minute(min), second(sec)
{
}
int gethour()
{
return hour;
}
int getminute()
{
return minute;
}
int getsecond()
{
return second;
}
private:
int hour;
int minute;
int second;
};
int main()
{
TIME time(12, 18, 58);
cout << "时间是" << time.gethour() << "时"
<< time.getminute() << "分" <<
time.getsecond() << "秒" << endl;
return 0;
}
上面一段代码展示了初始化列表的使用,初始化列表在参数和函数体之间,以一个冒号开始,用逗号隔开几个类似调用构造函数的初始化表达式,初始化列表看似与函数体中赋值的形式等价,但是不是这样的,
//面向对象2
//作者:分解机226
#include <iostream>
using namespace std;
class B
{
public:
B()
{
cout << "B构造函数被调用" << endl;
num = 0;
}
private:
int num;
};
class A
{
public:
A(B bb)
{
cout << "A的构造函数被调用" << endl;
num = 0;
b = bb;
}
private:
int num;
B b;
};
int main()
{
B b;
cout << "创建A的对象前" << endl;
A a(b);
return 0;
}
上面的代码中,由于A中包含了一个B的对象,在进入A构造函数的函数体之前,虽然并没有初始化列表,但是系统还是会自动调用B的默认构造函数,因此运行结果才会打印“创建A的对象前”,
有些情况必须使用初始化列表 常量成员、引用成员、和没有默认构造函数的类成员,