设为首页 加入收藏

TOP

关于C++对象模型的深入理解(二)
2018-03-14 09:00:23 】 浏览:789
Tags:关于 对象 模型 深入 理解
让cin能够求得一个真假值,于是他为它定义了一个conversion运算符operator int()。但在语句cin << intVal中,其行为出乎意料:程序原本要的是cout而不是cin!但是编译器却找到一个正确的诠释:将cin转型为整型,现在left shift operator <<就可以工作了!这就是所谓的“Schwarz Error”。Jerry最后以operator void *()取代operator int()。

2.引入关键词explicit的目的,就是为了提供程序员一种方法,使他们能够制止单一参数的constructor被当作一个conversion运算符。其引入是明智的,但其测试应该是残酷的!

2.1 Default Constructor的建构操作

1.global objects的内存保证会在程序激活的时候被清为0。local objects配置于程序的堆栈中,heap objects配置于自由空间中,都不一定会被清为0,它们的内容将是内存上次被使用后的遗迹。

2.在各个不同的版本模块中,编译器避免合成出多个default constructor的方法:把合成的default constructor、copy constructor、assignment copy operator都以inline方式完成。一个inline函数有静态链接,不会被档案以外者看到。如果函数过于复杂,不适合做成inline,就会合成一个explicit non-inline static实体。

3.以下四种情况,编译器必须为未声明constructor的classes合成一个implicit nontrivial default constructor:带有default constructor的member class object,带有default constructor的base class,带有virtual function,带有virtual base class。其它各种情况且没有声明任何constructor的classes,它们拥有的是implicit trival default constructors,它们实际上并不会被合成出来。

4.编译器合成implicit nontrivial default constructor,不过是暗地里作了一些重要的事情以保证程序正确合理地运行。如果程序员提供了多个constructors,但其中都没有default constructor,编译器同样会在这些constructors中插入一些相同功能的代码,这些代码都将被安插在explicit user code之前。

2002-6-26

2.2 Copy Constructor的建构操作

1.有三种情况,会以一个class的内容作为另一个class object的初值:

ü对一个object作明确的初始化操作,如:someClass obt = obtb;

ü一个object被当作参数交给某个函数时,如:foo(obt);

ü当函数返回一个class object时。

若class设计者明确定义了一个copy constructor,大部分情况下,该constructor会被调用。这可能导致一个暂时性的class object的产生或程序代码的蜕变,或者两者皆有。

2.如果class没有提供一个explicit copy constructor,当class object以相同class的另一个object作为初值时,其内部是以所谓的default memberwise initialization手法完成的,即把每一个内建的或派生的data member的值,从一个object拷贝到另一个object。不过,它并不会拷贝其中的member class object,而是以递归的方式施行memberwise initialization。

3.一个class object可以从两种方式复制得到:初始化和指定,从概念上而言,这两个操作分别是以copy constructor和copy assignment operator完成的。

4.如果class没有声明一个copy constructor,就会有隐含的声明implicitly declared或隐含的定义implicitly defined出现。C++把copy constructor分为trivial和nontrivial两种。只有nontrivial的实体才会被合成出来。决定一个copy constructor是否为trivial的标准在于class是否展现出所谓的“bitwise copy semantics”。

5.以下四种情况,一个class不展现bitwise copy semantics:

üclass内含一个member object而后者的class声明有或被编译器合成有一个copy constructor时;

üclass继承自一个base class而后者存在或被编译器合成有一个copy constructor时;

ü当class声明了一个或多个virtual functions时;

ü当class派生自一个继承串链,其中有一个或多个virtual base classes时。

前两种情况中,编译器必须将member或base class的copy constructors调用操作安插到被合成的copy constructor中。

6.一旦一个class object中必须引入vptr,编译器就必须为它的vptr正确地设置好初值。此时,该class就不再展现bitwise semantics。

7.当一个base class object以其derived class object内容作初始化操作时,其vptr复制操作必须保证安全。

8.每一个编译器对于虚拟继承的承诺,都表示必须让derived class object中的virtual base class subobject的位置在执行期准备妥当。维护位置的完整性是编译器的责任。

2002-6-27

2.3程序转化语意学

1.每一个明确的初始化操作都会有两个必要的程序转化阶段:先重写每一个定义,剥除其中的初始化操作,然后安插class的copy constructor调用操作。

2.把一个class object当作参数传给一个函数或是作为一个函数的返回值,相当于以下形式的初始化操作:

X xx = arg;其中xx代表形式参数或返回值,而arg代表真正的参数值。

3.函数定义如下:X bar(){X xx; return xx;},bar()的返回值通过一个双阶转化从局部对象xx中拷贝出来:

ü首先为bar添加一个额外参数,类型是class object的一个reference,这个参数用来放置被拷贝构建而得的返回值。

ü然后在return指令之前安插一个copy constructor调用操作,以便将欲传回之object的内容当作上述新增参数的初值,同时重写函数使它不返回任何值。

4.Named Return Value(NRV)优化如今被视为是标准C++编译器的一个义不容辞的优化操作,它的特点是直接操作新添加的额外参数。注意只有co

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 2/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇万能的C++头文件分享 下一篇C++设计模式之原型模式(克隆羊多..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目