第四篇:了解 C++ 默默编写并调用的函数

前言

对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数)。即使你的类没有为这些函数做出定义,C++ 也会自动为你创建。本文将讲述的是 C++ “偷偷”为你创建的这三个函数究竟是怎么样的。

了解这些,能更清楚代码是如何运转的,从而写出自己需求的(这三类)函数,确保对象高效,节约。

默认的构造函数和析构函数

默认的构造函数/析构函数主要负责调用其基类的构造函数/析构函数。

默认的copy构造函数和=重载函数

默认的这两个函数仅仅是将对象的成员进行简单赋值。

这就意味着,如果该类的成员是指针类型,那么当该类的两个对象之间发生赋值后,这两个对象中的指针就会指向同一片内存区。这种情况下,内存管理就会复杂起来,后面的文章中会详细讲解如何解决这个问题 - 在类的不同对象之间共享内存区。

有时候,如果你不需要在内存中实现共享,完全可以自行定义这两个函数,为被赋值的对象分配新的内存区。

那么,如果类成员是引用类型呢?如果对象之间成员只是简单的复制,那么岂非出现一个引用型变量引用了新的变量?这是违反 C++ 的”不允许引用型变量改指向不同的对象“这一原则的。

答案是 - C++ 会拒绝编译那一行的赋值操作。

小结

1. 编译器所做的工作等效于:

1 class Empty {
2 public:
3     Empty(){}    // 缺省构造函数
4     Empty(const Empty &rhs){}    // 缺省拷贝构造函数
5     ~Empty(){}    // 缺省析构函数
6     Empty & operator= (const Empty &rhs);    // 缺省赋值运算符重载函数
7 };

2. 如果 C++ 默认为你定义的这三类函数不合你的要求,这也是经常发生的,那么你就需要结合实际情况,定制出最适合自己的函数。

3. 这三类函数非常重要,请一定要确保其正确性,效率性,否则项目后期因此而产生的内存泄露等问题是非常让人头大的。

时间: 2024-10-25 05:55:44

第四篇:了解 C++ 默默编写并调用的函数的相关文章

Effective C++ 之 Item 5:了解C++默默编写并调用哪些函数

Effective C++ chapter 2. 构造 / 析构 / 赋值运算 (Constructors, Destructors, and Assignment Operators) Item 5. 了解 C++ 默默编写并调用哪些函数 (Know what functions C++ silently writes and calls)

Effective C++ Item 5 了解 C++ 默默编写并调用哪些函数

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验: 如果你自己没声明,编译器会自动声明copy constructor,copy assignment,destructor, 如果你没有声明任何构造函数,编译器会自动声明default constructor 示例: 如果你写下 class Empty{ }; 将会等价于 class Empty{ public: Empty() {...} //default构造函数 Empty(c

EC笔记,第二部分:5.了解C++默默编写并调用哪些函数

5.了解C++默默编写并调用哪些函数 1.C++空类 C++会为一个空类建立以下函数 (1).默认构造函数 (2).默认拷贝构造函数 (3).析构函数 (4).赋值运算符(如果成员包含引用类型或const类型,不会生成赋值运算符)(引用的对象和const对象不可更改,所以无法重新赋值) class cl1 { public: int a; cl1(int t):a(t) {}; }; class cl2 { public: int &a; cl2(int t):a(t) {} }; int ma

[effictive c++]条款05 了解c++默默编写并调用哪些函数

c++的编译器是非常智能的!当你声明一个空类empty class,如果你的代码有用到这个empty class时,编译器会默默的为你编写一些基本的函数.那么究竟编译器自己添加的函数都有哪些呢?构造函数,析构函数,一个copy构造函数和一个copy assignment操作符.举个例子来说明一下,如果你写下: class empty{}; 就好像你写下这样的代码: class Empty { public: Empty(){ ... } //default 构造函数 ~Empty(){ ....

条款5:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)

1.default costructor  / copy constructor / copy assignment 者三者的区别? 特别是copy constructor & copy assignment !! 2.编译器可以暗自为class创建default构造函数.copy构造函数.copy assignment操作符,以及析构函数. 3.发现对运算符重载也不是太清楚!!!

了解C++默默编写并调用哪些函数

在C++中,如果你写下 1 classEmpty{-}; 就相当于写下 1 classEmpty{ 2 public: 3 Empty();//default构造函数 4 Empty(constEmpty& rhs){--};//copy构造函数 5 ~Empty(){-}//析构函数 6 Empty&operator=(constEmpty& rhs){-};//copy赋值运算符 7 }; 惟有当这些函数被调用时,他们才会被编译器创建出来. 下面代码造成上述每个函数被创建: 1

[005]了解C++默默编写并调用哪些函数

<前言>编译器是个十分敬业的工作者,不但为你编译代码,甚至为你生成代码,不可思议吧.本文主要介绍编译器究竟会为我们生成和调用哪些代码. <空类和非空类>如果问什么样的类是空类?也许你会说下面的类就是空类. class A{ }; 好吧,我也是这么认为的.没有构造函数怎么创建对象?事实上编译器会自动地把A的定义转为下面这样的代码. class A{ public: A() { } A(const A& rhs) { ... } ~A() { } A& operator

了解 C++ 默默编写并调用的函数

前言 对于一个类来说,最最基础的三类成员函数莫过于:构造函数,析构函数以及拷贝函数 (copy构造函数和=重载函数).即使你的类没有为这些函数做出定义,C++ 也会自动为你创建.本文将讲述的是 C++ “偷偷”为你创建的这三个函数究竟是怎么样的. 了解这些,能更清楚代码是如何运转的,从而写出自己需求的(这三类)函数,确保对象高效,节约. 默认的构造函数和析构函数 默认的构造函数/析构函数主要负责调用其基类的构造函数/析构函数. 默认的copy构造函数和=重载函数 默认的这两个函数仅仅是将对象的成

条款05:了解C++默默编写并调用哪些函数

编译器在检测到有对象创建.赋值或者以copy构造函数的方式创建对象时会自动生成函数: