随笔(2014.10)

1. dynamic_cast 使用的时候,类继承关系B继承自A,C继承自B,那么A可以dynamic_cast为B也可以dynamic_cast为C。

 

2. 一些情况会有模板和多态都可以适用的情况,一般来说使用模板的效率会高于多态,模板是编译器决定,而多态是运行时候决定,但是使用模板从代码书写和使用上都回比多态复杂,而且如果开始使用模板,后面涉及到继承的地方都要使用模板,代码影响较大。http://blog.csdn.net/fullsail/article/details/7804033

 

3. http://www.boost.org/doc/libs/1_43_0/libs/test/doc/html/tutorials/intro-in-testing.html 为什么需要单元测试

This approach leads to a layered system of testing, that is similar to the layered approach to original development and should be integrated into it. When writing a program, the design is factored into small units that are conceptually and structurally easier to grasp. A standard rule for this is that one unit performs one job or embodies one concept. These simple units are composed into larger and more complicated algorithms by passing needed information into a unit and receiving the desired result out of it. The units are integrated to perform the whole task. Testing should reflect this structure of development.

A programmer who can't devise good tests for a unit does not yet know the problem at hand well enough to program dependably.
This is the point in development where proper unit testing really shines. If each unit is doing what it should be doing and not creating unexpected side effects, any issues in testing a set of integrated units must come from how they are passing information. Thus, the nearly intractable problem of finding an error while many units interact becomes the less intimidating problem of finding the breakdown in communications.

boost的单元测试与gtest的差不多,提供了一些常用的宏,需要单独的main函数,可以输出xml的结果。

 

4. dump文件分析工具可以使用windbg,但是一般的服务器应用程序传统上使用日志来调试bug(why?),而dump文件多用于写驱动的人调试,写驱动的经常就蓝屏了调试不方便,在程序崩溃后不会自动生成dmp文件。有很多工具可以手动生成dmp文件来调试程序。MiniDumpWriteDump 这个win32 api 可以让程序挂掉的时候自动保存dump文件。

 

5.如果所有的dll文件使用都需要有lib文件,为什么windows里面使用时候没有lib呢?缺少dll时候从网上下载一个就可以了

 

6.当把一个派生类对象赋值给一个基类的对象时。通常,derived object要比base object大些。。所以derived object对象中的一些特殊信息会丢失,不再展现base object的特殊性,这称为object slicing.object slicing中,最重要的一点就是,base object中的vptr不能指向derived object接手过来的virtual table.这时,编译器会介入其base class的copy constructor和assignment.明确指定base object的vptr指向base class的virtual table.而不是从右边的derived object中把vptr值拷贝过来。

 

7.《C++ 工程实践(8):值语义》http://www.cppblog.com/Solstice/default.html?page=3
“C++ 的 class 本质上是值语义的,这才会出现 object slicing 这种语言独有的问题,也才会需要程序员注意 pass-by-value 和 pass-by-const-reference的取舍。在其他面向对象编程语言中,这都不需要费脑筋。”“编译器会为 class 默认生成 copy constructor 和 assignment operator。其他语言没有 copy constructor 一说,也不允许重载 assignment operator。C++ 的对象默认是可以拷贝的,这是一个尴尬的特性。 ”

以前一直奇怪,设计模式中的原子模式,这个模式不就是个拷贝构造函数么?Clone方法就是个拷贝构造,有什么特别的呢,有什么必要整个“模式”的大帽子么?现在才清楚原来一般的语言是没有什么拷贝构造函数,这样说来这个模式存在还是有意义的。

从“面向对象”的角度来说,对象应该是默认不可以拷贝构造的,大多数情况下,各个对象是不同的,可以拷贝构造的情景毕竟是很少的,例如一个TcpConnection,拷贝一个这样的对象,系统也不会增加一个Connection,即使多了一个Connection,那么句柄肯定也是不一样的,并不是真正的拷贝。但是c++为了类的设计可以与c语言中保持一致,让类使用起来更像基本数据类型,提供了默认的拷贝构造函数,所以陈硕才说“C++ 的对象默认是可以拷贝的,这是一个尴尬的特性”。其他语言例如java默认的都是引用语义,但“尴尬”不能说是不好,大多数情况下值语义的对象生命周期很好处理。而且这样处理c++的性能也会有相应的提高,更接近c语言,在类的布局上更加的紧凑。

 

8. http://www.2cto.com/kf/201108/101175.html 作者分析了数据抽象这一概念,“另外,一个 ADT 可以隐藏其实现细节,比方说 stack 既可以用动态数组实现,又可以用链表实现。按照这个定义,数据抽象和基于对象(object-based)很像,那么它们的区别在哪里?语义不同。ADT 通常是值语义,而 object-based 是对象语言。(这两种语义的定义见前文《C++ 工程实践(8):值语义》)。ADT class 是可以拷贝的,拷贝之后的 instance 与原 instance 脱离关系。”

“本文把 data abstraction、object-based、object-oriented 视为三个编程范式。这种细致的分类或许有助于理解区分它们之间的差别。庸俗地讲,面向对象(object-oriented)有三大特征:封装、继承、多态。而基于对象(object-based)则只有封装,没有继承和多态,即只有具体类,没有抽象接口。它们两个都是对象语义。面向对象真正核心的思想是消息传递(messaging),“封装继承多态”只是表象。数据抽象与它们两个的界限在于“语义”,数据抽象不是对象语义,而是值语义。”

作者所说的从现实生活中理解可能比较容易,对象一般是独一无二的,各个对象都有自己的不同特性,所以一般意义上的对象是不可以拷贝赋值的,应该是对象语义(引用语义)。而数据抽象对应“数据”而不是“对象”,数据当然是可以拷贝的,可以分发传递给很多不同的对象。

 

9.“面向对象真正核心的思想是消息传递(messaging)”
http://blog.csdn.net/myan/article/details/5928531
http://cxwangyi.wordpress.com/2011/06/19/杂谈现代高级编程语言 王益

 

10.“C++要求凡是能够放入标准库的对象必须具有值语义”,因为标准库是抽象数据的类型的,在list a; list b=a;的时候,会调用拷贝构造函数,而且认为b与a拥有完全一样的数据,改变b不会影响到a。

 

16. Zero overhead 零开销原则
http://www.open-std.org/jtc1/sc22/wg21/docs/18015.html
http://www.aristeia.com/c++-in-embedded.html

 

17. C++为了兼容c语言付出了很大的代价,例如兼容C语言的隐式类型转换(例如整数类型提升)让C++的函数重载决议(overload resolution)规则(重载时候)无比复杂。而且class后面必须加个分号(因为c中int a;有分号为了使用一致。);

 

18. C++的一种典型缺陷是区分声明和定义,代码放到不同的文件中,可能出现不一致的情况。而java没有这个问题,不需要在java中使用函数原型声明,一个成员函数的参数列表只需要在代码里出现一次,不存在不一致的可能。java编译器也不受“单遍编译”的约束,调整成员函数的顺序不会影响代码的语义。java也没有笨重过时的文件包含机制二是有一套基于package的模块化机制。


19.由于inline函数的关系,C++源代码里面调用一个函数并不意味着生成的目标代码里面也会做一次真正的函数调用(可能看不到call命令),现代的编译器甚至聪明到可以自动判断一个函数是否适合inline,因此inline关键字在源文件中往往不是必须的。

 

20. 系统分层分层的依据就这一“层”上所具备的功能,例如变电站系统的“间隔层”里面的设备多是一些断路器等保护设备,有“间隔”上下设备的功能。

 

21.一致性测试旨在检验所实现的协议实体(或系统)与协议规范的符合程度(而验证则是检查形式化规范的内部一致性),即测试一个协议给定实现的外部行为是否符合协议的规范。
一致性测试是一种黑盒测试,他不涉及协议的内部实现,只是从外面的行为来判断协议的实现是否符合要求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值