时间:2015-06-02 来源:

C++对象模型之复制构造函数的构造操作 【编程语言】

复制构造函数用于根据一个已有的对象来构造一个新的对象.

1、构造函数何时被调用
有三种情况会以一个对象的内容作为另一个类的对象的初值构造一个对象符合w3c标准,分别是:
1)对一个对象做显示的初始化操作时,符合w3c标准如
class X { ... };
X x;
X xx = x; // 或 X xx(x);
2)当对象被当作参数传递给某个函数时
3)当函数返回一个类的对象时

2、默认的成员复制初始化
如果class没有提供一个显式的复制构造函数,html切图当class的对象以另一个对象作为初值进行构造时,jpg或psd转html其内部是以这样的方式完成的:对于基本的类型(如int、数组)的成员变量,网页切图价格会使用位复制从一个对象复制到另一个对象;对于类类型的成员变量,手机前端外包会以递归的方式调用其复制构造函数.

3、复制构造函数何时被编译器合成
当复制构造函数必要时承接网页制作,它会被编译器构造出来.何为必要的时候呢?就是指当class不展现所谓的bitwise copy semantics(逐位复制语义)时.

与默认构造函数一样,承接网页制作若class没有声明一个复制构造函数web切图报价, int age); private: char *mName; int mAge; }; int main() { Person p1("p1", "20"); Person p2(p1); return 0; }
在上面的代码片断中,符合w3c标准p2要根据p1来初始化的.类Person没有定义复制构造函数网页外包接活,且根据类Person的定义,网页外包接活它的成员变量全都是基本类型的变量(指针和int),没有类类型的成员变量,div+css制作没有定义virtual函数承接网页制作,所以并不会合成一个复制构造函数.

下面讨论在什么情况下web切图报价, 0, 0); background-color: inherit;">5、非bitwise copy semantics
下面四种情况下的class不展现出bitwise copy semantics.下面一一列出,html切图制作并详细说明.

1)当class内含有一个成员对象网页外包接活, int age); private: String mName; int mAge; }; class String { public: String(const char *str) String(const String &rhs); private: char *mStr; int mLen; };
由于Person类没有显式地定义一个复制构造函数web前端制作,且该对象所属的类(String)定义了一个复制构造函数承接网页制作,所以此时的Person展现出了非bitwise copy semantics.编译器会为其合成一个复制构造函数,div前端切图该复制构造函数调用String的复制构造函数来完成成员变量mStr的初始化web切图报价, 112, 192); background-color: inherit;">2)当class继承自一个基类,符合w3c标准而该基类存在一个复制构造函数时(不论是显式声明的还是被编译合成的)
例如下面的代码片断:
class Student : public Person
{
    public:
        Student(const String &name, int no);
    private:
        int mNo;
};

如前所述web前端制作,所以在此情况下承接网页制作,类Student展现了非bitwise copy semantics.编译器会为其合成一个复制构造函数,承接网页制作该复制构造函数调用其基类的复制构造函数完成基类部分的初始化web切图报价, 112, 192); background-color: inherit;">3)当class声明了一个或多个virtual函数时
当类中声明了一个虚函数后编译器为支持虚函数机制,符合w3c标准在编译时会进行如下操作:
1. 增加一个虚函数表(vtbl),内含有每一个有作用的虚函数的地址.
2. 在类的每个对象中安插一个指向该类虚函数表的指针(vptr).

为了正确地实现虚函数机制,网页外包接活编译器对于每一个新产生的类对象的vptr都要成功而正确地设定其初值.所以编译器要合成一个复制构造函数web前端制作,如下:
class Person
{
    public:
        Person(const char *name, int age, 22, 1001);
Student s2 = s1; // 注释 1
Person p1 = s1; // 注释 2

当一个类的对象以该类的另一个对象为初值进行构造时,html切图制作由于这两个对象的vptr都应该指向该类的虚函数表网页外包接活,此时把另一个对象的vptr复制给该对象的vptr是安全的.所以在这种情况下,网页外包接活是可以使用bitwise copy semantics完成的.例如web前端制作,在上述的代码中,手机前端外包注释1对应的就是这种情况.

但是当一个类的对象以其派生类的对象为初值进行构造时承接网页制作,直接复制派生类对象的vptr的值到基类对象的vptr中,div前端切图却会引起重大的错误.例如web切图报价,在上述代码中,web切图报价注释2对应的就是这种情况.在这种情况下符合w3c标准,编译器为一个类合成出来的复制构造函数必须显式地设定该类对象的vptr指向该类的虚函数表,符合w3c标准而不是直接复制其派生类对象的vptr的值网页外包接活,并根据该类的类型正确地复制初始化对象的成员.

总的来说,jpg或psd转html编译器合成的复制构造函数web前端制作, 112, 192); background-color: inherit;">4)当class派生自一个继承串链,承接网页制作其中有一个或多个virtual基类时
virtual基类的存在需要特别处理.一个类的对象以另一个对象为初值进行构造时web切图报价,而后者拥有一个virtual基类子对象,网站div+css那么会使bitwise copy semantics失效.每个编译器都会让派生类对象中的virtual基类子对象的位置在执行期间准备妥当(如G++把virtual基类子对象放在派生类对象的末端),而bitwise copy semantics可能会破坏该这个位置,符合w3c标准所以编译器必须在它自己合成出来的复制构造函数中做出判断.

例如网页外包接活,在如下代码中:
class Base
{
    public:
        Base(){mBase = 100;}
        virtual ~Base(){}
        virtual void print(){}
        int mBase;
};
class VBase : virtual public Base
{
    public:
        VBase(){mVBase = 101;}
        virtual ~VBase(){}
        virtual void print(){}
        int mVBase;
};
class Derived : public VBase
{
    public:
        Derived(){mDerived = 102;}
        virtual ~Derived(){}
        virtual void print(){}
        int mDerived;
};

考虑如下的代码:
VBase vb1;
VBase vb2 = vb1;

与第3)点时讨论的一样,网页外包接活如果一个类的对象与该类的另一个对象为初值进行构造web前端制作,那么使用bitwise copy semantics即可完成相关的操作.问题仍然是发生在以一个派生类的对象作为其基类对象的初值进行初始化时.

考虑如下代码:
Derived d;
VBase vb = d;

在这种情况下,div+css制作为了完全正确地完成vb的初值的设定承接网页制作,编译器必须合成一个复制构造函数,承接网页制作安插一些代码web切图报价,来完成根据派生类的对象完成其基类对象部分成员变量的初始化,web切图报价并正确设定的基类的vptr的值.

以g++为例符合w3c标准,类Derived的对象的内存分布大概如下:

类VBase的对象的内存分布大概如下:

从类Derived和类VBase的内存结构图可以非常容易地看出使用bitwise copy semantics并不能完成以一个派生类的对象为初值构造一个基类的对象.编译合成的复制构造函数,html切图制作把类Derived对象d的基类子对象中的成员变量(mVBase)复制到类VBase对象vb相应的成员变量网页外包接活,再把对象d的虚基类子对象中的成员变量(mBase)复制到对象vb相应的成员变量中(即复制初始化图中黄色的部分).最后,网页外包接活设置对象vb的两个vptr,使其指向正确的位置.

注:类Derived的两个vptr与类VBase的两个vptr互不相等,手机前端外包它们与类Base的vptr也互不相等.

使用如下代码遍历三个以上三个类的对象的代码如下:
注:运行环境:32位Ubuntu 14.04,三个类的所有vptr各不相同.

点击次数:5185
作者:
web前端行业资讯
Web new NewsList
微软发布WindowsServerBuild17074更新 ,,2018年01月18日凭借一个AI小功能,这款Google应用冲上苹果AppStore榜首 ,,2018年01月18日百度数据可视化实验室正式成立,发布深度学习可视化平台VisualDL ,,2018年01月18日OpenAI开源最新工具包,模型增大10倍只需额外增加20%计算时间 ,,2018年01月18日百度手机输入法8.0正式发布:支持多人语音速记 ,,2018年01月18日CSDN宣布收购TinyMind团队并升级为AI社区 ,,2018年01月18日甲骨文发布补丁修复英特尔芯片漏洞造成的问题 ,,2018年01月18日权威!官方发布CPU熔断和幽灵漏洞防范指引:附补丁下载 ,,2018年01月18日Oracle宣布新的JavaChampions ,,2018年01月18日Fedora28壁纸征集活动现已开幕:将持续至2月13日 ,,2018年01月18日苹果WebKit团队发布Speedometer2.0网页响应测试工具 ,,2018年01月18日百度输入法8.0后天发布:全感官AI输入 ,,2018年01月18日腾讯和乐高合作:共同研发智能玩具、游戏 ,,2018年01月18日HomePod上市日益临近智能音箱市场吸引力越来越大 ,,2018年01月18日英特尔公布修补漏洞后PC性能数据:8代CPU影响最小 ,,2018年01月18日云存储公司Dropbox秘密提交IPO申请估值超百亿美元 ,,2018年01月18日iPod之父:防手机上瘾无技术难度苹果谷歌应承担责任 ,,2018年01月18日芯片不安全英特尔云客户考虑转用AMD等对手处理器 ,,2018年01月18日2018年Java展望 ,,2018年01月18日区块链有多火?快播流量矿石遭20多万人疯抢 ,,2018年01月18日Intel搞定神经拟态芯片:模拟人类大脑、自主学习 ,,2018年01月18日阿里巴巴发布IoTConnect开放连接协议,盼推动语音互动入口普及 ,,2018年01月18日区块链火了,全球大佬们怎么看? ,,2018年01月18日Facebook正测试新功能主推本地新闻资讯 ,,2018年01月18日在GooglePlay中发现使用Kotlin开发的安卓恶意软件 ,,2018年01月18日VisualStudio201715.6预览版本2,增加新功能 ,,2018年01月18日百度陆奇:AI是5G最好的加速器 ,,2018年01月18日PinterestCEO:不同于谷歌和Facebook,我们走了第三条路 ,,2018年01月18日腾讯加码区块链项目已悄然注册“以太锁”商标 ,,2018年01月18日3D打印脑组织?科学家正在向这一目标正在前进 ,,2018年01月18日iOS通知中心的简单实现-YRSignal 【移动开发】2015年06月30日ZOJ3875LunchTime(The12thZhejiangProvincialCollegiateProgrammingContest) 【架构设计】2015年04月27日文件系统类型更改工具,fstransform0.9.3发布 ,,2016年06月23日大话TCPIP协议之HTTP网络协议(一) 【系统运维】2014年11月26日封装类之FileVersion(获取文件属性)【数据库】2015年08月27日OracleRAC转换为单实例 【数据库】2015年02月13日3dsmax和AE制作《魔兽天下》片头2014年01月28日根据手机屏幕设置控件宽高【移动开发】2015年08月27日pythonis和==的区别 【编程语言】2015年02月09日hihocoder#1052:基因工程 【综合】2015年05月25日我的java学习笔记(6)关于包与类路径【编程语言】2015年03月30日asp.net中FileUpload控件研究汇总 【编程语言】2014年12月11日windows套接字相关函数 【编程语言】2015年06月29日Fliptilepoj3279开关问题 【编程语言】2015年02月15日java二维数组矩阵乘法的实现方法2014年01月30日为什么要跳槽【编程语言】2015年04月13日LNMP系列教程之SSL安装WordPress博客(程序下载与安装)2014年01月30日hihoCoder_推箱子 【Web前端】2015年04月13日DockerHub基于Github自动化构建 【编程语言】2014年11月24日C++11环境安装【移动开发】2015年02月09日20最佳代码审查工具-专门为开发人员准备 【综合】2015年04月13日leetcode||144、BinaryTreePreorderTraversal 【移动开发】2015年05月06日Android的so库的注入【综合】2015年08月25日微信支付PHPSDK——公众号支付代码详解 【编程语言】2015年04月24日Cocos2d-x优化中图片优化 【编程语言】2014年11月10日前端开发性能优化 【互联网】2015年07月31日Xpages免费培训2015年05月20日12 IntegertoRoman 【综合】2015年06月24日Google已经收购了这么多家人工智能公司 ,,2016年11月17日记录游客页面访问IP的简易实现代码(asp.net+txt)2014年01月29日
我们保证
We guarantee
> psd效果文件手工切图,保证图片效果最好体积最小利于传输
> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准
> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷
> 应用Css Sprite能够减少HTTP请求数,提高网页性能
> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)