2013年10月22日
摘要:
1、使用C#语言,比较简单,使用私有的构造方法和公有的静态方法返回静态实例。在C#中,赋值的时候,基本类型是整体拷贝,引用类型是复制引用。2、使用C++语言,有几个地方需要注意: a、编译器会自动生成copy构造方法和copy复制操作符,从而导致生成多个实例。为了解决这个问题,声明私有的copy构造方法和copy复制操作符,但是不定义。通过继承noncopyable是个好办法,noncopyable中声明了私有的copy构造和copy赋值,并且构造方法是protected。子类会继承父类的所有成员,只不过是不能访问父类的私有成员。 b、静态构造方法返回引用没有问题,如果返回指针,需要考虑什..
阅读全文
posted @ 2013-10-22 18:28
Andy Niu
阅读(277)
推荐(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
阅读(2135)
推荐(0)
2013年10月21日
摘要:
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
阅读(1107)
推荐(0)
摘要:
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
阅读(322)
推荐(0)
2013年10月18日
摘要:
1、函数指针指向一类函数,这类函数的类型一样,也就是函数的返回类型和形参表一样。2、不同的函数类型要使用不同的函数指针,才能指向它,有没有好的办法呢? 类比思考下,交换方法,对不同的类型要写不同的swap方法,解决的办法是使用泛型,对于特定的类型编译器会生成特定的swap方法。同样道理,function是泛型的函数指针,使用特定的函数类型就能生成特定的函数指针。3、bind返回一个方法,把方法和实参绑定一起。4、函数指针可以指向bind返回的方法,在调用时,传递实参。但是,由于bind已经绑定了实参,导致函数指针调用的时候,实参传不进去。解决办法是:bind的时候使用占位符,_1,_2,这样.
阅读全文
posted @ 2013-10-18 17:13
Andy Niu
阅读(367)
推荐(0)
2013年10月17日
摘要:
1、平时使用的方法都是同步方法,也就是该方法执行完毕,才能往下执行。 2、如何实现异步呢? 实现异步的办法:通过创建一个新的线程,线程接收一个同步方法,启动线程,执行方法上的操作。 3、异步方法是如何实现的呢? 在异步方法内,创建一个线程,该线程接收一个同步方法,启动线程。 4、异步方法有一个问题,
阅读全文
posted @ 2013-10-17 18:11
Andy Niu
阅读(2800)
推荐(0)
摘要:
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
阅读(359)
推荐(0)
2013年10月15日
摘要:
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
阅读(245)
推荐(0)
摘要:
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
阅读(480)
推荐(0)
摘要:
1、把程序比喻成做一件事,面向过程编程:把这件事分成一个一个的小步骤,有一个全能类,做所有的事,可以使用所有的资源,按照步骤把事情做好。面向对象编程:把这件事分工,每个人做其中的一部分,大家协作把事情完成。2、面向对象的特征:抽象,封装,继承,多态。3、抽象:使用抽象类的引用指向具体对象,只需要接口。4、封装:自己的东西不允许别人访问,可以是代码模块化,隐藏内部的实现细节。5、继承:Is_A的关系,可以代码复用。6、多态:分为编译时多态和运行时多态。 a、编译时多态:分为过载和模版参数具现。过载:对于同名的方法,根据形参表的不同确定调用哪个方法。模版参数具现,在编译期,生成不同的模版方法或者.
阅读全文
posted @ 2013-10-15 18:26
Andy Niu
阅读(212)
推荐(0)