日志标签 ‘C++’

C++的GC要标准化??噩梦还是福音?

2007年7月30日

CSDN上的这篇文章如是说。
http://blog.csdn.net/g9yuayon/archive/2007/07/23/1702694.aspx

C++还能重新辉煌吗?C++复杂性的思考

2007年7月18日

转载,作者不祥。原出处不祥。

  C++的表面困境来自两方面,一是开发效率低,而是容易犯错,维护难度大。此二者俱是表象,本质就是一个——过度复杂。或有人说C++之关键缺陷是没有统一完整的类库支撑,Bjarne Stroustrup即强调此因素。然而这其实只不过是一个结果,而不是原因。正是因为语言太复杂,才无法在有效期内开发出高质量的大一统的类库。

  C++的复杂,并非是其体积庞大之必然结果。复杂是对结构混乱无序程度的描述,规模大,结构不见得必然复杂。

  C++的复杂,也并不是如很多人所认为,是若干种编程范式(paradigms)的并存而至。事实上,现代实用编程语言至少有2-3种范式才能登大雅之堂。以范式数量论,Python和Ruby等新型动态语言的范式甚至多于C++,然而它们却以简单和开发效率高著称。

  C++复杂的根源在于三大约束:与C的完全兼容、静态类型检查、最高性能。在 » 阅读更多: C++还能重新辉煌吗?C++复杂性的思考

JAVA的语法 VS C#语法

2006年6月4日

个人感觉更喜欢C#的语法,比如getter和setter,namespace的代码组织方式,“继承”和“实现”直接使用“:”而不是使用关键字“extens”和“implements”。


还有C#没有所谓的包的概念,所以不在乎代码放在什么地方。


C#没有所谓默认访问权限。在C#中默认的就是public,而java在没有访问控制描述时,访问权限限制在包内,是一种区别于private、protected、public三种标准权限的另一种访问权限。


JAVA给人的感觉是虽然很强大,但是从美感方面总是有些瑕疵,比如JAVA的各种包,重叠、凌乱、庞大,难以学习,C#基于.NET框架,就这么一个类库,结构清晰,易学,与Windows系统结合紧密。


很多时候,JAVA给人的感觉就像是在一个光洁完美的表面上安装上一个丑陋的螺丝钉,虽然系统更加坚苦了,但是美感无存。而C#的完美无暇就像一个仙女,清新纯洁,让人恋恋不舍。

cgic:为C语言编写CGI的C函数库

2005年11月20日
CGIC介绍
怎样写CGIC应用程序
怎样产生图片在CGIC中?
CGI调试特征: 利用捕获
cgic函数参考
CGIC介绍
怎样写CGIC应用程序
怎样产生图片在CGIC中?
CGI调试特征: 利用捕获
cgic函数参考
cgic变量参考
cgic结果编码参考
cgic快速索引
» 阅读更多: cgic:为C语言编写CGI的C函数库

C语言测试:想成为嵌入式程序员应知道的0×10个基本问题

2005年11月5日

C语言测试是招聘嵌入式系统程序员过程中必须而且有效的方法。这些年,我既参加也组织了许多这种测试,在这过程中我意识到这些测试能为带面试者和被面试者提供许多有用信息,此外,撇开面试的压力不谈,这种测试也是相当有趣的。
从被面试者的角度来讲,你能了解许多关于出题者或监考者的情况。这个测试只是出题者为显示其对ANSI标准细节的知识而不是技术技巧而设计吗?这个愚蠢的问题吗?如要你答出某个字符的ASCII值。这些问题着重考察你的系统调用和内存分配策略方面的能力吗?这标志着出题者也许花时间在微机上而不上在嵌入式系统上。如果上述任何问题的答案是”是”的话,那么我知道我得认真考虑我是否应该去做这份工作。
从面试者的角度来讲,一个测试也许能从多方面揭示应试者的素质:最基本的,你能了解应试者C语言的水平。不管怎么样,看一下这人如何回答他不会的问题也是满有趣。应试者是以好的直觉做出明智的选择,还是只是瞎蒙呢?当应试者在某个问题上卡住时是找借口呢,还是表现出对问题的真正的好奇心,把这看成学习的机会呢?我发现这些信息与他们的测试成绩一样有用。
有了这些想法,我决定出一些真正针对嵌入式系统的考题,希望这些令人头痛的考题能给正在找工作的人一点帮住。这些问题都是我这些年实际碰到的。其中有些题很难,但它们应该都能给你一点启迪。C语言测试:想成为嵌入式程序员应知道的0×10个基本问题
?

» 阅读更多: C语言测试:想成为嵌入式程序员应知道的0×10个基本问题

static和volatile的用法

2005年11月5日

?volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
» 阅读更多: static和volatile的用法

struct用法深入探索

2005年11月2日

C#
一.类与结构的示例比较:
结构示例:

public struct Person
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
}

类示例:

public class TestTime
{
int hours;
int minutes;
int seconds;
public void passtime()
{
//implementation of behavior
}
}

调用过程:

public class Test
{
public static ovid Main
{
Person Myperson=new Person //声明结构
TestTime Mytime=New TestTime //声明类
}
}
» 阅读更多: struct用法深入探索

学习C++预备知识—程序的内存分配

2005年10月31日

一个由c/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 – 程序结束后有系统释放
» 阅读更多: 学习C++预备知识—程序的内存分配

virtual base

2005年10月23日

#include 
using namespace std;
class base{
public:
 void isa()[code]#include 
using namespace std;
class base{
public:
 void isa()
 {
  cout<<"base\n";
 }
};
class son:virtual base{
public:
 void isa()
 {
  cout<<"son\n";
 }
};
int main()
{
 son s;
 s.isa();
 base *b;
 b=(base *)&s;
 b->isa();
 system("pause");
}


输出:
son
base

说明使用virtual派生控制跟虚函数是没有什么关系的,基类的一般函数不会因为派生为虚基类就自动编程虚函数。

虚析构函数VS内存泄漏

2005年10月18日

如果基类的析构函数定义为虚析构函数,则派生类的析构函数就会自动成为析构函数。

如果为基类和派生类的对象分配了动态内存,或者为派生类的对象成员分配了动态内存,则一定要将基类和派生类的析构函数定义为虚析构函数,否则便可能造成内存泄漏,导致操作系统出现内存保护错误。
——摘自《C++程序设计实践教程》 马光志 武汉:华中科技大学出版社 2001年2月
如果基类的析构函数定义为虚析构函数,则派生类的析构函数就会自动成为析构函数。

如果为基类和派生类的对象分配了动态内存,或者为派生类的对象成员分配了动态内存,则一定要将基类和派生类的析构函数定义为虚析构函数,否则便可能造成内存泄漏,导致操作系统出现内存保护错误。
——摘自《C++程序设计实践教程》 马光志 武汉:华中科技大学出版社 2001年2月

我猜测,之所以要将基类的析构函数定义为虚函数,是为了多态析构的时候能实际上调用派生类的析构函数,而派生类析构函数的调用又会自动调用基类的析构函数,这样派生类和基类都析构了。
如果基类析构函数不定义为虚函数,那么当用基类指针pbase指向派生类时,delete pbase,就会只调用基类的析构函数,派生类析构函数没有被调用,导致内存泄漏。