随笔 - 576  文章 - 0  评论 - 62  阅读 - 219万
10 2013 档案
UE 的使用
摘要:1、查找,只匹配整个词语:匹配词语Andy,而不匹配包含Andy的词语,Andy前后有特殊字符才能匹配成功,前后的特殊字符表明Andy是一个词语。2、正则表达式匹配,如下:符号功能%匹配行首 - 表示搜索字符串必须在行首,但不包括任何选定的结果字符中的行终止字符。$匹配行尾 - 表示搜索字符串必须在... 阅读全文
posted @ 2013-10-31 20:38 Andy Niu 阅读(3640) 评论(0) 推荐(0) 编辑
内存泄漏
摘要:1、程序结束后,程序(实际上是指进程)占用的内存全部释放,不管是栈上的内存还是堆上的内存,包括泄漏的内存,全部释放。因为进程都不在了,OS会把进程的所有资源回收。2、因此,所谓的内存泄漏只是存在于程序运行过程中。3、内存泄漏:在程序运行过程中,对于一块确定不再使用的内存,没有人工delete,才会造成内存泄漏。4、假设一块内存,在程序的整个运行过程中都要使用,这种情况下这块内存是不能释放的,否则会引起未定义行为。必须等到程序结束后,OS来回收内存。5、假设指针指向一块申请的内存A,然后再指向一块申请的内存B,对于内存A,以后永远不会在使用,没有对内存A进行delete,造成内存泄漏。OS不会释 阅读全文
posted @ 2013-10-30 20:02 Andy Niu 阅读(237) 评论(0) 推荐(0) 编辑
区分copy构造与copy赋值
摘要:1、 Widget w1; //调用Default构造方法 Widget w2(w1); //调用copy构造方法 w1 = w2; //调用copy赋值操作符 Widget w3 = w2; //调用copy构造方法2、 对于Widget w3 = w2; 是调用copy构造方法,为什么? 因为定义一个对象的时候,肯定要调用构造方法。因此,对于Widget w3(w2) 和Widget w3 = w2表达的意思一样,都是以W2为蓝本,copy构造对象W3。3、方法调用做了两件事:a、用实参初始化形参;b、控制权交给被调方法。 被调方法的执行,以形参的定义和初始... 阅读全文
posted @ 2013-10-30 19:42 Andy Niu 阅读(258) 评论(0) 推荐(0) 编辑
shared_ptr注意事项
摘要:对shared_ptr的Copy构造和Copy赋值,会改变引用计数,但是对shared_ptr中原始资源的Copy构造和Copy赋值,不会改变引用计数。因此存在下面的危险情况:1、获取资源时,初始化指针p,然后才用shared_ptr封装资源,这意味着,又可能shared_ptr已经释放了资源,还在使用p,造成未定义行为。这种问题的解决办法就是RAII2、全局变量,取得shared_ptr中的原始资源,又可能shared_ptr已经释放了资源,还在使用全局变量,造成未定义行为。这种问题的解决办法是,全局变量不要获取shared_ptr的原始资源。对于已经存在的接口,需要传递原始资源,是没问题的 阅读全文
posted @ 2013-10-29 20:51 Andy Niu 阅读(609) 评论(0) 推荐(0) 编辑
内存分配的确定
摘要:对于下面的情况,应该在Heap上分配内存:1、对象比较大(要考虑包含的对象的大小),栈的大小有限,不宜分配很大的对象。2、创建之后,还要在其他地方经常使用,要进行频繁的传递。对象比较大,以及频繁的传递,都会导致Copy代价较大。Copy代价大,为什么不使用引用呢? 引用必须进行初始化(先有真名,再有别名),有些地方可以使用引用,比如方法的形参。有些地方不能使用引用,比如存在关联关系的对象,不能引用另一个对象,只能通过指针。 阅读全文
posted @ 2013-10-29 20:39 Andy Niu 阅读(200) 评论(0) 推荐(0) 编辑
boost 互斥体和锁
摘要:1、共享资源是一个自动锁住的房间,互斥体是钥匙,进入房间必须取钥匙,离开房间应该还钥匙。这就对应着互斥体的lock(取钥匙)和unlock(还钥匙)。2、考虑下面的场景:还钥匙的时候出现异常,会发生什么? 导致死锁,因为钥匙归还失败,所有人都没法再取到钥匙。3、如何解决这个问题? 想一下,动态分配内存存在类似的情况。如果忘记delete,会导致内存泄漏。它是如何解决的? 在栈上分配对象,要一个特点,那就是离开作用域后,对象肯定要调用析构方法。利用这个特点,可以使用对象对指针封装,在对象的析构方法中进行delete,就保证了一定会执行delete。这就是智能指针。因为智能指针,不是针对一个特.. 阅读全文
posted @ 2013-10-25 19:17 Andy Niu 阅读(4260) 评论(0) 推荐(0) 编辑
理解MVVM模式
摘要:1、WPF的核心是数据绑定。2、考虑这样一个场景:界面上有一个TextBox显示Person的年龄,一个Button,点击一次Button,年龄加1。3、做一个View,上面有TextBox和Button,TextBox的Text绑定ViewModel中Person的年龄,Button的Command绑定ViewModel中的命令。4、设置View的DataContext为ViewModel5、ViewModel关联Person和Command对象,这里的Person就是Model。ViewModel对View暴露两个接口:Person的Age和Command。6、Command封装Perso 阅读全文
posted @ 2013-10-25 18:55 Andy Niu 阅读(323) 评论(0) 推荐(0) 编辑
boost 线程、互斥体、条件变量
摘要:1、任何技术都是针对特定场景设计的,也就是说,为了解决某个问题而设计的。2、考虑下面一种场景:一个小旅馆,只有一个卫生间,有清洁人员,店主人,和旅客。卫生间用完之后,就会自动锁闭,必须取钥匙,才能进入卫生间。3、在上面的场景中,卫生间是共享资源,清洁人员和旅客使用卫生间的过程,就是两个线程,钥匙是互斥体。4、假定卫生间只有一个坑,一次只能一个人使用,因此就只有一个钥匙。谁要使用卫生间,必须拿到钥匙。别人拿到钥匙,自己必须等待,拿钥匙就是,程序中lock互斥体。5、通过钥匙保证了,卫生间一次只能一个人使用。这样的好处是:通过一个小钥匙,控制了一大块资源的使用。6、钥匙保证了,不同人之间不能同时使 阅读全文
posted @ 2013-10-24 19:41 Andy Niu 阅读(1617) 评论(0) 推荐(1) 编辑
数据结构
摘要:1、数据结构分为逻辑结构和物理结构。2、逻辑结构:元素之间的关系,分为: a、集合结构:在同一个集合中,元素之间没关系。 b、线性结构:元素一对一的关系 c、树形结构:元素一对多的关系 d、图形结构:元素多对多的关系3、物理结构:元素的存放形式 a、顺序存放:元素存放在连续的存储单元里 b、链式存放:元素存放在任意的存储单元里,通过指针,知道与自己关联的元素。 阅读全文
posted @ 2013-10-24 18:58 Andy Niu 阅读(269) 评论(0) 推荐(0) 编辑
哈希表
摘要:1、哈希表解决什么问题? 假设有一组记录,每条记录都是学生名,成绩的键值对,在一般的线性表中,每条记录的存放是没有规律的。如果要找Andy的成绩,因为不知道Andy这条记录的存放位置,必须遍历集合,逐个比较,找到Andy这条记录,取出成绩。时间复杂度为O(N),效率很低。哈希表就是解决这个问题的。2、如何解决的? 上面问题的关键是,根据学生名不能确定存放位置,哈希表是这样做的:设计一个映射函数,把学生名映射到存放的地址。这样就行了,给我一个学生名,我只要根据映射函数计算一下,就知道了存放位置,直接去那个地方去数据,时间复杂度为O(1)。同样当插入记录的时候,根据映射函数计算一下,这条记录应.. 阅读全文
posted @ 2013-10-24 18:46 Andy Niu 阅读(449) 评论(0) 推荐(0) 编辑
C++ 迭代器类别
摘要:1、output迭代器:一次一步,只能向前,流水线上放着一批空的盒子,每次向前移动一个,往盒子里面塞一个东西。2、input迭代器:一次一步,只能向前,流水线上放着一批零件,每次向前移动一个,可以看这个零件,但是不能加工。3、forward迭代器:继承input迭代器,可以加工零件。4、bidirectional迭代器:继承forward迭代器,可以向后移。5、random access迭代器:继承bidirectional迭代器,可以一次移动多个位置。 阅读全文
posted @ 2013-10-23 19:58 Andy Niu 阅读(677) 评论(0) 推荐(0) 编辑
TCP/IP协议
摘要:1、OSI(Open System InterConnection),开放式系统互联,分为7层,TCP/IP分为4层:数据链路层,网络层,传输层,应用层。2、网络链路层的地址是MAC地址,网络层的地址是IP地址,传输层的地址是Port3、每一层上都有啥? 网络层:IP,ARP,ICMP 传输层:TCP,UDP 应用层:HTTP,FTP,SMTP,DNS4、ARP(Address Resolution Protocol):将目标IP地址转化为MAC地址5、ICMP(Internet Control Message Protocol):确认网络是否正常。ping和tracert都是由ICMP... 阅读全文
posted @ 2013-10-23 19:43 Andy Niu 阅读(368) 评论(0) 推荐(0) 编辑
C++ 方法隐藏
摘要:1、过载:一个类中,方法名相同,形参表不同的方法。2、重写:子类与父类的virtual方法,方法名,形参表相同。3、考虑下面的情况,子类与父类方法名相同。 父类是virtual方法 形参表相同 ---> 构成重写 父类是virtual方法 形参表不同 ---> 隐藏父类方法 父类不是virtual方法 形参表相同 --->隐藏父类方法 父类不是virtual方法 形参表不同 --->隐藏父类方法4、只有在父类是virtual方法,且方法名,形参表相同,才构成重写。其他的情况都不构成重写,也不构成过载,子类同名不能过载父类的方法,只会隐藏父类的方法。5、只有在父类是vir 阅读全文
posted @ 2013-10-22 20:13 Andy Niu 阅读(2114) 评论(0) 推荐(0) 编辑
理解虚函数
摘要:1、虚函数实现了运行时多态,他是如何实现的呢?2、含有虚函数的对象,内部有一个vptr(virtual table pointer),指向虚函数表的指针。3、含有虚函数的类有一个vtbl(virtual table),是一个数组,内部包含的是一组函数指针。4、每个对象都有一个自己的vptr,类的所有对象共享vtbl5、vtbl包含一组函数指针,这些函数指针指向虚函数,虚函数包括: a、对于父类的虚函数,如果没有重写,包含父类的虚函数; b、对于父类的虚函数,如果重写了,包含自身重写后的函数; c、自身中,新创建的虚函数。6、另外,运行时是如何获取对象的类型的? 在类的虚方法表中还有一个... 阅读全文
posted @ 2013-10-22 19:22 Andy Niu 阅读(360) 评论(0) 推荐(0) 编辑
对象占用空间
摘要:1、对象分为字段和方法,字段分为:static,non-static。方法分为static,non-static,virtual2、static字段,放在静态存储区,所有的对象共享。non-static字段,每个对象拥有自己的一份内存copy3、static方法,non-static方法,virtual方法都放在代码区,所有的对象共享。调用方法的时候,如何区分方法内的数据是那个对象的呢? 方法内的数据是方法绑定对象的数据,因为调用方法的时候,需要指定对象。对于virtual方法,还要增加一个额外指针,用于在运行时,根据对象的真实类型绑定方法。注意:就算有多个virtual方法,也只有一个额外. 阅读全文
posted @ 2013-10-22 19:05 Andy Niu 阅读(262) 评论(0) 推荐(0) 编辑
理解内存
摘要:1、操作系统对硬件封装,对外暴露API,编程语言对操作系统封装,对外暴露API,程序员利用编程语言的API进行编程。2、硬盘利用磁性保存数据,内存是晶体管,用电流的有无状态表示数据。因此断电后,硬盘的数据还在,内存的数据消失了。3、访问硬盘使用磁头读写数据,访问内存使用数据总线。4、每个进程都会占用一定的内存,对于32位操作系统,进程占用的内存必须小于 4G-操作系统常驻内存。5、系统中的进程很多,每个都占用一定的内存,会导致内存不够用,就会出现roll-out,roll-in。内存不够用的情况下,去执行一个进程,先把其他暂时不用的进程内存roll-out,然后把该进程的内存roll-in。在 阅读全文
posted @ 2013-10-22 18:47 Andy Niu 阅读(264) 评论(0) 推荐(0) 编辑
单例模式
摘要:1、使用C#语言,比较简单,使用私有的构造方法和公有的静态方法返回静态实例。在C#中,赋值的时候,基本类型是整体拷贝,引用类型是复制引用。2、使用C++语言,有几个地方需要注意: a、编译器会自动生成copy构造方法和copy复制操作符,从而导致生成多个实例。为了解决这个问题,声明私有的copy构造方法和copy复制操作符,但是不定义。通过继承noncopyable是个好办法,noncopyable中声明了私有的copy构造和copy赋值,并且构造方法是protected。子类会继承父类的所有成员,只不过是不能访问父类的私有成员。 b、静态构造方法返回引用没有问题,如果返回指针,需要考虑什.. 阅读全文
posted @ 2013-10-22 18:28 Andy Niu 阅读(268) 评论(0) 推荐(0) 编辑
私有成员有没有被继承?
摘要:私有成员有没有被继承?私有成员被继承,只不过子类不能访问父类的私有成员。很好证明: 1 class Base 2 { 3 private : 4 int a; 5 }; 6 7 class Derived:Base 8 { 9 private :10 int b;11 };12 13 14 int _tmain(int argc, _TCHAR* argv[])15 {16 Base base;17 std::cout<<sizeof(base); // 418 19 std::cout<<std::endl;20 21 Derived de... 阅读全文
posted @ 2013-10-22 10:37 Andy Niu 阅读(2124) 评论(0) 推荐(0) 编辑
share_ptr
摘要:1、为了保证不会重复释放内存,auto_ptr的copy构造和copy赋值都是破坏性操作,执行后,导致右操作数的指针为0。这就出现了,copy构造或者copy赋值后,两个对象不相等了。2、auto_ptr的问题就是,一块内存只能有一个指针指向它,为了解决这个问题,使用share_ptr。3、share_ptr是如何实现的? a、内部有一个指向原始资源的指针。 b、内部维护一个share_count,记录有多少个指针指向该内存。 c、析构的时候,share_count>1,将计数减1;share_count==1释放内存。 d、考虑到每个share_ptr中都有一个自己的share_co. 阅读全文
posted @ 2013-10-21 19:09 Andy Niu 阅读(1096) 评论(0) 推荐(0) 编辑
auto_ptr
摘要:1、 int *pi = new int(1024); delete pi; // 释放pi指向的int对象占用的内存空间 pi = 0; // 将pi设置为0,不指向任何东西,为Null 注意:删除0值的指针是安全的,但是没有任何意义。对于上面的情况,先释放内存,再置为Null。顺序不能颠倒,如果颠倒了,会导致内存泄漏。2、在Stack上分配的内存,用完后,系统会自动释放,调用析构方法。在Heap上,通过new分配内存,必须使用delete,手动释放内存,如果忘记,会导致内存泄漏。如果重复释放内存,会破坏自由存储区,导致分配在上面的其他对象受到破坏。(Stack记录程序的执行过程,H... 阅读全文
posted @ 2013-10-21 18:56 Andy Niu 阅读(316) 评论(0) 推荐(0) 编辑
function/bind
摘要:1、函数指针指向一类函数,这类函数的类型一样,也就是函数的返回类型和形参表一样。2、不同的函数类型要使用不同的函数指针,才能指向它,有没有好的办法呢? 类比思考下,交换方法,对不同的类型要写不同的swap方法,解决的办法是使用泛型,对于特定的类型编译器会生成特定的swap方法。同样道理,function是泛型的函数指针,使用特定的函数类型就能生成特定的函数指针。3、bind返回一个方法,把方法和实参绑定一起。4、函数指针可以指向bind返回的方法,在调用时,传递实参。但是,由于bind已经绑定了实参,导致函数指针调用的时候,实参传不进去。解决办法是:bind的时候使用占位符,_1,_2,这样. 阅读全文
posted @ 2013-10-18 17:13 Andy Niu 阅读(355) 评论(0) 推荐(0) 编辑
异步方法
摘要:1、平时使用的方法都是同步方法,也就是该方法执行完毕,才能往下执行。 2、如何实现异步呢? 实现异步的办法:通过创建一个新的线程,线程接收一个同步方法,启动线程,执行方法上的操作。 3、异步方法是如何实现的呢? 在异步方法内,创建一个线程,该线程接收一个同步方法,启动线程。 4、异步方法有一个问题, 阅读全文
posted @ 2013-10-17 18:11 Andy Niu 阅读(2781) 评论(0) 推荐(0) 编辑
C++ 生成
摘要:1、重新生成,会导致所有cpp文件重新编译,然后连接。2、使用生成,只会对需要重新编译的cpp文件,进行编译。 a、修改cpp文件方法实现,只需要重新编译该cpp文件 b、修改h文件的接口部分,包含该头文件,并且调用接口的cpp文件,都需要重新编译 c、修改h文件的实现部分,包含该头文件,并且需要知道头文件中的类占有多大空间的cpp文件,都需要重新编译。3、C++没有做到实现与接口完全分离,因为h文件有实现部分。为什么不做到接口与实现分离呢? 做不到,因为定义类的对象时,需要知道该类占有多大空间。4、因此,对于那些不需要知道类占有多大空间的cpp文件,当修改h文件的实现部分时,不需要重... 阅读全文
posted @ 2013-10-17 11:42 Andy Niu 阅读(353) 评论(0) 推荐(0) 编辑
复制控制
摘要:1、对于构造方法,如果没有声明任何一个构造方法,编译器会自动生成一个Default构造方法。2、对于Copy构造方法,Copy赋值操作符,析构方法,如果没有声明,编译器会自动生成相应的方法。3、如果不想使用编译器自动生成的构造方法,就明确表示拒绝。4、对于Copy构造方法和Copy赋值操作符,使用private禁止外部访问,为了避免成员方法和友元方法访问,对这类方法只声明,不定义,这样的话,到调用Copy构造或者Copy赋值的时候,就会导致link错误。 boost库中的nonecopyable,就是这样一个类,如果想让自己的类禁止copy构造和copy赋值,继承nonecopyable就O. 阅读全文
posted @ 2013-10-15 18:38 Andy Niu 阅读(241) 评论(0) 推荐(0) 编辑
static对象
摘要:1、static对象包括: global对象 namespace作用域下的对象 在class,function,file作用域内的static对象2、在方法内的static对象成为 local static对象,其他的称为non-local static对象。3、static对象只被初始化一次。 阅读全文
posted @ 2013-10-15 18:30 Andy Niu 阅读(475) 评论(0) 推荐(0) 编辑
面向对象的特征
摘要:1、把程序比喻成做一件事,面向过程编程:把这件事分成一个一个的小步骤,有一个全能类,做所有的事,可以使用所有的资源,按照步骤把事情做好。面向对象编程:把这件事分工,每个人做其中的一部分,大家协作把事情完成。2、面向对象的特征:抽象,封装,继承,多态。3、抽象:使用抽象类的引用指向具体对象,只需要接口。4、封装:自己的东西不允许别人访问,可以是代码模块化,隐藏内部的实现细节。5、继承:Is_A的关系,可以代码复用。6、多态:分为编译时多态和运行时多态。 a、编译时多态:分为过载和模版参数具现。过载:对于同名的方法,根据形参表的不同确定调用哪个方法。模版参数具现,在编译期,生成不同的模版方法或者. 阅读全文
posted @ 2013-10-15 18:26 Andy Niu 阅读(202) 评论(0) 推荐(0) 编辑
const 与过载
摘要:1、方法包括方法名,返回类型,形参表,修饰符。2、对于一个方法,const可以出现的地方有返回类型,形参表,和方法后(const成员方法)。3、返回类型的常量性(是否为const)不同,不能构成过载。为什么? 过载是编译时多态,也就是说,在编译的时候,已经确定下来调用哪个方法。对于又返回类型的方法,调用的时候,可能不处理返回值,这样的话,编译器就不知道该调用哪个方法了。4、我们知道,形参表不同可以构成过载。如果形参表相同,只是形参的常量性不同,能否构成过载? 形参为引用或者指针,可以构成过载,否则不能构成过载。为什么? 过载是编译时多态,必须在编译时确定调用哪个方法。 如果形参为引用或... 阅读全文
posted @ 2013-10-14 20:42 Andy Niu 阅读(274) 评论(0) 推荐(0) 编辑
#define 与 typedef
摘要:1、#define:预编译指令,在预编译的时候,进行文本替换。2、typedef:编译时处理,为类型取一个别名。3、#define与typedef的顺序是相反的,记住typedef就行了。typedef为类型取一个别名,前面是真名,后面才是别名。4、避免使用#define,因为#define只是简单的文本替换,替换后,会出现优先级,以及组合成其他的词,不可预知。 阅读全文
posted @ 2013-10-14 16:40 Andy Niu 阅读(157) 评论(0) 推荐(0) 编辑
避免“垃圾进,垃圾出”
摘要:在编写程序的时候,要避免“垃圾进,垃圾出”,解决的办法是:1、垃圾不准进2、垃圾进来,给出提示信息,并且设置一个合适的默认值。结合实际项目谈谈。在项目中,需要解析一个数据文件,这个数据文件是程序自动生成的。人工修改数据文件,设置无效或者错误的信息,这种情况太多,比如属性长度设置为string,或者负数。在解析数据文件的时候,对每一个属性的每一种错误情况,都要进行考虑,并且给出详细的错误说明,很难做到。就算做到了,也是很差劲的设计。因为,程序中充斥着大量这样的代码:判断有效性,给出错误提示,这样就掩盖了真正要做的重要事情。也就是说,垃圾进来,给出提示信息,不合适。那么怎么办呢?对于这种情况,人工 阅读全文
posted @ 2013-10-14 12:00 Andy Niu 阅读(902) 评论(0) 推荐(0) 编辑
C++ 声明与定义
摘要:一步一步讲起:1、C++程序生成可执行文件的过程:源文件(.cpp),经过预编译,生成编译单元;编译单元,经过编译,生成目标文件(.obj);目标文件,经过连接,生成可执行文件。2、预编译做的事情:对#include,#define进行文本替换。3、C++支持单独编译,也就是对每个编译单元进行单独编译。这就要求,编译单元是一个自包含的文件,也就是说,编译单元生成目标文件的时候,不需要其他的信息。因此,在编译单元内部,所有使用的东西,必须要有定义,或者有声明。定义的意思是:这个东西就放在这里,当然可以使用。声明的意思是:我有这个东西,但是这个东西放在其他地方,这样的话,就可以使用声明的东西了。4 阅读全文
posted @ 2013-10-13 09:33 Andy Niu 阅读(1805) 评论(0) 推荐(1) 编辑
篮球技术
摘要:经常打篮球,谈谈打篮球的心得。从程序员的角度,分析if(){做什么}else(){做什么}1、队友持球,我该怎么做? a、投篮准,跑出一个空位,示意队友把球传过来,然后投篮。 b、篮下有空档,空切篮下,接队友传球上篮。 c、为队友作掩护,队友进攻手段有:直接投篮,通过掩护摆脱防守队员上篮。当然这时候,我也可以掩护后跑开,队友把球传给我,我来进攻。2、自己持球,该怎么做? 运球时,不要低头,眼观球场上队友和对手的位置。一旦发现队友有好的机会,立即把球传过去。 主动寻找掩护,自己进攻。 注意:切记不能做这样的人:队友有好的机会,自己没有机会,还不肯传球,或者强行投篮。这种人很伤队友的心... 阅读全文
posted @ 2013-10-12 18:50 Andy Niu 阅读(336) 评论(0) 推荐(0) 编辑
C++ 构造方法
摘要:1、构造方法的作用是设置数据成员的初始值。2、定义一个类Person的实例person的时候,必定会调用Person的构造方法。调用构造方法分为两个步骤:第一步使用初始化列表,第二步在构造方法内部对成员赋值。3、对于初始化列表,肯定会执行。如果用户没有显式的调用,就会隐式的调用。然后才执行第二步,在构造方法内部赋值。4、对于初始化列表,对于隐式或者显式中没有初始化的成员,成员的取值取决于下面的情况: a、如果成员是类类型,使用默认构造方法。(注:对于这种情况,必须保证成员具有默认构造方法) b、如果是内置类型,分为下面两种情况: b1、person是全局变量,初始化为0 b2、... 阅读全文
posted @ 2013-10-12 16:57 Andy Niu 阅读(881) 评论(0) 推荐(0) 编辑
C++ 中特殊的用法
摘要:1、反斜杠 a、转义字符 b、强制换行,当一行代码很长时,在这一行中间加上反斜杠,分成两行,反斜杠前后不能有空格。在预编译的的时候,会合成一行。2、String^ 表明String是一个托管类型的指针,不需要人工释放,GC会做这件事。3、调用方法的时候在方法前加上(void) 编码规范往往要求:方法的返回值必须被处理。如果没有被处理,静态检查工具,会给出警告。通过在调用方法时在前面加上(void),明确告诉静态检查工具,不是我忘了处理方法的返回值,而是确实不需要处理方法的返回值。这里其实包括了,a、方法没有返回值,b、我就是不想处理方法的返回值。 阅读全文
posted @ 2013-10-12 16:27 Andy Niu 阅读(435) 评论(0) 推荐(0) 编辑
Antlr与Regex
摘要:Antlr与Regex都是文本分析工具。Antlr内部分为词法(Lexer)和语法(Parser),在Antlr中,变量第一个字符大写表示词法,变量第一个字符小写表示语法。词法表示哪些是有效的词,语法表示有效的词怎么样组合才是有效的,延伸一点就是语义,语义表示描述的内容是否正确,涉及到人工智能。Antlr明确表明了哪些是词法,哪些是语法。Regex好像把词法语法合在了一起,可以认为每一个小块是一个词法,这些小块的顺序组合是语法。 阅读全文
posted @ 2013-10-12 16:20 Andy Niu 阅读(390) 评论(0) 推荐(0) 编辑
c_str()
摘要:1、c_str() 是string的一个方法,返回指向const char的指针,该指针不能修改指向的内容。2、为什么要用c_str()?因为有些地方需要用char指针,比如以char指针作为形参的方法。3、为什么可以用文本常量的字符串赋值给char指针,却不能用字符串变量赋值给char指针?1 char * cp1 = "hello"; // OK2 3 string str = "hello";4 5 cp1 = str; // Error,无法从“std::string”转换为“char *”View Code 文本常量字符串赋值给char指针,做 阅读全文
posted @ 2013-10-12 16:00 Andy Niu 阅读(566) 评论(0) 推荐(0) 编辑
C++ 友元
摘要:1、为什么要使用友元?面向对象的4个特征:继承,封装,多态,抽象。对于封装,也就是类的私有成员只有成员方法才可以访问。但是某种情况下,其他方法迫切需要访问类的私有成员,为了解决这个问题,C++开了一个窗户,通过定义方法为友元方法可以访问类的私有成员。2、友元方法不是当前类的成员方法,但是可以访问当前类的私有成员。3、如何使用?在一个类中,声明一个方法为它的友元方法,这个方法可以是普通方法,也可以是其他类的成员方法。4、延伸--友元类在一个类A中,声明一个方法Func为类A的友元方法,则Func可以访问类A的私有成员。那么,在一个类A中,声明类B为类A的友元类,则类B就可以访问类A的私有成员。 阅读全文
posted @ 2013-10-11 20:41 Andy Niu 阅读(360) 评论(0) 推荐(0) 编辑
C++ 操作符重载
摘要:1、为什么要使用操作符重载?操作符和方法在本质上一样,使用操作符更符合人性化的描述。2、操作符重载分为 普通操作符重载和成员操作符重载,区别在于: a、普通操作符重载要访问对象的私有成员,因此要设计为friend,而成员操作符重载不需要; b、相比于普通操作符重载,成员操作符重载,少了一个形参,因为成员方法总是与对象绑定使用的,被绑定的对象就是操作符的第一个参数;示例代码: 1 #include "StdAfx.h" 2 3 class Point 4 { 5 private : 6 int x; 7 int y; 8 9 public :10 Point ()... 阅读全文
posted @ 2013-10-11 19:59 Andy Niu 阅读(290) 评论(0) 推荐(0) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示