C/C++
DAVID850911
这个作者很懒,什么都没留下…
展开
-
pointers 与references
指针与引用的区别:1、reference一定得代表某个对象,因此,reference必须有初值。2、没有所谓为“null reference"之说,这意味着reference可能会比pointers更富有效率,因为在使用reference之前不需要测试其有效性。3、pointers可以被重新赋值,指向另一个对象;reference却总是指向它最初获得的那个对象。使用:1原创 2013-07-12 08:23:25 · 541 阅读 · 0 评论 -
了解临时对象的来源
C++中真正所谓的临时对象是不可见的--不会在源代码中出现。发生于两种情况:1、隐式类型转换;2、当函数返回对象的时候;只有当对象以by value 方式传递,或是当对象被传递给一个reference to const 参数时,这些转换才会发生。如果对象被传递给一个reference to non const参数,并不会发生此类转换。C++禁止为non-const-reference参原创 2013-07-22 23:29:17 · 581 阅读 · 0 评论 -
禁止异常流出destructor之外
两种情况下destructor会被调用:1、当对象在正常状态下被销毁,也就是当它离开了它的生存空间或被明确地删除;2、当对象被exception处理机制--也就是exception传播过程中的stack-unwinding(栈展开)机制--销毁;原创 2013-07-22 22:02:24 · 597 阅读 · 0 评论 -
利用重载技术避免隐式类型转换
class UPInt{public:UPInt();UPInt( int value);....};const UPInt operator+( const UPInt& lhs, const UPInt& rhs);UPInt upi1, upi2;UPInt upi3 = upi1 + upi2;upi3 = upi1 + 10;upi3原创 2013-07-30 22:50:10 · 585 阅读 · 0 评论 -
考虑以操作符复合形式(op=)取代其独身形式(op)
要确保操作符的复合形式(例如:operator+=)和其独身形式(例如:operator+)之间的自然关系能够存在,一个好方法就是以前者为基础实现后者。3个和效率相关的问题:1、一般而言,复合操作符比其对应的独身版本效率高,因为独身版本通常必须返回一个新对象,我们必须因此负担一个临时对象的构造和析构成本。2、如果同时提供某个操作符的复合形式和独身形式,便允许客户在效率与便利之间做取舍。原创 2013-07-30 23:15:30 · 623 阅读 · 0 评论 -
了解virtual functions,multiple inheritance,virtual base classes, runtime type identification的成本
vtbl通常是一个由“函数指针”架构而成的数组。也可能是链表。vtbl的位置:暴力式方法:在每一个需要vtbl的目标文件内都产生一个vtbl幅本。最后再由连接器剥除重复的副本,使最终的可执行文件或程序库,只留下每个vtbl的单一实体。探勘式访求:class's vtbl被产生“内含其第一个 non-inline,non-pure虚函数定义式”的目标文件中。如果class内的所有虚函数都原创 2013-08-01 21:56:20 · 521 阅读 · 0 评论 -
考虑使用其他程序库
operatoriostream在编译期就决定其操作数的类型,而studio函数则是在运行时期才解析其格式字符串。More Effective C++----23th原创 2013-08-01 20:40:26 · 413 阅读 · 0 评论 -
将constructor和non-member functions虚化
直接上例子:class NLComponet//抽象基类,用于时事消息的组件,其中至少一个纯虚函数{public:.....};class Graphic : public NLComponet//无虚函数{public:.....};class TextBlock : public NLComponet//无虚函数{public:....原创 2013-08-02 21:33:43 · 401 阅读 · 0 评论 -
判断浮点数
_isnan检查特定双精度浮点值不是数字 (NAN)。int _isnan( double x );参数x双精度浮点值。返回值,如果参数 x 为 NAN,_isnan 返回非零值;否则返回 0。实例必需的头原创 2013-09-09 10:59:35 · 862 阅读 · 0 评论 -
vtkICP
#include #include #include #include #include #include #include #include //to set type to ridgid body#include #include #include vtkPolyData* CreatePolyData();vtkPolyData* Pertu转载 2013-11-13 17:46:27 · 296 阅读 · 0 评论 -
隐藏控制台窗口
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )原创 2013-12-03 17:00:00 · 201 阅读 · 0 评论 -
明智运用exception specifictions
如果一个函数抛出一个并未列于其exception specifiction的异常,这个错误会在运行时刻被检验出来,于是特殊函数unexpected会被自动调用。unexpected的默认行为是调用terminate,而terminate的默认行为是调用abort,所以如果程序违反exception specifiction,默认结果是程序被中止。 extern void f1();vo原创 2013-07-22 22:55:53 · 610 阅读 · 0 评论 -
以by reference 方式捕捉exceptions
4个标准的异常:bad_allocbad_castbad_typeidbad_exception抛出的都是对象,不是对象指针。catch by reference的好处。1、避开对象的删除问题;2、避开切割问题,即转换;3、约束被复制的次数; More Effective C++---13th原创 2013-07-22 22:42:02 · 524 阅读 · 0 评论 -
C++转型操作符
C的转型操作几乎允许你将任何类型转换为任何其他类型,这是十分拙劣的。C++引入4个新的转型操作符:static_cast,const_cast,dynamic_cast,reinterpret_cast。C过去的写法: (type)expression C++现在的写法:static_cast(expression) static_cast甚至不能移原创 2013-07-13 15:19:51 · 468 阅读 · 0 评论 -
绝对不要以多态方式处理数组
书上举了个例子:class BST{ ... };class BalanceBST : public BST{ .... };/*在一个真正具规模的程序中,这样的classes可能会被设计为templates。*/void printBSTArray( ostream& s, const BST array[], int numElements){for(原创 2013-07-13 22:50:03 · 452 阅读 · 0 评论 -
非必要不提供default constructor
所谓 default constructor (也就是说不给任何自变量就可调用者)是C++一种“无中生有”的方式。constructors用来将对象初始化,所以default constructors的意思是在没有任何外来信息的情况将对象初始化。如果一个类缺乏一个default constructor, 当你使用这个class 时便会有某些限制。例:针对公司仪器而设计的class,原创 2013-07-14 00:05:31 · 563 阅读 · 0 评论 -
千万不要重载&& || ,这三个操作符
“骤死式”评估方式:一旦表达式的真假值确定,即使表达式中还有部分尚未检验,整个评估工作仍告结束。C++允许我们重载operator&&和operator|| 两函数进行重载。下面这个式子:if( expression1 && expression2 )会被编译器视为以下两者之一1、if( expression1.operator&&( expression2 ) //假原创 2013-07-15 23:02:16 · 603 阅读 · 0 评论 -
对定制的“类型转换函数”保持警觉
单自变量constructors是指能够以单一自变量成功调用的constructors。如此的constructors可能声明拥有单一参数,也可能声明拥有多个参数,除第一个参数之外都有默认值。class Name{Name(const string& s)//可以把string转换为Name....}class Rational{Rational(int num原创 2013-07-15 22:32:54 · 518 阅读 · 0 评论 -
区别increment/decrement操作符的前置和后置形式
class UPInt //unlimited precision int{public:UPInt& operator++()//前置式const UPInt operator++( int )//后置式UPInt& operator--();//前置式const UPInt operator--( int );//后置式.....};//前置原创 2013-07-15 22:46:02 · 741 阅读 · 0 评论 -
了解各种不同意义的new 和 delete
string *ps = new string("Memory");这一句的动作分为两个部分:1、它分配足够的内存,用来放置某类型的对象;2、它调用一个constructor,为刚才分配的内存中的那个对象分配初值new operator总是做这两件事。operator new 的声明如下:void* operator new( size_t size);其返回类原创 2013-07-15 23:25:29 · 441 阅读 · 0 评论 -
利用Destructor避免泄漏资源
异常存在的理由:如果一个函数利用“设定状态变量”的方式或是利用“返回错误码”的方式发出一个异常信号,无法保证此函数的调用者会检查那个变量或检验那个错误码。于是程序可能会一直继续下去,远离错误发生地点。但是如果函数以抛出expcetions的方式发出异常信号,而该exception未被捕捉,程序的执行便会立刻中止。longjmp在C++中有一个严重的缺陷:当它调整栈(stack)的时候,无法原创 2013-07-16 23:23:13 · 556 阅读 · 0 评论 -
在constructor内阻止资源泄漏
class BookEntry{public:BookEntry( const string& name, const string& address="", const string& imageFileName="", const string& audioClipFileName="");~BookEntry();....priva原创 2013-07-17 00:09:14 · 514 阅读 · 0 评论 -
了解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”之间的差异
函数参数和exceptions的传递方式有3种:by value by reference by pointer当我们调用的是一个函数,控制权最终会回到调用端。但当你抛出一个异常,控制权不会再回来抛出端。istream operator>>(istream& s, Widget& w);void passAndThrowWidget(){Widget localWid原创 2013-07-22 22:34:45 · 599 阅读 · 0 评论 -
学习资料网址
Flex: http://www.bianceng.cn/webkf/Flex/index1.htm原创 2013-12-23 22:41:28 · 24504 阅读 · 0 评论