从c++的拷贝构造函数再次理解指针和内存

首先来看这个学习教程:https://www.runoob.com/cplusplus/cpp-copy-constructor.html


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

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

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

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

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

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

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

(看不下去?没关系,接下来我们图文并茂的让你理解透彻~)

//c++拷贝构造函数

#include <iostream>
using namespace std;

class Line
{
public:
    int getLength(void);
    Line(int len); //简单构造函数
    Line(const Line &obj); //拷贝构造函数
    ~Line(); //析构函数
private:
    int *ptr;
};

//成员函数定义,包括构造函数
Line::Line(int len)
{
    cout << "调用构造函数" << endl;
    //为指针分配内存
    ptr = new int;
    *ptr = len;
}

Line::Line(const Line &obj)
{
    cout << "调用拷贝构造函数并为指针ptr分配内存" << endl;
    ptr = new int;
    *ptr = *obj.ptr; //拷贝值
}

Line::~Line(void)
{
    cout << "释放内存" << endl;
    delete ptr;
}

int Line::getLength(void)
{
    return *ptr;
}

void display(Line obj)
{
    cout << "line 大小:" << obj.getLength() << endl;
}

//程序的主函数
int main()
{
    Line line(10);
    display(line);
    system("pause");
}

啥也别管,先读完及手敲完上面的代码,然后运行出结果:


好了,如果看不懂程序,那就打断点,看内存、堆栈,基本遇到的问题和bug都会解决的。(重要的话要括起来说~)

Step1分析:

Step2分析:

Step3分析:

 

Step4分析:

引用相当于别名,所以这里的 obj 的值和ptr的值一毛一样。 

Step5分析:

Step6分析:

Step7分析:


重点再说一下:

好了。你要真看不懂。那就多读几遍。。

再看不懂的话,,,那只能说,,回去好好学习c++。。。。。

记住,指针,也是一种变量,只是存的是地址而已。

 

 

 

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页