自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(80)
  • 收藏
  • 关注

原创 ++运算符 前置、后置 对应的汇编语言,了解整个内部过程

a = b = ++c + (d++);◆ 前缀运算符在所有计算之前进行,后缀运算符则在(所有)赋值之后进行。  这是因为整个表达式中赋值运算符优先级是最低的,因此该运算符代表的全部操作完成后,整个表达式也就差不多运算结束了,故我们可以这样记忆:◆ 前缀运算符最先算,后缀运算符最后算。对应的汇编代码:0041417A  mov        eax,

2012-02-20 17:34:28 1701 1

原创 vc6.0 项目头文件、动态链接库设置

参考http://www.cnblogs.com/hongzg1982/archive/2011/04/20/2022298.html1、项目包含头文件设置通过Project->settings->c/c++完成,再选择Category下的Preprocessor。Preprocessor:预编译处理。我们可以在这里预先定义一些宏名,指定部分或所有符号具有未定义状态。Addit

2011-12-29 10:34:04 2333 2

转载 动态链接库、静态库区别与VS2005项目相关设置 .

一、动态链接库、静态库区别     二、VS2005项目相关设置     三、#pragma预处理指令 动态链接库、静态库区别      1、动态链接库(Dynamic Linked Library)      Windows系统平台上你可以将独立的程序模块创建为较小的DLL(Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当

2011-11-08 19:36:04 799

转载 eclipse 第一个程序

1.下载eclipse2.解压即可无需安装(前提是已经安装过jdk,见序列一)3.File->new->java project    project name:HelloWorld->Finish4.关闭起始页,在HelloWorld上右击->new->class:  Name:HelloWorld5.打入代码[java] 

2016-07-12 23:41:29 1747

原创 Mark一下,2012找工作总结

2012找工作总结C++:C++ Primer  2010/09-2011/03 这是最开始学习C++的好书,以后遇到一些基本问题也基本会翻一翻,所以被我翻得最黑的一本。属于比较基础的工具书。高质量C/C++  201111-2012/1 对C++面向对象,继承这些有比较深入的讲解,读起来会对C++有更加深入的了解,有种豁然开朗的感觉。Effective C++ 2012/03 -

2013-01-04 09:57:49 3216 1

转载 deque容器源码

// Filename: stl_deque.h// 如果vector能满足你的需求, 那么就使用vector// 如果不得不使用deque, 那么在进行一算法(尤其是sort)操作时// 应该先把deque中的元素复制到vector中// 执行完算法再复制回去// 这样的效率往往要高于直接使用算法的效率/* * * Copyright (c) 1994 * Hewl

2012-09-12 23:21:16 2859

转载 mysql索引的类型和优缺点

现在来介绍了数据库索引,及其优、缺点。针对MySQL索引的特点、应用进行了详细的描 述。分析了如何避免MySQL无法使用,如何使用EXPLAIN分析查询语句,如何优化MySQL索引的应用。本文摘自《MySQL 5权威指南》(3rd)的8.9节。索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。注:[1]索引不是万能的!索引

2012-09-12 23:09:11 2934

原创 关于串口的操作

sigh。。。杯具的串口停止位没有设置对。花了我一晚上时间。。原因竟然是停止位设置错了。所以每次连接串口后必须通过串口调试工具打开一次,软件才能运行正常。好好总结下,串口的操作。为了使软件对任意一台电脑都使用,采用轮询每个串口COM1~COM20,若打开COMi成功,则向串口发送读取状态指令,若读取结果正常,则当前串口对应着下位机。1.为了响应要求,加入进度条,进度条对应着初始化的

2012-09-03 00:49:40 2754

原创 TCP 三次握手

摘自 http://blog.csdn.net/bird67/article/details/4871541TCP(Transmission Control Protocol) 传输控制协议TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchronous建立联机)AC

2012-09-01 21:41:04 2639

原创 vector源码

vector 源码// Filename: stl_vector.h /* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentat

2012-08-22 00:23:38 14658

转载 Bash引号的那点事

在bash脚本中,有三种引号1. 单引号 ' 2. 双引号 " 3. 反引号 ` 单引号 两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思. 双引号 两个双引号包围起来的字符串,部分特殊字符将起到它们的作用. 这些特殊字符有: 美元符$, 反斜杠\, 反引号, 感叹号!. 反引号 两个反引号包围起来的字符串,将作为命令来运行, 执行的输出结果作为该反引号的内容,称为命令替换,

2012-08-15 11:04:02 8393 1

转载 pthread_cond_signal和pthread_cond_wait简介

pthread_cond_wait() 用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread_cond_s

2012-08-10 13:36:57 2502

原创 函数调用栈

理解调用栈最重要的两点是:栈的结构,EBP寄存器的作用。首先要认识到这样两个事实:1、一个函数调用动作可分解为:零到多个PUSH指令(用于参数入栈),一个CALL指令。CALL指令内部其实还暗含了一个将返回地址(即CALL指令下一条指令的地址)压栈的动作。2、几乎所有本地编译器都会在每个函数体之前插入类似如下指令:PUSH EBP; MOV EBP ESP;即,在程序执行到一个函数

2012-08-06 19:22:38 2378

原创 WaitForMultipleObjects返回值得问题

如果因时间终了而返回,那返回值是WAIT_TIMEOUT 如果bWaitAll是TRUE,那么返回值是WAIT_OBJECT_0 如果bWaitAll是FALSE,那么返回值减去WAIT_OBJECT_0,就表示哪一个handle被激发了 如果函数失败,则返回WAIT_FAILD,这时候你可以用GetLastError()找出失败原因 bWaitAll 为第三个参数

2012-07-17 12:57:15 6479

原创 effective C++笔记之条款47: 确保非局部静态对象在使用前被初始化

非局部静态对象的定义:定义在全局或名字空间范围内;在一个类中被声明为static;在一个文件范围内被定义为static。当一个对象的初始化要依赖于另一个被编译单元中的另一个对象的值,并且这第二个对象本身也需要初始化,事情就会变得复杂。因为对于不同编译单元的非局部静态对象,无法控制初始化的顺序。我们可以访问具有与非局部静态对象“相似行为”的对象(不存在初始化问题)。这种技术称

2012-04-18 17:01:19 3042

原创 effective C++笔记之条款46: 宁可编译和链接时出错,也不要运行时出错

只要有可能,就要让出错检查从运行时退回到链接时,或者,最理想的是编译时。这种方法带来的好处不仅仅在于程序的大小和速度,还有可靠性。通常,对设计做一点小小的改动,就可以在编译期间消除可能产生的运行时错误。如下所示的类:class Date{public: Date(int data, int month, int year);} 要实现这个构造

2012-04-16 21:07:15 2579

原创 effective C++笔记之条款45: 弄清C++在幕后为你所写、所调用的函数

如果没有声明下列函数,编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值操作符,一个析构函数,一个取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。当需要的时候需要,这些函数就会被生成。生成的这些函数中:缺省构造函数和析构函数实际上什么也不做,它们只是让你能够创建和销毁类的对象。(33,M24)。生成的析构函数一般是非虚拟的

2012-04-08 16:50:32 2829 1

原创 effective C++笔记之条款44: 说你想说的;理解你所说的

总结:1.        共同的基类意味着共同的特性。如果类D1和类D2都把类B声明为基类,D1和D2将从B继承共同的数据成员和/或共同的成员函数;2.        公有继承意味着“是一个”。如果类D公有继承于类B,类型D的每一个对象也是一个类型B的对象,但是反过来不成立;3.        私有继承意味着“用..来实现”。如果类D私有继承于类B,类型D的对象只不过是用类型B的对象来

2012-04-08 16:17:40 2717

原创 effective C++笔记之条款43: 明智地使用多继承(MI)

l        多继承带来了单继承中绝对不会存在的复杂性。最基本的一条是二义性。如果一个派生类从多个基类继承了一个成员名,所有对这个名字的访问都是二义的;你必须明确地说出你所指的是哪个成员。如下所示:class Lottery{public: virtual int draw(); ...};class GraphicalObject{public:

2012-04-04 15:21:03 2814

原创 effective C++笔记之条款41、42: 区分继承和模板、明智地使用私有继承

条款41:区分继承和模板l        模板类的特点:行为不依赖于类型l        当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。(堆栈类型)因为堆栈类型中,即使你对堆栈中的成员类型T一无所知,还是能够写出每个成员函数,stack的行为在任何地方都不依赖于T。l        当对象的类型影响类中的行为时,就要使用继承来得到这样一组类。(猫的类型)因为

2012-04-02 17:16:27 8346

原创 effective C++笔记之条款40: 通过分层来体现“有一个”或“用…来实现”

分层:使某个类的对象成为另一个类的数据成员,从而实现将一个类构筑在另一个类之上,这一过程称为“分层”。公有继承的含义是“是一个”。对应地,分层的含义是“有一个”或“用…来实现”。Person对象“有一个”名字,地址,电话号码和传真号码。Set模板要求用来表示任意对象的集合,并且集合中没有重复元素。因为list可以包含重复对象,所以,用公有继承不行,因为Set“是一个”list是错误的,他不能包含重

2012-03-28 10:56:24 2986

原创 effective C++笔记之条款39: 避免“向下转换”继承层次

先看如下例子:class Person {…};class BankAccount{public: BankAccount(const Person *primaryOwner, const Person *jointOwner); virtual ~BankAccount(); virtual void makeDeposit(

2012-03-27 16:15:00 2900

原创 effective C++笔记之条款38: 绝不要重新定义继承而来的缺省参数值

先看如下类层次结构enum ShapeColor {RED, GREEN, BLUE};class Shape{public: virtual void draw(ShapeColor color = RED) const = 0; …};class Rectangle : public Shape{public: v

2012-03-26 11:34:44 2662

原创 effective C++笔记之条款36、37: 区分接口继承和实现继承、绝不要重新定义继承而来的非虚函数

条款36: 区分接口继承和实现继承作为类的设计者,有时希望派生类只继承成员函数的接口(声明)(也即是纯虚函数);有时希望派生类同时继承函数的接口和实现,但允许派生类改写实现(即虚函数);有时希望同时继承接口和实现,并且不允许派生类改写任何东西(非虚函数)。看如下这个类层次结构:class Shape{public: virtual void draw() c

2012-03-25 14:51:57 1656

原创 effective C++笔记之条款35: 使公有继承体现“是一个”的含义

D (Derived)公有继承于B(Base),实际上是:类型D的每一个对象也是类型B的一个对象,但反之不成立;B是一个比D更广泛的概念,D表示一个比B更特定概念;是在声明:任何可以使用类型B的对象的地方,类型D的对象也可以使用,因为每个类型D的对象是一个类型B的对象。相反。如果需要一个类型D的对象,类型B的对象就不行:每个D是一个B,但反之不成立。 1. 如下典型例子:class P

2012-03-25 11:38:12 912

原创 effective C++笔记之条款34: 将文件间的编译依赖性降至最低

1.    先看如下函数:class Person{public: Person(const sting& name, const Date& birthday,const Address& addr, const Country& country); virtual ~Person(); string name() const;

2012-03-24 15:08:25 1142

原创 effective C++笔记之条款33: 明智地使用内联

l        内联函数的基本思想在于将每个函数调用以它的代码体来代替。这种做法很可能会增加整个目标代码的体积。在一台内存有限的计算机里,过份地使用内联所产生的程序会因为有太大的体积而导致可用空间不够。过多的使用内联还会降低指令高速缓存的命中率,从而使取指令的速度降低,因为从主存取指令当然比从缓存要慢。l        另一方面,如果内联函数非常短,编译器为这个函数体生成的代码就会真的比为函

2012-03-21 19:29:21 965

原创 effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义

条款31: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用。l        返回一个局部对象的引用。局部对象在被定义时创建,在离开函数体时被销毁。当函数返回时,程序的控制离开了这个空间,所以函数内部所有的局部对象被自动销毁。因此,如果返回局部对象的引用,那个局部对象其实已经在函数调用者使用它之前被销毁了。l        返回函数内部用new初始化的指针

2012-03-20 20:02:01 1860

原创 effective C++笔记之条款30: 避免这样的成员函数:其返回值是指向成员的非const指针或引用,但成员的访问级比这个函数要低。

有如下三种情况:1.class Address { …};class Person{public: Address& personAddress() { return address; }private: Address address;}; Person scott(..);Address& addr = scott.personA

2012-03-19 20:47:52 1164

原创 effective C++笔记之条款29: 避免返回内部数据的句柄

const A a;是否会变化?答案取决于其成员函数的组成结构。先看一个String类:class String{public: String(const char *value); ~String(); operator char *() const; //转换String到char *private: c

2012-03-19 15:47:22 871

原创 effective C++笔记之条款28: 划分全局名字空间

l        全局空间最大的问题在于它本身仅有一个。在大的软件项目中,经常会有不少人把他们的定义放在这个单一的名字空间中,从而不可避免地导致名字冲突。l        解决方法:可以在全局符号前加上一些不大可能造成冲突的前缀。 另一个比较好的方法就是使用 C++ namespace 。namespace本质上和使用前缀的方法一样,只不过避免了别人总是看到前缀而已。用户可以通过三种方

2012-03-19 09:00:42 751

原创 effective C++笔记之条款27:如果不想使用隐式生成的函数就要显示地禁止它

l        习惯应该坚持下去,不管今天是什么日子。来自3月17日晚上9点半的总结。l        比如类模板Array,它所生成的类除了可以进行上下限检查外,其他行为和C++标准数组一样,但标准的数组是不允许数组间赋值的。设计中面临的一个难题是怎样禁止掉Array对象间的赋值操作。l        有如下两步禁止隐式生成的函数生成:声明这个函数(如operator=),并使

2012-03-17 21:43:44 887

原创 effective C++笔记之条款26:当心潜在的二义性

三种可能的情况1.类中构造函数与重载转换运算符间的二义性,如下所示:class B;class A{public: A(const B& b) { cout << "A()" << endl; }private: int data;};class B{public: B():data(0) {} operator A() const;private: i

2012-03-16 16:13:14 1044 2

原创 effective C++笔记之条款24、25:在函数重载和设定参数缺省值间慎重选择、避免指针和数字类型重载

条款24:在函数重载和设定参数缺省值间慎重选择l        会对函数重载和设定参数缺省值产生混淆的原因在于,他们都允许一个函数以多种方式被调用。l        到底用哪个取决于两个问题。确实有那么一个值可以作为缺省吗?要用到多少种算法?一般来说,如果可以选择一个合适的缺省值并且只是用到一种算法,就使用缺省值,否则,就用函数重载。l        设定参数缺省值

2012-03-15 15:09:29 933

原创 effective C++笔记之条款23:必须返回一个对象时不要试图返回一个引用

l        想要返回一个对象的引用时,重载乘号操作符容易犯以下几个错误,:1        返回一个局部对象的引用2        在堆上创建一个对象,然后返回它的引用,无法去delete它,造成内存泄漏3        返回静态对象的引用,导致两个不同对象的==操作符总是为真。l        所以正确的乘法操作符应该返回一个新对象。这会导致operator的返回值构造和析

2012-03-14 21:34:33 1462

原创 effective C++笔记之条款22:尽量使用“传引用”而不用“传值”

l        通过值来传递一个对象的具体含义是由这个对象的类的拷贝构造函数定义的。这使得传值成为一种非常昂贵的操作。为避免这种潜在的昂贵的开销,就不要通过值来传递对象,而要通过引用。这会非常高效,因为没有新的对象被创建。而且避免了“切割问题”。如下所示:class Window{public:         sting name() const;         virt

2012-03-14 21:25:45 924

原创 effective C++笔记之条款20、21:避免public接口出现数据成员、尽可能使用const

条款20: 避免public接口出现数据成员 l        如果接口里存在数据成员,用户每次访问类的成员时候会想是该用括号还是不该用括号。如果每个成员都是函数,就不用多想了。l        采用函数可以更精确地控制数据成员的访问权。如果使数据成员为public,每个人都可以对它读写;如果用函数来获取或设定它的值,就可以实现禁止访问、只读访问和读写访问、只写访问。l

2012-03-13 17:13:16 922

原创 effective C++笔记之条款19:分清成员函数,非成员函数和友元函数

这是很重要的一个条款。l        成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定,而虚拟函数必定是某个类的成员函数。但如果函数不必是虚拟的,情况就稍微复杂一点。l        只要能避免使用友元函数就要避免,因为,和现实生活中差不多,友元(朋友)带来的麻烦往往比它(他/她)对你的帮助多。 l        结论如下

2012-03-12 14:57:11 1186

原创 effective C++笔记之条款18:争取使类的接口完整并且最小

l        类的用户接口是指使用这个类的程序员所能访问得到的接口。典型的接口里只有函数存在,因为在用户接口里放上数据成员会有很多缺点。l        一个完整的接口是指那些允许用户做他们想做的任何合理的事情的接口。l        一个最小的接口,是指那种函数尽可能少、每两个函数都没有重叠功能的接口l        大的类接口缺点:1        接口函数越多,以后的潜在

2012-03-12 14:55:14 556

原创 effective C++笔记之条款17: 在operator=中检查给自己赋值的情况

l        注意别名:同一个对象有两个以上的名字。别名可以以大量任意形式的伪装出现,所以在写函数时一定要考虑到它。l        在赋值运算符要特别注意可能出现的别名的情况,有两个理由:1.        效率。如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作。2.        更重要的原因。一个赋值运算符

2012-03-11 14:38:38 886

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除