uacs2024

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

统计

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   ᶜʸᵃⁿ  阅读(19)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示