C++面向对象高级编程_侯捷(上2) class with pointer

7 三大函数:拷贝构造、拷贝复制、析构

7.1 C++两个经典分类

  • Class without pointer member(s)
    complex
  • Class with pointer member(s)
    string

7.2 String class

string.h

#ifndef __STRING__
#define __STRING__

class String
{
    ...
}

String::function(...) ...

Global-function(...) ...

#endif

string-test.cpp

int main()
{
    String s1();
    String s2("hello");

    String s3(s1);  // 拷贝构造
    cout << s3 << endl;
    s3 = s2;  // 拷贝赋值

    cout << s3 << endl;
}

如果类里面有指针成员变量,拷贝构造函数需要自己写。否则按照编译器默认的拷贝构造函数,会造成两个对象的指针成员变量指向同一块地址。

7.3 Big Three,三个特殊函数 1 2 3

class String
{
public:
    String(const char* cstr = 0);  // 0 默认构造函数
    String(const String& str);    // 1 拷贝构造函数
    String& operator=(const String& str);    // 2 拷贝赋值函数
    ~String();  // 3 析构函数
    char* get_c_str() const { return m_data; }

private:
    char* m_data; 
}

拷贝构造函数

拷贝复制函数

inline
String& String::operator=(const String& str)
{
    if(this == &str) // 检测自我赋值
        return *this;
    
    delete[] m_data;
    m_data = new char[strlen(str.m_data)+1];
    strcpy(m_data, str.m_data);
    return *this;
}

析构函数

堆,栈与内存管理

stack,栈是存在于某作用域的一块内存空间。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址,以及local object。
在函数本体内声明的任何变量,其所使用的内存块都取自上述stack。

Heap,或称system heap,堆是指由操作系统提供的一块global内存空间,程序可动态分配从某中获得的若干区块。

stack objects的生命期

stack object的生命在作用域结束之际结束。
这种作用域内的object,又称为auto object,因为它会被自动清理。

static local objects的生命期

static object的生命在作用域结束之际仍然存在,直到整个程序结束。

global objects的生命期

在整个程序结束之际才结束。

heap objects的生命期

在被delete之际结束。不delete堆对象,会造成内存泄漏(指针已经死亡,但指向的空间还在)。

new:先分配memory,再调用ctor(constructor)

Complex* pc = new Complex(1,2);

delete:先调用dtor,再释放memory

delete ps

动态分配所得的内存块(memory block),in VC

动态分配所得的array

new typename[] 一定要搭配 delete[]

尤其是class with pointer members,不使用delete[],会造成内存泄漏,因为只调用了一次析构函数。

看到第9节

posted @ 2023-03-01 22:25  听雨画船眠  阅读(10)  评论(0编辑  收藏  举报