C++技术
Tim_包
接外包项目。
展开
-
区分继承和模板
· 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。· 当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。 真正消化了以上两点的含义,你就可以在设计中游刃于继承或模板之间。 《Effictive C++》条款41 精髓原创 2011-07-01 10:02:00 · 803 阅读 · 0 评论 -
More Effective C++读书笔记10
Item 10:在构造函数中防止资源泄漏该条款讲述的内容跟上一条款很相似,应该都可以归属为编写异常安全代码范畴。在构造函数中尽量处理简单的代码,防止抛异常,因为C++并没有对构造函数异常做析构的动作,并不会在构造函数发生异常的情况下,调用析构函数去释放资源。这是考虑到效率问题。我们还是举个例子更直观的描述如何在构造函数中编写异常安全的代码,要做个通讯录类,内容包括姓名,地址,图片和一段原创 2013-01-09 11:49:32 · 773 阅读 · 0 评论 -
More Effective C++读书笔记9
Item 9:使用析构函数防止资源泄漏 这一章我觉得可以算作是异常安全处理的一种情况,也就是说在异常发生的情况下,保证资源能被正确释放。这里分为两种情况来讨论,一是指针操作举个例子:void myFucntion(){ Object* obj = getBack(); obj->doSomething(); delete obj;}如果在原创 2013-01-08 11:54:32 · 930 阅读 · 1 评论 -
More Effective C++读书笔记8
Item 8:理解各种不同含义的new和delete new操作符在C++中做了两件事,1是在堆上分配足够的内存,2是调用类的构造函数。new操作法的这种行为是程序员无法改变的,唯一程序员可以去做的就是按自己的需求来修改内存分配,通过重载operator new函数(void* operator new(size_t size))来自定义内存的分配,但是在调用构造函数上面是由原创 2013-01-07 11:10:18 · 585 阅读 · 0 评论 -
More Effective C++读书笔记6
Item 6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别class UPInt{public: ... UPInt& operator++(); //前缀形式 const UPInt operator++(int); //后缀形式 UPInt& operator--();原创 2013-01-06 09:22:03 · 1004 阅读 · 0 评论 -
More Effective C++读书笔记7
Item 7:不要重载“&&”,“||”, 或“,” C/C++中“&&”和“||”操作符是采用短路计算法的,而且是有顺序的。即从左往右计算,如果一旦确认表达式的值,那么后面的表达式或计算不再执行。而重载运算符本质上是函数重载,即运算符操作为函数操作。operator &&()有两种情况,一是全局重载,二是作为类成员函数;如果是全局重载,那么调用本质为 "operator原创 2013-01-06 11:39:52 · 701 阅读 · 0 评论 -
More Effective C++读书笔记4
Item 4:避免无用的缺省构造函数 没有缺省构造函数会导致: 1.无法创建该类的数组形式。2.无法在许多基于模板的容器类里使用。 设计虚基类时所面临的要提供缺省构造函数还是不提供缺省构造函数的两难决策: 1.不提供缺省构造函数的虚基类,很难与其进行合作。因为几乎所有的派生类在实例化时都必须给虚基类构造函数提供参数。 2.提供无意义原创 2013-01-05 09:43:10 · 621 阅读 · 0 评论 -
More Effective C++ 读书笔记1
Item 1: 指针和引用的区别1.指针可以为空值,引用不可以引用不可以为空值的好处是可以省略判断,提高代码效率。void Test(const int& count){ cout << count << endl;}void Test(const int* count){ if(NULL != count) { cout <<原创 2013-01-05 09:42:34 · 1152 阅读 · 2 评论 -
More Effective C++读书笔记5
Item 5:谨慎定义类型转换函数隐式类型转换时在编译期间由编译器来执行的。除了C/C++默认的基本类型的隐式类型转换外,用户自定义类型的隐式转换方式有两种:1.定义隐式类型转换运算符2.单参数构造函数或者多参数构造函数,但第一个参数以后的参数都有默认值。隐式类型转换运算符例子:class Rational{public: Rational(int nume原创 2013-01-05 12:18:58 · 812 阅读 · 0 评论 -
More Effective C++读书笔记11
Item 11:禁止异常信息(exceptions)传递到析构函数外 书中所言,会有两种情况调用析构函数。第一种是在正常情况下删除一个对象,例如对象超出作用域或者显示delete。第二种是异常传递的堆栈辗转开解(stack-unwinding)过程中,由异常处理系统删除一个对象。在一个异常被激活的同时,析构函数也抛出异常,并导致程序控制权转移到析构函数外,C++将调用 ter原创 2013-01-10 10:54:37 · 720 阅读 · 0 评论 -
More Effective C++读书笔记12
Item 12:理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异 你调用函数时,程序的控制权最终还会返回到函数的调用处,但是当你抛出一个异常时,控制权永远不会回到抛出异常的地方。 把一个对象传递给函数或一个对象调用虚拟函数与把一个对象做为异常抛出,这之间有三个主要区别。第一、异常对象在传递时总被进行拷贝;当通过传值方式捕获时,异常对象被拷贝了两次。对象原创 2013-01-11 11:17:23 · 764 阅读 · 0 评论 -
std::vector 两种操作的比较
swapassign这里只想说明这三种操作的用处和效率。swap和assign都可以用在将一个vector的内容全部复制给另外一个vector,区别是swap会改变源vector,而assign会清空目的vector后再将源vector的值全部插入到目的vector中。就效率而言,swap只是交换vector的头指针,时间复杂度是常数;而assigin时间复杂度则是线性。#incl原创 2013-07-06 17:27:58 · 6346 阅读 · 2 评论 -
More Effective C++读书笔记18
Item 20:协助完成返回值优化 返回对象时的开销会比较大,会调用对象的构造和析构函数,但是当一个函数必须要返回对象时,这种构造和析构造成的开销是无法消除的。那么还能优化么? 以某种方法返回对象,能让编译器消除临时对象的开销,这样编写函数通常是很普遍的。这种技巧是返回constructor argument而不是直接返回对象。你可以这样做:const Rational o原创 2013-01-19 16:29:53 · 578 阅读 · 0 评论 -
More Effective C++读书笔记17
这里提到一个概念Over-eager evaluation,可以理解为超前计算,主要有两种方法caching和 prefething,都是以空间换时间来提高效率。 看到这章,让我想起了我以前做的两个项目,一个是给某直辖市做的全市联网XX系统,一个是给某发电厂做的监控环境系统。 1.全市联网系统,由于数据量非常大,导致的性能瓶颈就是每次查询数据库都会很慢,原创 2013-01-17 09:55:55 · 700 阅读 · 0 评论 -
More Effective C++读书笔记16
Item 17:考虑使用lazy evaluation(懒惰计算法) 首先说说使用lazy evaluation的优点,主要是能提高程序效率。延时计算,有可能避免不必要的计算,或者是只需用计算部分结果,而不需要全部结果,这些都可以称为lazy evaluation。C++本身是early evaluation,它需要程序员自己实现lazy evaluation,这样大大增原创 2013-01-16 10:13:42 · 644 阅读 · 0 评论 -
More Effective C++读书笔记15
Item 16:牢记 80-20 准则(80-20 rule) 80-20 准则说的是大约 20%的代码使用了 80%的程序资源;大约 20%的代码耗用了大约 80%的运行时间;大约 20%的代码使用了 80%的内存;大约 20%的代码执行 80%的磁盘访问;80%的维护投入于大约 20%的代码上;通过无数台机器、操作系统和应用程序上的实验这条准则已经被再三地验证过。80-2原创 2013-01-15 10:00:25 · 630 阅读 · 0 评论 -
More Effective C++读书笔记14
Item 14:审慎使用异常规格(exception specifications) 何为异常规格,通俗的理解就是对异常的规范的说明。它明确地描述了一个函数可以抛出什么样的异常。但是它不只是一个有趣的注释。编译器在编译时有时能够检测到异常规格的不一致。而且如果一个函数抛出一个不在异常规格范围里的异常,系统在运行时能够检测出这个错误,然后一个特殊函数unexpected将被原创 2013-01-12 11:39:41 · 603 阅读 · 0 评论 -
More Effective C++读书笔记19
Item 21:通过重载避免隐式类型转换 如果是自定义类型进行隐式的类型转换,肯定会调用构造和析构函数,这样就一定会有一定的开销,那么如何避免这类隐式类型转换呢?21小节给出一个方式就是通过重载函数避免进行隐式类型转换。class UInt {public: const UInt operator+(const UInt& lrs, const UInt& hrs);原创 2013-01-26 17:51:43 · 743 阅读 · 0 评论 -
More Effective C++读书笔记13
Item 13:通过引用(reference)捕获异常 为什么要通过引用捕获异常,引用捕获异常相对值和指针捕获有何优点? 通过Item12学习可以看到首先,值捕获异常会调用拷贝构造函数2次,而引用捕获只有一次,效率方面,引用要高于值。可以按效率高低进行下排序,由高到低:指针->引用->值。其次值传递在继承体系中会导致slice问题,即子类会被切割为基类。通过这两点就可原创 2013-01-11 11:47:18 · 704 阅读 · 0 评论 -
More Effective C++读书笔记3
Item 3: 不要对数组使用多态 语言规范中说通过一个基类指针来删除一个含有派生类对象的数组,结果将是不确定的。class BST { ... };class BalancedBST: public BST { ... };void printBSTArray(ostream& s,const BST array[], int numElements){原创 2013-01-05 09:42:59 · 731 阅读 · 0 评论 -
More Effective C++ 读书笔记2
Item 2:尽量使用C++风格的类型转换1. C语言的类型转换缺点1.1 过于粗鲁,允许在任何类型之间进行转换。1.2 在程序语句中难以识别。1.3 类型转换失败不可获知。2. C++类型转换符的介绍2.1. static_cast 在功能上基本上与 C 风格的类型转换一样强大,含义也一样。但是,static_cast 不能从表达式中去除 const 属性。2.2.原创 2013-01-05 09:42:45 · 761 阅读 · 0 评论 -
关于跨平台的一些感受
最近几天一直在做代码移植工作,将Unix下的C/C++代码移植到Windows平台上,有一些小体会,这里记录下来跟大家分享下:1、一定要注意跨平台的C++尽量使用STL,各个编译器对STL都支持,除了一些特性外基本无需修改。2、使用的C库函数一定要注意,是C99标准还是C89标准,VS编译器2010以下对C99都不支持,很多函数都无法使用。3、一些变量声明尽量放到函数开始,for循环中原创 2012-04-03 22:43:10 · 637 阅读 · 0 评论 -
std:find
把之前使用iterator 进行循环检测的方法都改成使用find方法进行查找,更快,代码更简洁,清晰。原创 2012-03-23 17:42:42 · 822 阅读 · 2 评论 -
strcmp, stricmp — compare strings.
ReturnsA negative number if the first string is ordinally less than the second string according to the ASCII character set, a positive number if the first string is greater than the second, and ze翻译 2012-03-06 13:33:58 · 1037 阅读 · 0 评论 -
std::swap
std::swap function template template void swap ( T& a, T& b );Exchange values of two objects(交换两个对象的值)Assigns the content of a to b and the content of b to a.(将a的内容给b,将b的内容给a。翻译 2012-02-28 17:13:34 · 6647 阅读 · 0 评论 -
Imcomplete class type delete(不完整类类型的删除)
当delete不完整类类型对象的时候,不会调用对象的析构函数,导致内存泄漏。所以要避免delete 不确定类型。 首先解释下不完整类类型Imcomplete class type:只见声明不见定义的类、结构体或是联合体;相对应的就是complete type,就是编译器可以确定的类型。 下面举例说明: //delete_object.h c原创 2012-01-31 20:51:49 · 2774 阅读 · 3 评论 -
STL之Trim
今天无意之间看到了通用类的三个函数,是用STL实现字符串去掉首尾空格,方法用的颇为简洁,记录下来分享和学习下。 1#include 2#include 3 4using namespace std; 5 6 7string& lTrim(string &ss) 8{ 9 string::iterator p=f原创 2012-01-29 22:09:32 · 2623 阅读 · 1 评论 -
01092012学习记录
今天又学到一招STL的用法,嘿嘿。关于遍历容器的时候删除迭代器的方法: 例如有一个vector vec,及指向该vector的迭代器it;要删除其中值等于5的所有项,for(it = vec.begin(); it != vec.end(); it++){ if(5 ==*it ) { vec.erase(it++);//important原创 2012-01-09 21:30:43 · 599 阅读 · 1 评论 -
C++11中值得关注的几大变化
C++11中值得关注的几大变化◆ Lambda表达式◆自动类型推断和decltype◆统一初始化语法◆ Deleted和Defaulted函数◆ nullptr◆ 委托构造函数◆ 右值引用C++11标准库C++于2003年以库技术报告1(TR1)的形式经历了重大改版,TR1包括新的容器类(unordered_set,unord转载 2011-12-13 09:15:02 · 1178 阅读 · 0 评论 -
inserter、back_inserter、front_inserter
inserter、back_inserter、front_inserter分别返回三种类型的iterator:insert_iterator,back_insert_iterator,front_insert_iterator。这三种iterator被设计成允许不同的算法重写elements(例如copy方法)去替代插入操作。// inserter example#include原创 2012-04-24 15:17:57 · 3617 阅读 · 0 评论 -
分享一个日志函数
#include #include void logTest(const char* content, ...){ FILE* logfile = fopen("log.txt", "a"); if(logfile) { fprintf(logfile, "########## NEW LOG ########\n");原创 2012-04-13 13:24:55 · 543 阅读 · 0 评论 -
delete对象后到底要不要将对象置为NULL
以下是我的一个美国同事丹尼尔对此的看法:Member pointers do NOT have to be set to NULL in a destructor. A destructor, as its name implies, destroys an object and the object can’t be accessed after that. So accessing any原创 2012-11-22 14:31:54 · 5138 阅读 · 2 评论 -
一个好的学习C++11标准的国外博客
http://solarianprogrammer.com/categories/C++11/原创 2012-11-27 17:50:38 · 837 阅读 · 0 评论 -
Win 8 文件读写操作
啥也不说了,直接上代码。#include #include using namespace Platform;using namespace Windows::Storage;using namespace Windows::Storage::Streams;using namespace Concurrency;StorageFile^ openFile(String^ fil原创 2012-08-07 16:41:56 · 1467 阅读 · 1 评论 -
Windows Runtime Component理解
WinRT类型的动态库,可以认为导出的是类,应用通过创建类的实例来引用该导出类的功能即接口。 这里需要注意的是导出类的public成员只能是接口(成员变量是不可以为public),这样就避免了暴露类结构,并且接口中的参数不能为native type(例如:void* dd就不可以作为参数)。原创 2012-06-21 17:40:22 · 2519 阅读 · 0 评论 -
谈Lambda表达式
最近由于再开发Win 8 metro程序和准备开发Win Phone 8 App,学习了下WinRT开发,包括一些C++ 11新标准内容,最初对Lamdba表达式的表达很是头疼,对以往的编程认识非常不同,这也就让我对它产生了浓厚的兴趣,找了很多资料来学习它,并且写了好多程序去测试它,慢慢发现其实Lamdba表达式真的很有趣! 其实对Lambda表达式不必有任何的畏惧心里,通过仔细的分析它原创 2012-06-18 22:31:13 · 1135 阅读 · 0 评论 -
在类中定义引用类型成员变量
在类中可以定义引用类型的成员变量,但是必须在构造函数之前完成初始化,也就是必须在构造函数的初始化列表中完成初始化。class Functor{public: // The constructor. explicit Functor(int& evenCount) : _evenCount(evenCount) { //_evenCo原创 2012-06-11 11:13:20 · 3588 阅读 · 0 评论 -
VS调试-library版本引起的内存问题
VS建立的项目,其中肯定涉及到DLL或者是LIB库,这时候调试起来会有一定不便,这里建议大家将相关项目建立成一个solution,只要设置好路径,就可以调试了,而且调试起来非常方便。但是当lib库或DLL库中涉及到内存分配,但是释放却在其他库或上层软件时,切记要保证EXE或DLL或者LIB的版本要一致,这里说的一直就是要求必须都是debug版本或者release版本,否则在内存处理上会出现一些问题原创 2012-04-23 14:50:29 · 833 阅读 · 0 评论 -
Android NDK之JNI陷阱
背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台。这就涉及到Android NDK(native develop kit)内容。这里只想记录下JNI(java native interface)经常遇到到问题。 问题1. 忘记delete local reference。带New到方法(如:NewByteArray)这样到方法比较好辨认原创 2013-09-30 21:54:34 · 11359 阅读 · 5 评论