uacs2024

导航

C++ 拷贝构造函数(初学有点难理解)

拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:

  • 通过使用另一个同类型的对象来初始化新创建的对象。

  • 复制对象把它作为参数传递给函数。

  • 复制对象,并从函数返回这个对象。

如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:

classname (const classname &obj) {
   // 构造函数的主体
}

在这里,obj 是一个对象引用,该对象是用于初始化另一个对象的。

 1 #include <iostream>
 2 using namespace std;
 3  
 4 class Line
 5 {
 6    public:
 7       int getLength( void );
 8       Line( int len );             // 简单的构造函数
 9       Line( const Line &obj);      // 拷贝构造函数
10       ~Line();                     // 析构函数
11  
12    private:
13       int *ptr;
14 };
15  
16 // 成员函数定义,包括构造函数
17 Line::Line(int len)
18 {
19     cout << "调用构造函数" << endl;
20     // 为指针分配内存
21     ptr = new int;
22     *ptr = len;
23 }
24  
25 Line::Line(const Line &obj)
26 {
27     cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;
28     ptr = new int;
29     *ptr = *obj.ptr; // 拷贝值
30 }
31  
32 Line::~Line(void)
33 {
34     cout << "释放内存" << endl;
35     delete ptr;
36 }
37 int Line::getLength( void )
38 {
39     return *ptr;
40 }
41  
42 void display(Line obj)
43 {
44    cout << "line 大小 : " << obj.getLength() <<endl;
45 }
46  
47 // 程序的主函数
48 int main( )
49 {
50    Line line1(10);
51  
52    Line line2 = line1; // 这里也调用了拷贝构造函数
53  
54    display(line1);
55    display(line2);
56  
57    return 0;
58 }

运行结果:

调用构造函数
调用拷贝构造函数并为指针 ptr 分配内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
调用拷贝构造函数并为指针 ptr 分配内存
line 大小 : 10
释放内存
释放内存
释放内存

看这个可能更好理解:  https://www.cnblogs.com/uacs2024/p/17956948

posted on 2024-03-02 14:44  ᶜʸᵃⁿ  阅读(6)  评论(0编辑  收藏  举报