#include<iostream>
using namespace std;
class box
{
public:
box() {
h = 1;
w = 1;
len = 1;
}
box(int a, int b, int c);
int he();
private:
int h, w, len;
};
box::box(int a, int b, int c) :h(a), w(b), len(c) {};
int box::he()
{
int sum = h * w * len;
return sum
;
}
int main() {
box box1(10, 20, 56),box2;//box2不加()
cout<<box1.he()<<endl;
cout << box2.he() << endl;
}
不能在类中直接对数据成员直接初始化,因为类并不是一个实体,而是一种抽象类型,并不占用存储空间,所以就用到了构造函数。
构造函数:
1.必须与类名相同,且不具有任何类型,不返回任何值。
2.如果没写构造函数,系统也会默认给一个构造;
3.存在一种参数初始值表的方式,来初始化,例:
box::box(int a, int b, int c) :h(a), w(b), len(c) {};
其中h(a)等价于h=a;
注意!!如果数据成员也有数组,必须对数组在{}中赋值不可以用初始化表;
4.构造函数也可以无参数如box2。注意!! 构造无惨对象时不带();!!
5.构造函数可以重载(参数个数,参数类型);
6.无参构造函数要与默认参数的构造函数区分;两者不可以重载,存在二义性;
带默认参数的构造函数
#include<iostream>
using namespace std;
class box
{
public:
box(int a , int b = 1, int c = 1); //: h(a), w(b), len(c) {} 可以这样
//默认构造,都是从右向左开始,右边必须给默认,而不能int a=1 , int b = 1, int c
int he();
private:
int h, w, len;
};
box::box(int a,int b,int c) {//x(int a=3,int b=4,int c=10)报错
h = a;
w = b;
len = c;
}
int box::he()
{
int sum = h * w * len;
return sum
;
}
int main() {
box box1(10, 20, 56), box2(1), box3(10, 20);//box2不加()
cout << box1.he() << endl;
cout << box2.he() << endl;
cout << box3.he() << endl;
}
结果:
11200
1
200
1.如果声明的时候给了默认参数值,定义时就算写一样的参数也会报错,
2.除非声明不给默认,定义时候再给默认;
3.默认构造,都是从右向左开始,右边必须给默认,而不能int a=1 , int b = 1, int c