C++构造函数

C++ 构造参数

图:深圳福田CBD

Guderian出品

本文整理自《北京大学公开课:C++面向对象程序设计》

构造函数的性质

  • 构造参数是成员函数的一种
  • 名字与类名相同,可以由参数,不能有返回值(void也不行)
  • 作用是对对象进行初始化,如给成员变量赋初值
  • 如果定义类的时候没写构造函数,则编译器生成一个默认的无参数的构造函数
  • 默认构造函数无参数,不进行任何操作
  • 如果定义了构造函数,则编译器不生成默认的无参数的构造函数
  • 对象生成时构造函数被自动调用。对象一旦生成,就再也不能在其上执行构造函数
  • 一个类可以有多个构造函数

注:如果只定义了带参构造函数,在定义对象时必须声明参数

为什么需要构造函数:

  • 不用专门写初始化函数,也不用担心忘记
  • 有时对象没有被初始化,会导致程序出错

构造函数的使用

一个类可以有一个构造函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Circle
{
private:
double radius, xLoc, yLoc;
public:
Circle(double r ,double x = 0, y = 0)
};
Circle::Circle(double r, double x, double y)
{
radius = r, xLoc = x, yLoc = y;
}

//Wrong samples
Circle c1; //error,缺少构造函数的参数
Circle *pc = new Circle; //error,没有参数

//Correct samples
Circle c1(2); //OK
Circle c1(2, 4, 4); //OK
Circle *pc = new Circle(3, 4); //also OK

一个类可以有多个构造函数

只要不同的构造函数的参数个数和参数类型不同,这些构造函数就会构成重载的关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Circle
{
private:
double radius, xLoc, yLoc;
public:
Circle(double r ,double x = 0, y = 0)
Circle(double r);
Circle(Circle c1, Circle c2)
};
Circle::Circle(double r, double x, double y)
{
radius = r, xLoc = x, yLoc = y;
}
Circle::Circle(double r)
{
radius = r;
}
Circle::Circle(Circle c1, Circle c2)
{
radius = c1.radius + c2.radius;
xLoc = c1.xLOc + c2.xLoc;
yLoc = c1.yLOc + c2.yLoc;
}

//Samples
Circle c1(3), c2(1, 0), c3(c1, c2);

构造函数在数组的使用(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class CSample
{
private:
int x;
public:
CSample()
{
cout << "Constructor 1 Called" << endl;
}
CSample(int n)
{
x = n;
cout << "Constructor 2 Called" << endl;
}
};

int main()
{
cout << "step1" << endl;
CSample array1[2];

cout << "step2" << endl;
CSample array2[2] = {4, 5};

cout << "step3" << endl;
CSample array3[2] = {3};

cout << "step4" << endl;
CSample *array4 = new CSample[2]; //随机生成两个元素的数组
delete []array4; //解除空间占用

return 0;
}

//输出:
step1//对两个对象初始化的参数没有作任何交代,编译器就认为这个对象就应该用无参的构造函数初始化
Constructor 1 Called
Constructor 1 Called
step2 //对两个对象初始化的参数都有交代
Constructor 2 Called
Constructor 2 Called
step3 //只对第一个对象初始化的参数作了交代
Constructor 2 Called
Constructor 1 Called
step4 //对两个对象初始化的参数没有作任何交代
Constructor 1 Called
Constructor 1 Called

构造函数在数组的使用(2)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Test
{
public:
Test(int n) {} //(1)
Test(int n, int m) {} //(2)
Test() {} //(3)
};

Test array1[3] = {1, Test(1,2)};
//三个元素分别用(1),(2),(3)初始化

Test array2[3] = {Test(2, 3), Test(1, 2), 1};
//三个元素分别用(2),(2),(1)初始化

Test *pArray1[3];
//仅仅这么定义是不会导致对象生成的,不会引发Test的构造函数被调用。
//*pArray1[3]仅仅是指针而已,不会产生任何对象

Test *pArray2[3] = {new Test(4), new Test(1, 2)};
//对指针数组的前两个元素初始化,方法是new两个对象,返回值是指针,用new的两个对象的地址去初始化数组pArray2[3]的前两个元素。
//注意这个语句只生成了两个对象,pArray2[2]还是一个指针,无从得知它的指针指向哪里,它的生成并不会导致任何对象的生成。

//注意在使用中,指针数组与数组的区别

参考并整理自《C++面向对象程序设计》郭炜,北京大学,感谢原作者!编辑时有删改

本文标题:C++构造函数

文章作者:G-SS-Hacker

发布时间:2019年12月04日 - 17:10:38

最后更新:2019年12月07日 - 10:50:36

原始链接:https://G-SS-Hacker.github.io/C-构造函数/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。