11 2014 档案
摘要:考虑下面这个虚拟继承:class Point3d: public virtual Point{ Point3d(float x = 0.0, float y = 0.0, flloat z = 0.0) :Point(x, y). _z(z){} Pooint(const ...
阅读全文
摘要:继承前的准备前一篇博客的三个 Point 声明, 将为继承性质以及某些操作的动态决议做准备, 现在咱们限制对_z 的存取操作:class Point{public: Point(float x = 0.0, float y = 0.0, float z = 0.0) :_x(x), _y...
阅读全文
摘要:考虑以下代码:Point global; //1)Point Foobar(){ Point local; //2) Point *heap = new Point; //3) *heap = local; ...
阅读全文
摘要:考察以下代码:class AbstractBase{public: virtual IBase() = 0; virtual Interface() const = 0; virtual const char* Member() const {return _memb...
阅读全文
摘要:#include #include DWORD WINAPI ThreadFunc (LPVOID);int main (){ std::ios::sync_with_stdio(false); HANDLE hThrd = NULL; DWORD threadId = 0; ...
阅读全文
摘要:考察以下代码:#define IDENT 0#define OP *typedef int data_t;typedef struct{ long int len; data_t *data;}vec_rec, *vecptr;vec_ptr NewVec(long int len){ ...
阅读全文
摘要:考察以下代码:void Twiddle1(int *xp, int *yp){ *xp += *yp; *xp += *yp;}void Twiddle2(int *xp, *yp){ *xp += 2 * *yp;}这两个过程等价吗? 事实上 Twiddle2 的效率更高, 因为...
阅读全文
摘要:下面是 Point class 的一个加法运算符的可能实现内容:class Point{ friend Point opsrator+(const Point&, const Point&);};Pointopsrator+(const Point &lhs, const Poi...
阅读全文
摘要:nonmember friend 或 nonstatic member 或 static member 函数都会被转化为相同的形式, 因此三者的效率完全相同.另外, inline member function 的效率一直是最高的(前提是简单操作), 优化后的效率更是高, 这是因为编译器会将被视为不...
阅读全文
摘要:考虑下面的 virtual base class 派生体系:class Point2d{public: Point2d(float = 0.0, float = 0.0); virtual ~Point2d(); virtual void Mumble(); virtual ...
阅读全文
摘要:在多重继承中支持 virtual function, 其复杂度围绕在第二个及后继的 base classes 上, 以及必须在执行期调整 this 指针这一点, 以以下的 class 体系为例:class Base1{public: Base1(); virtual ~Base1(); ...
阅读全文
摘要:看过之前的 virtual function可以知道其实现模型: 每一个 class 有一个 virtual table. 内含该 class 之中 有作用的 virtual function 地址, 然后每个 object 有一个 vptr, 指向 virtual table 的所在. 在这一节中...
阅读全文
摘要:如果一个 normalize() 是一个 virtual member function, 那么以下的调用:ptr->normalize();将会被内部转化为:(*ptr->vptr[1])(ptr);其中:vptr 表示由编译器生成的指针, 指向 virtual table, 它被安插在每一个声明...
阅读全文
摘要:先说一个事情, mangle 的意思是 vt.乱砍, 损坏; n. 碾压机。 这意味着 name mangling 就是要先把你精心想出的名字们碾碎, 再拼成独一无二的样子, 当然这么残忍的事情都是编译器瞒着你做的。一般而言, member 的名称前会被加上 class 名称, 形成独一无二的命名,...
阅读全文
摘要:C++ 的设计准则之一就是: nonstatic member function 至少必须和一般的 nonmember function 有相同的效率。 这就是说, 如果我们在以下两个函数之间做选择:float magnitude3d(const Point3d *_this){...}float ...
阅读全文
摘要:指向 data member 的指针是一个颇有用处的语言特性, 特别是如果你需要详细调查 class members 的底层布局的话。这个调查可以帮助你决定 vptr 是放在尾端还是起始处。 另一个用途是可以用来决定 clas 中 access sections 的次序。考察以下代码, 其中有一个 ...
阅读全文
摘要:虚拟继承多重继承的一个语义上的副作用就是, 它必须支持某种形式的 shared subobject 继承, 一个典型的例子是最早的 iostream library:// pre-standard iostream implementclass ios{...};class istream: pub...
阅读全文
摘要:加上多态的情况如果我要处理一个坐标点, 而不在意这是一个 Point2d 或 Point3d 实例, 那么就需要在继承关系中提供一个 virtual function 接口:class Point2d{public: Point2d(float x = 0.0, float y = 0.0) ...
阅读全文
摘要:在 C++ 继承模型中, 一个derived class object 所表现出来的东西, 是其自己的的 members 加上其 base class members 的总和。 至于 derived class members 和 base class members 的排列次序并未在 C++ St...
阅读全文
摘要:考察以下代码:Point3d origin;origin.x = 0.0;此例中 x 的存取成本是什么? 答案则是视 x 和 Point3d 而定(别打脸, 我知道这是废话)。 具体的呢? 因为 x 可能是个 static member, 也可能是个 nonstiatic member; Point...
阅读全文
摘要:考察以下代码:class Point3d{public: //... private: float _x; static List *freeList; float _y; static const int chunkSize = 250; float _z...
阅读全文
摘要:考察以下代码:extern float _x;//user codeclass Point3d{public: Point3d(float, float, float); //问题来了, 是哪一个 _x? float X() const {return _x;} void ...
阅读全文
摘要:之前我曾有一篇博客讨论过 sizeof 一个类的值的问题, 但只是在讨论一个孤立的类, 没有考虑到 derived 的问题, 在此补充更多的情况。考察以下代码:class X{};class Y: public virtual X{};class Z: public virtual X{};clas...
阅读全文
摘要:下列情况中, 为了让程序顺利编译, 必须使用 member initialization list:1. 初始化一个 reference member 时;2. 初始化一个 const member 时;3. 当调用一个 base class 的 constructor, 而它拥有一组参数时;4. ...
阅读全文
摘要:一丶程序的转化考察以下代码:1 X Foo()2 {3 X xx;4 //...5 return xx;6 }看到这个, 你可能会有两个想法:1. 每次 Foo() 被调用, 就会传回 xx 的值.2. 如果 class X 定义了一个 copy constructor, 那...
阅读全文
摘要:如 default constructor 一般, 编译器也不会因为一个 class 没有 copy constructor 而产生出一个, 编译器只会在必要时才会产生一个 copy constructor, 而这个"必要" 则是指当 class 不展现 bitwise copy semantics...
阅读全文
摘要:刚从 CSDN 搬家到博客园, 文本内容倒是搬过来了, 但是在 CSDN 里内附的许多代码片可就没这么好运了, 成了留守儿童, 所以如果真的对我的一些内容感兴趣, 可以到这里看下: 有代码片的博客们
阅读全文
摘要:default constructor 会在需要的时候被编译器产生出来---->一切从这开始, 是在谁需要的时候? 考察以下代码:class Foo{public: int val; Foo *pnext};void FooBar(){//Foo Object 须在此初始化Foo bar;if(ba...
阅读全文
摘要:全为自己翻译, 如有不妥, 望请斧正.Programming In C++:[1] Represent ideas directly in code.[2] Represent relationships among ideas directly in code (e.g., hierarchica...
阅读全文
摘要:1 ≡ sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)• 1 ≤ sizeof(bool) ≤ sizeof(long)• sizeof(char) ≤ sizeof(wchar_t) ≤ ...
阅读全文
摘要:全局变量的初始化时机: C 是在编译期初始化, C++ 是在程序运行时, main 函数之前初始化.不使用中间变量实现 strlen:int MyStrlen (const char *str){return *str? MyStrlen(++str) + 1 : 0;}C 语言函数参数入栈顺序为从...
阅读全文
摘要:之前遇到过一个问题, 说是 sizeof(class_name) 的值是多少, 不解.But, 在看了 > 有所理解之后, 对于这个问题我似乎得到了正确的答案, 现总结如下, 如有不妥, 望请斧正(虽说我觉得几乎没人会看我的博客吧......= =)对了, 追求严肃的朋友请直接跳过括号内容, 嗯.....
阅读全文
摘要:1. 除非有很好的理由选择其他容器, 否则应使用 vector.2.如果有很多小的元素, 且空间的额外开销很重要, 则不要使用 list 或 forward_list.3.如果程序要求随机访问元素, 应使用vector 或 deque.4.如果程序需要在头尾 插入/删除 元素,且不会在中间插入元素,...
阅读全文
摘要:我的理解是, 插入排序最适合两种场景: 1). 较为有序情况; 2). 元素较少的情况. 所以, 希尔排序的思路就是:1. 先把原始集合分割为一个个较小的集合, 进行插入排序, 符合场景2)2. 再将 1 处理后的集合切割为更小的集合, 继续进行插入排序, 仍符合场景2)3. 当每一子集合的元素个数...
阅读全文
摘要:选择排序的思想就是......比惨 = =!将首元素设为最惨的初步标准, 与其后的元素比较, 当发现存在元素比他还惨的时候进行交换不断的找出第 n 位最惨的元素, 直到找出倒数第二位最惨的元素
阅读全文
浙公网安备 33010602011771号