深入探索C++对象象模型--拷贝构造函数 &&多重继承 虚拟继承 内存分布

拷贝构造函数

如果没有定义拷贝构造函数,那么编译器会自动生成一个拷贝构造函数,但是这个拷贝构造函数是有一定限度的。

一般来说这个拷贝构造函数是按照位直接拷贝的,但是在有些情况下这种初始化是有问题的,在特殊的四种情况下是有问题的,在有问题的情况下,可以举例说明。

如果一个有多态性质的对象,子类赋值给父类,调用了拷贝构造函数,这个时候就需要给父类的虚拟函数表重新分配,使得虚拟函数表和子类不是同一个,这样bitwist就不能有效

对于在函数参数中调用拷贝构造函数,参数是实参的一根拷贝,对于函数的返回值调用了拷贝构造函数,编译器的做法是在函数参数中多可添加一个参数,这个参数是返回值的引用,在函数有返回值的时候,直接修改这个函数中多一个的参数即可,因为这个参数正好是函数返回值的引用。这也是编译器做的一个优化

在何种情况必须使用成员初始化列表来初始化成员:

1、  当初始化一个引用成员时

2、  当初始化一个const成员时

3、  当调用一个baseclass的构造函数,而它拥有一组参数时

4、  当调用一个成员对象的构造函数时,而它拥有一组参数时。

同时,初始化列表中初始化对象的顺序由class中的成员声明次序决定,不是初始化列表中的排列次序决定的。

Iorigin.x = 0;

Pt->x = 0;

从origin存取和从pt存取有什么重大的差异?当origin是一个derived class,而在其继承结构体中有一个virtual base class,并且被存取的成员是一个从该virtual base class继承而来的成员是,就会有重大的差异

多重继承和虚拟继承下虚函数表对应的内存分布(VS2008)

在多重继承下:

子类和第一个父类公用一个虚函数表指针,然后剩下的父类各自有各自的虚函数表指针,最后所得虚函数表指针和多重继承下父类的个数一样。

这个时候需要明白一个事情,如果在多重继承情况的父类也继承了共同的父类,那么这个时候在子类中会有两个父类的父类。

正是在这种情况下出现了虚拟继承,能够让父类的父类在子类中出现一次。怎么理解这个情况呢?什么是父类的父类呢?比如子类继承了两个父类,但是这两个父类也继承了同一个父类,这就是父类的父类,这个时候如果使用多重继承,就出现父类的父类出现两次的情况。这样也引出了虚拟继承。

在虚拟继承的情况下,有多少个父类就有多少个虚拟函数表指针,但是对于父类继承的同一个父类只出现一次,这个时候会有一个虚基类指针。假设一个子类多重继承了两个父类,这两个父类同时继承了同一个父类,这么一来,总共是四个类,最后的子类中有三个指针,两个是虚函数表指针,一个是虚基类指针

时间: 2024-12-23 02:17:20

深入探索C++对象象模型--拷贝构造函数 &&多重继承 虚拟继承 内存分布的相关文章

类和对象(7)—— 拷贝构造函数应用场景

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Test { public: //显示的无参数的构造函数 Test() { cout << "Test()..." << endl; m_x = 0; m_y = 0; } //显式地有参数的构造函数 Test(int x, int y) { cout << "Test(i

构造函数和拷贝构造函数

构造函数,顾名思义,新构造一个对象.如下调用的就是普通的构造函数: String s="cde"; 拷贝构造函数,顾名思义,也是一种构造函数,特殊的构造函数,用一个已存在的对象初始化一个新的对象,就是拷贝构造函数.如下调用的就是拷贝构造函数,用已经存在的string s去初始化新的对象a: String a(s);String a=s; 拷贝构造函数声明如下:(以String为例子) String(); //constructor String(const char *s); //co

【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3977861.html 一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream

c++拷贝构造函数(深拷贝,浅拷贝)详解

一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面看一个类对象拷贝的简单例子. #include<iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) { a=b; printf("con

C++知识点:拷贝构造函数例子

//拷贝构造函数: //函数参数传递时调用一次拷贝构造函数,给对象赋值时调用一次拷贝构造函数,对象作为参数传递后会被及时销毁. #include <fstream> #include <string> using namespace std; ofstream out("HowMany2.out"); class HowMany2 { string name;//object identifier static int objectCount; public:

C++拷贝构造函数

在C++中,下面三种对象需要调用拷贝构造函数!1. 对象以值传递的方式传入函数参数 [c-sharp] view plaincopy class CExample    {   private:    int a;      public:    //构造函数    CExample(int b)    {      a = b;     cout<<"creat: "<<a<<endl;    }       //拷贝构造    CExample(

C++拷贝构造函数(深拷贝与浅拷贝)

转自http://blog.csdn.net/lwbeyond/article/details/6202256/ 一. 什么是拷贝构造函数 对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. 1 #include <iostream> 2 using namespace std; 3 4 class CExample { 5 private: 6 in

《C++编程思想》 第十章 引用和拷贝构造函数(知识点+习题+解答)

一.相关知识点 使用引用时有一定的规则: 1) 当引用被创建时,它必须被初始化.(指针则可以在任何时候被初始化.) 2) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用.(指针则可以在任何时候指向另一个对象.) 3) 不可能有NULL引用.必须确保引用是和一块合法的存储单元关连. 仅当准备用传值的方式传递类对象时,才需要拷贝构造函数.如果不需要这么做,就不要拷贝构造函数. 对于指向一个对象的指针新的语法变为 ->*,对于一个对象或引用则为.*. 二.相关代码 1. /*R

C++拷贝构造函数详解

一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream> using namespace std; class CExample { private: int a; public: //构造函数 CExample(int b) { a = b;} //一般函数 void Sh