c++为你做了什么(1)构造 析构 拷贝 赋值
Effective C++
条款05:了解C++默默编写并调用哪些函数
如果你自己没声明,编译器会为你的类声明一个编译器版本的 copy构造函数 一个assignment操作符 一个default构造函数 和一个析构函数。
目的:为了编译器的需要而不是程序的需要
方式: inline的方式(避免在不同编译单元中生成多版本的构造函数 ,inline函数有static_link属性在编译单元外不可见)
1.构造函数:
对于 class X; 如果没有任何 user-declared constructor ,那么将会有一个default constructor被隐式的声明出来,一个被隐式声明出来的 default constructor 将会是一个trivial 的 constructor.....
有四 种情况,会造成编译器必须为未声明congstructor的classes 合成一个d efault constructor。 被合成出来的constructor只能满足编译器(非程序员)的需要,他之所以能够完成任务,是借着调用 member object 或 base class 的 default constructor 或是为每一个object初始化其virtual function机制或者 virtual base class机制(生成虚函数表和指针)而完成的。如果不是以上情况,我们说他们拥有的是 implicit trivial default constructors ,他们实际上并不会被合成出来。
在合成的 default constructor中只有 base class subobjects 和 member class objects 会被初始化。其他的所有 nonstatic data member 都不会被初始化。
常见的误解
1.任何 class 如果没有定义 default constructor 就会被合成出来
2.编译器合成出来的default constructor 会显式设定 “class 内每一个data member 的默认值”
2.拷贝构造函数
同构造函数,c++ standard 把copy construcor 区分为 trivial和nontrivial两种。只有nontrivial的实例才会被合成于实例中。决定一个copy constructor 是否为 trivial的标准在于 class 是否展现出所谓的 “bitwise copy semantics”(位逐次拷贝),(tips:对于成员变量含有类,拷贝是递归的)
位逐次拷贝性下不合成拷贝构造函数
不展现bitwise copy semantic的情况
1. 当class 内含一个 member object 而后者的 class 声明有一个 copy constructor 时。
2.当 class继承自一个 base class而后者存在一个 copy constructor时
3. 当 class 声明了一个或多个 virtual functions时。
4. 当 class 派生自一个继承串链,其中有一个或多个 virtual base classes 时。
多态的实现虚机制:
当一个函数被声明为虚函数,编译器会为其生成一个虚函数表,同时维护一个虚指针,虚函数表记录所有基类和派生类的函数函数地址,虚指针指向当前对象的函数地址。
(多态必须借由指针机制实现)
深拷贝和浅拷贝
在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误!
关于虚函数:
在使用memcpy() memset()时,都只有在“classes 不含任何由编译器产生的内部 members”时才会有效运行,如果类声明一个或一个以上的 virtual functions ,或内含一个 virutal base class ,那么使用上述函数将会导致那些被编译器产生的内部 members 的初值被改写。
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能
- C++ 类的三种构造函数(默认构造,拷贝构造,赋值构造),在什么情况下会被调用
- C++ 了解C++默默编写并调用哪些函数(构造 析构 拷贝构造 拷贝赋值)
- 现代c++之移动构造, 移动赋值, 拷贝构造, 拷贝赋值
- Effective C++ 3nd 读书摘要(一、让自己习惯C++ ; 二、构造,析构,赋值运算)Item1 - 12
- c++的拷贝构造、拷贝赋值、移动构造、移动赋值
- C++基础:四大基本函数,构造,析构,拷贝构造,赋值函数
- [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(上)
- C++我们必须要了解的事之具体做法(1)——构造、复制构造、析构、赋值操作符背后的故事
- Effective C++第二章-构造,析构,赋值-1
- string的四个函数--构造、析构、拷贝、赋值
- 深度探索C++对象模型 第五章 构造、析构、拷贝语意学
- String类简单实现(构造、拷贝构造、析构、赋值、输出、比较、字符串加、长度、子串)
- c++构造函数 && 拷贝,赋值,析构
- c++超基础:继承的构造与析构(赋值兼容性原则)
- C++之拷贝构造、赋值构造必须为引用?
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- 手写两个类,要体现构造,析构,拷贝构造,赋值,虚函数,重载函数等特点。
- 【C++】深度探索C++对象模型之构造、析构、拷贝语意学