美文网首页
C++boolan part1_week2

C++boolan part1_week2

作者: Bigyvan | 来源:发表于2017-10-27 21:54 被阅读0次

Big Three三个特殊函数 (拷贝构造函数、拷贝赋值函数、析构函数)

1 拷贝构造函数

定义:如果一个构造函数的第一个参数是自身类型的引用,且任何额外的参数都有默认值,则此构造函数是拷贝构造函数。
相关知识点:
如果拷贝构造函数中不含指针的话,那么编译器会自动生成拷贝构造函数,一位一位得进行赋值操作,此时采用系统的默认的拷贝构造函数没有问题。
但如果拷贝构造函数中有指针数据,如果还是采用默认但构造函数,则拷贝过来则指针会与原指针指向同一个地方,即所谓浅拷贝。
这时就要通过自己写但拷贝构造函数来进行深拷贝。

一个指针指向数据 浅拷贝 深拷贝
inline
String::String(const String& str)
{
  m_data = new char[ strlen (str.m_data) + 1];
  strcpy(m_data, str.m_data);
}

这个拷贝构造函数中,先给m_data用new来创建一个空间,然后再将指针数据复制过来。

2 拷贝赋值函数

定义:拷贝赋值函数即对“=”运算符的重载
有一点特别注意,即一定要在operator= 中检查是否self assignment

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;
}

如果不进行检测,则函数在运行时会将this自身的指针内存先删除,然后分配一块和新的数据相同大小的内存,再将新的拷贝到旧的上面,可是因为是自身,所以这时会出错,因为新的数据内存已经被删除了。

3 析构函数

定义:析构函数执行与构造函数相反的操作:构造函数初始化对象的非static数据成员,还可能做一些其他工作;析构函数释放对象使用的资源,并销毁对象的非static数据成员。
析构函数是类的一个成员函数,名字由波浪号接类名构成,它没有返回值,也不接受参数:

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

相关文章

  • C++boolan part1_week2

    Big Three三个特殊函数 (拷贝构造函数、拷贝赋值函数、析构函数) 1 拷贝构造函数 定义:如果一个构造函数...

  • C++boolan part1

    培养正规的、大气的编程习惯 1.Header(头文件)中的防卫声明 2.设置初值列,初始列 initializat...

  • C++boolan part2

    关于vptr/vtbl 1.只要类中存在虚函数(vptr),则一定有一根虚指针(就算有10000个虚函数也只存在一...

  • C++boolan part3_week2

    面向对象和泛型编程 面向对象是对data和operation的封装,是对同类事物的抽象,跟结构化编程相比它更接近自...

  • C++boolan part1_week3

    C++纯虚函数 一、定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方...

  • C++boolan part3_week3

    由于对红黑树理解不深,课后对红黑树进行了较深入的探索。 此笔记主要对红黑树进行归纳理解,其中不免参照网上资料 红黑...

  • C++boolan part3_week1

    C++容器的介绍及使用 C++中的容器大致可以分为两个大类:顺序容器和关联容器。顺序容器中有包含有顺序容器适配器。...

  • C++boolan part3_week4

    1. 迭代器 1.1 迭代器的种类 使用随机访问迭代器的容器:array, vector,deque使用双向迭代器...

网友评论

      本文标题:C++boolan part1_week2

      本文链接:https://www.haomeiwen.com/subject/bgidpxtx.html