首页 > 其他 > 详细

拷贝构造函数

时间:2016-11-12 01:35:57      阅读:271      评论:0      收藏:0      [点我收藏+]

 类进行拷贝初始化时会调用拷贝构造函数,拷贝初始化发生在以下几种情况中:

[1] 有“=”的地方会发生拷贝;

[2] 将一个对象作为参数传递给一个非引用的对象时;

[3] 从一个返回类型为引用的类型的函数返回一个对象;

[4] 用花括号初始化一个数组中的元素;

拷贝构造函数的形参必须为引用类型,我认为应该有两点原因:

1. 在类的类部定义该类的对象,只能定义为引用类型或指针类型,因为其属于不完全类型;

2. 如果不定义为引用就会陷入无限的循环——调用拷贝构函数,必须拷贝它的实参,而拷贝它的实参就要调用拷贝构造函数

 1 #include <iostream>
 2 #include <cmath>
 3 using namespace std;
 4 class Point
 5 {
 6 public:
 7     Point(int xx = 0, int yy = 0)
 8     {
 9         x = xx;
10         y = yy;
11         cout << "calling the constructor of point" << endl;
12     }
13 
14     Point(const Point & p)
15     {
16         x = p.x;
17         y = p.y;
18         cout << "calling the copy constructor of point" << endl;
19     }
20 
21     int getx() const
22     {
23         return x;
24     }
25 
26     int gety() const
27     {
28         return y;
29     }
30 private:
31     int x, y;
32 };
33 
34 class Line
35 {
36 public:
37     Line(Point pa, Point pb)
38         :p1(pa), p2(pb)
39     {
40         cout << "calling the constructor of Line" << endl;
41         double x = static_cast<double>(p1.getx() - p2.getx());
42         double y = static_cast<double>(p1.gety() - p2.gety());
43         len = sqrt(x*x +y*y);
44     }
45 
46     Line(const Line & L)
47         :p1(L.p1), p2(L.p2)
48     {
49         len = L.len;
50         cout << "calling the copy constructor of Line" << endl;
51     }
52 
53     double getLen() const
54     {
55         return len;
56     }
57 private:
58     Point p1, p2;
59     double len;
60 };
61 
62 
63 int main()
64 {
65     Point myp1(1, 1), myp2(4, 5);
66     Line L1(myp1, myp2);
67     Line L2(L1);
68     cout << "the lenth of L1 is" << L1.getLen() << endl;
69     cout << "the lenth of L2 is" << L2.getLen() << endl;
70     return 0;
71 }

 

拷贝构造函数

原文:http://www.cnblogs.com/liuteng/p/6055893.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!