C++C语言

C++学习笔记三

2018-09-23  本文已影响4人  HYIndex

类和动态内存分配

1. 动态内存和类

静态成员

new和delete

特殊成员函数

  • 默认构造函数, 如果没有定义任何构造函数
  • 默认析构函数, 如果没有定义
  • 默认拷贝构造函数, 如果没有定义
  • 赋值运算符重载, 如果没有定义
  • 地址运算符重载, 如果没有定义
  • C++11 还提供了移动构造函数和移动赋值函数

C++允许类对象赋值, 就是通过自动为类重载赋值运算符实现的
将已有的对象赋给另一个对象时, 将使用重载的赋值运算符
使用已有对象初始化另一对象时, 可能会使用赋值运算符

2. String类

/*
 * String.h
 */
#ifndef CPLUSPLUS_STRING_H
#define CPLUSPLUS_STRING_H

#include <iostream>
#include <cstring>
using namespace std;
class String {
public:
    String();                // 默认构造函数
    String(const char* str); // 普通构造函数
    String(const String& s); // 拷贝构造函数
    ~String();               // 析构函数
    String &operator=(const String& s); // 重载赋值运算
    String &operator=(const char* str); // 重载赋值运算
    friend ostream &operator<<(ostream& os, const String& s);
private:
    char* m_str;
    size_t length;
};
#endif //CPLUSPLUS_STRING_H

/*
 * String.cpp
 */
#include "String.h"
String::String(const char* str) {
    length = std::strlen(str);
    m_str = new char[length + 1];
    strcpy(m_str, str);
}

String::String() {
    length = 0;
    m_str = nullptr;
}

String::String(const String& s) {
    length = s.length;
    m_str = new char[length + 1];
    strcpy(m_str, s.m_str);
}

String::~String() {
    delete [] m_str;
    m_str = nullptr;
}

String &String::operator=(const String &s) {
    if (this == &s) { // 检查是否为自身赋值
        return *this;
    }
    delete [] m_str;
    length = s.length;
    m_str = new char[length + 1];
    strcpy(m_str, s.m_str);
    return *this;
}

String &String::operator=(const char *str) {
    delete [] m_str;
    length = strlen(str);
    m_str = new char[length + 1];
    strcpy(m_str, str);
    return *this;
}

ostream &operator<<(ostream &os, const String &s) {
    os << s.m_str;
    return os;
}

3. 定位new运算符

char *buffer = new char[1024];
String* pn = new (buffer) String;

pn->~String();      // 显示调用析构函数
delete [] buffer;   // 释放new的空间

// 直接使用对象指针释放是错误的
delete pn;          // 错误, 不能释放buffer且不会自动调用析构函数

4. 成员初始化列表

上一篇 下一篇

猜你喜欢

热点阅读