您的位置:首页 > 编程语言 > C语言/C++

c++为你做了什么(1)构造 析构 拷贝 赋值

2015-10-29 21:40 225 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Gloria_0101/article/details/49497423

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 的初值被改写。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐