C++中的三大函数和操作符重载(Boolan)

 更新时间:2017年02月15日 10:54:11   作者:冻结的企鹅  
本文主要介绍了C++中的三大函数和操作符重载(Boolan)的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧

C++中三大函数:

  • 析构函数
  • 复制构造函数
  • =操作符(copy assignment operator)

这三个特殊的成员函数如果程序员没有实现,编译器将提供默认的实现方式。

析构函数:

形如~foo_t(),函数名和构造函数相同,前面加~,如果对象是自由变量创建,析构函数将在脱离作用域时调用。如果对象是通过new操作符创建的,则通过delete操作符调用析构函数。

复制构造函数:

形如foo_t(const foo_t& foo),以下情况复制构造函数均会被调用:

  1. 当对象按值返回时候(returned by value)
  2. 调用按值传参的函数(passed by value)
  3. 通过thrown抛出或caught捕获的对象
  4. 对象处于()包围的初始化列表中

=操作符:

重载=操作符,如foo_t& operator=(const foo_t& foo),对已有对象的赋值操作将调用该函数(未初始化的对象成员将调用复制构造函数)。

以下为代码实例:

#include <cstring>
#include <iostream>
class foo_t {
 friend std::ostream &operator<<(std::ostream &os, foo_t const &foo) {
  os << foo.data;
  return os;
 }
 public:
 foo_t(void) : data(new char[14]) { std::strcpy(data, "Hello, World!"); }
 ~foo_t(void) { delete[] data; }
 foo_t(const foo_t& other);
 foo_t &operator=(const foo_t& other);
 private:
 char *data;
};
foo_t::foo_t(const foo_t& other) {
 std::cout << "call copy constructor!!!" << std::endl;
 this->data = new char[strlen(other.data) + 1];
 strcpy(this->data, other.data);
}
foo_t& foo_t::operator=(const foo_t& other) {
 std::cout << "call the copy assignment operator!!!" << std::endl;
 if (this == &other)
   return *this;
 this->data = new char[strlen(other.data) + 1];
 strcpy(this->data, other.data);
 return *this;
}
int main() {
 foo_t foo;
 std::cout << foo << '\n';
 foo_t t(foo);
 // foo_t t2 = t;
 foo_t t3;
 t3 = t;
 return 0;
}

为了方便测试,可以分别在析构函数、拷贝构造、=重载处设置断点,观察程序执行流程。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • OpenCV利用高斯模糊实现简单的磨皮美颜效果

    OpenCV利用高斯模糊实现简单的磨皮美颜效果

    这篇文章主要介绍了通过OpenCV中的高斯模糊以及双边模糊来实现一个简单的磨皮美颜效果,文中的讲解很详细,感兴趣的同学可以学习一下
    2021-12-12
  • Effective C++ 学习笔记

    Effective C++ 学习笔记

    这篇文章主要介绍了Effective C++ 学习笔记,想学习Effective C++的朋友可以参考一下
    2023-08-08
  • c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    这篇文章主要介绍了c++如何控制对象的创建方式和创建的数量,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • C语言函数指针的老生常谈

    C语言函数指针的老生常谈

    这篇文章主要为大家介绍了vue组件通信的几种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • 使用C++的inipp库处理配置文件.ini的示例详解

    使用C++的inipp库处理配置文件.ini的示例详解

    一个ini文件由多个节section组成,每个节由多个键值对组成,本文给大家介绍了使用第三方库inipp来操作ini文件,文中通过代码示例讲解的非常详细,需要的朋友可以参考下
    2024-01-01
  • C++设计模式之外观模式(Facade)

    C++设计模式之外观模式(Facade)

    这篇文章主要为大家详细介绍了C++设计模式之外观模式(Facade),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 一文详解C++中的mutable关键字

    一文详解C++中的mutable关键字

    在C++中mutable关键字正如字面意思所示,表示「可变的」之意,一般在以下两种情况中使用较多,一是修饰类中的变量,用来突破const的限制,二是在Lambda表达式中使用,用来捕获修改表达式之外的变量值,下面我们就针对这两种使用场景逐个介绍
    2023-10-10
  • boost字符串处理函数format的用法

    boost字符串处理函数format的用法

    这篇文章介绍了boost字符串处理函数format的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 浅谈C语言的变量和常量

    浅谈C语言的变量和常量

    这篇文章主要为大家详细介绍了C语言的变量和常量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • 关于STL中的map容器的一些总结

    关于STL中的map容器的一些总结

    对于map的学习,或者说是对STL中的容器的学习,要知道每种容器的实现原理,每种适合适合解决什么问题的,才是关键
    2013-09-09

最新评论