2012年5月12日

摘要: C++中, 一个参数的构造函数, 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。例如下面例子中C的构造函数C(int i)就是,既可以用来作为构造器,又可以实现隐式转换C c=2;但是有时这并不是我们想要的,就可以将这个构造函数声明为explicit,以避免将构造函数作为隐式类型转换符来使用。Copy constructor也是同样的,如果Copy constructor被声明为explicit,则这个类对象不能用于传参和函数返回值。但是仍然可以直接调用。//spec1_explicit.cpp//compilewith:/EHsc#include<stdio.h 阅读全文
posted @ 2012-05-12 18:03 做个不善的人 阅读(2092) 评论(0) 推荐(0)
 
摘要: 返回值在编译器中如何实现【实现模型1】cfont的实现采用了双阶段转化。1.首先声明一个额外的参数,类型上类对象的引用,用来存放返回结果。2.对这个参数利用返回值进行拷贝初始化。过程类似于参数传递,也是要定义一个临时对象,用来保存返回值,然后在函数内部调用拷贝构造函数用那个return值进行初始化。Xbar(){Xxx;//processxx...returnxx;}编译器转化后//functiontransformationtoreflect//applicationofcopyconstructor//PseudoC++Codevoidbar(X&__result){Xxx;//c 阅读全文
posted @ 2012-05-12 16:05 做个不善的人 阅读(1548) 评论(1) 推荐(1)
 
摘要: 赋值运算符‘=’的默认行为是数据成员的值的相应赋值,默认行为在类的成员中包含指针时容易出现问题,因为它只是赋值了指针的值,但是指针指向的值并未复制。赋值运算符是可以如同其他运算符一样重载的,重载后的‘=’就可以有定制的行为了。当定义Copy Constructor时一般应该重新定义赋值运算符。Copy Constructor当class object是以“相同class的另一个object“作为初值时,其内部是以所谓的default memberwise initialization手法完成的,也就是把每一个内建的或派生的data member的值,从某个object拷贝一份到另一个objec 阅读全文
posted @ 2012-05-12 14:27 做个不善的人 阅读(2094) 评论(0) 推荐(0)
 
摘要: C++ Annotated Reference Manual中说“default Constructor 在需要的时候被编译器产生出来”,其关键字就是“需要的时候”,是谁需要呢?创建出来干什么事呢?class Foo {public:int val;Foo *pNext;};void foo_bar(){Foo bar;if(bar.val || bar.pnext)// do something;}在这个例子中,正确的语义是要求Foo有个default Constructor,可以将它的两个members初始化为0。但这段代码并不满足ARM中说的“在需要的时候”,其差别就在于一个是程序的需要 阅读全文
posted @ 2012-05-12 14:25 做个不善的人 阅读(1541) 评论(0) 推荐(0)