[GeekBand][C++面向对象高级编程]第二周学习笔记

2017-01-16  本文已影响0人  散夜霜

Class with pointer member(s)设计注意事项:

1. Big Three,必须有的三个特殊函数

拷贝构造(copy ctor)、拷贝赋值(copy op=)、析构函数(dtor)

2. 拷贝构造函数(copy ctor)

必须重新申请空间并写入内容(深拷贝),否则拷贝构造时对象一旦修改会互相影响,且发生内存泄漏

3. 拷贝赋值函数(copy op=)

首先检查是否自我赋值,若自我赋值,直接return *this;
若非自我赋值:
第一步,释放原有空间。
第二步,申请和被拷贝对象内容相同大小的新空间。
第三步,写入被拷贝内容。
最后,返回return *this;

4. 析构函数(dtor)

析构函数是对象在死亡前会自动调用的函数。在有指针成员的类中,必须重写一份析构函数,释放指针所指向的空间,避免造成内存泄漏。

静态相关:

1. 定义静态函数or静态数据

在声明前加static

2. 静态数据必须在类外定义

class Account
{
public:
    static double m_rate;
    static void set_rate(const double& x) { m_rate = x; }
};

double Account::m_rate = 8.0;

3. 静态函数没有this指针

故而只能处理static数据

4. 调用静态函数的两种方式

int main()
{
    Account::set_rate(5.0);

    Account a;
    a.set_rate(7.0);
}

模版相关:

template<typename T>
class Complex
{
public:
    Complex(T r = 0, T i = 0)
        :re(r), im(i)
    {}
    Complex& operator +=(const Complex&);
    T real()    const { return re; }
    T imag()    const { return im; }
private:
    T re, im;
};
{
    Complex<double> c1(2.5, 1.5);
    Complex<int> c2(2, 6);
}
补充内容

以下是在第二周的学习中写出的String.h头文件

#ifndef __MYSTRING__
#define __MYSTRING__

#include <iostream>

class String;

std::ostream& operator <<(std::ostream& os, const String str);

class String
{
public:
    String(const char* cstr = nullptr);
    String(const String& str);
    String& operator =(const String& str);
    ~String();
    char* get_c_str()   const { return m_data; }
private:
    char* m_data;
};

inline String::String(const char * cstr)
{
    if (cstr)
    {
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    }
    else
    {
        m_data = new char[1];
        *m_data = '\0';
    }
}

inline String::String(const String & str)
{
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
}

inline String & String::operator=(const String & str)
{
    if (this->m_data == str.m_data)
        return *this;
    delete[] m_data;
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
    return *this;
}

inline String::~String()
{
    delete[] m_data;
}

std::ostream & operator<<(std::ostream & os, const String str)
{
    return os << str.get_c_str();
}

#endif
上一篇 下一篇

猜你喜欢

热点阅读