
C++
文章平均质量分 76
SzMing
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
struct和class的区别
1.struct 是值类型,class是对象类型2.struct 不能被继承,class可以被继承3.struct 默认的访问权限是public ,而class 默认的访问权限是private .4.struct 不能由程序员申明构造函数,即使是默认(不带参数)的构造函数,同样也不能有析构的处理部分。这是因为struct 的构造函数是由编译器自动生成的。并且struct 的转载 2012-10-14 18:27:48 · 757 阅读 · 0 评论 -
内存操作
对内存操作的考查主要集中在: (1)指针的理解; (2)变量的生存期及作用范围; (3)良好的动态内存申请和释放习惯。 找错题: 试题4: void GetMemory( char *p ) { p = (char *) malloc( 100 ); } void Test( vo转载 2012-10-14 18:42:11 · 435 阅读 · 0 评论 -
以对象管理资源
例:假设我们使用一个用来塑模投资行为(例如股票、债券等等)的程序库,其中各式各样的投资类型继承自一个root class Investment::class Investment { ... }; //"投资类型"继承体系中的root class进一步假设,这个程序库系通过一个工厂函数(factory function ) 供应我们某转载 2012-10-14 18:48:50 · 536 阅读 · 0 评论 -
const
关键字const 多才多艺。你可以用它在classes 外部修饰global 或namespace作用域中的常量,或修饰文件、函数、或区块作用域(block scope) 中被声明为static 的对象。你也可以用它修饰classes 内部的static 和non-static 成员变量。面对指针,你也可以指出指针自身、指针所指物,或两者都(或都不〉是const:char greeting转载 2012-10-14 18:54:18 · 941 阅读 · 0 评论 -
函数模板
#includetemplate void func(const int &t){ cout<<t+100<<endl;}templatevoid func(const T &t){ cout<<t<<endl;}int main(){ func(10.3); func(1000); return 0;}程序转载 2012-10-14 18:26:45 · 430 阅读 · 0 评论 -
extern语句
为什么标准头文件都有类似以下的结构? #ifndef __INCvxWorksh #define __INCvxWorksh #ifdef __cplusplus extern "C" { #endif /*...*/ #ifdef __cplusplus } #endif #endif /* __INCvxWor转载 2012-10-14 18:39:16 · 872 阅读 · 0 评论 -
strcpy 函数
一、自己编写一个标准strcpy函数:char*strcpy(char*str_dst,const char*str_org) { assert( (strDest != NULL) && (strSrc != NULL) ); char *address = strDest; while( (*strDest++ = * strSrc转载 2012-10-14 18:42:59 · 504 阅读 · 0 评论 -
若不想使用编译器自动生成的函数,就该明确拒绝
通常如果你不希望class 支持某一特定机能,只要不声明对应函数就是了。但这个策略对copy 构造函数和copy assignment 操作符却不起作用,如果你不声明它们,而某些人尝试调用它们,编译器会为你声明它们。 这把你逼到了一个困境。如果你不声明copy 构造函数或copy assignment 操作符,编译器可能为你产出一份,于是你的class 支持copying 。转载 2012-10-14 18:49:41 · 417 阅读 · 0 评论 -
VC如何改变编辑框的背景颜色方法
这里介绍的改变文本编辑框的背景颜色的方法不需要对CEdit生成新的类,步骤如下:(1) 新建一个基于对话框的MFC应用程序,程序名称为Test;(2) 在对话框上添加两个文本框,ID分别为IDC_EDIT1和IDC_EDIT2;(3) 在CTestDlg的头文件中添加几个成员变量,如下所示;class CTestDlg : public CDialog{protecte转载 2012-10-14 18:47:16 · 846 阅读 · 0 评论 -
对象使用之前初始化
读取未初始化的值会导致不明确的行为。在某些平台上,仅仅只是读取未初始化的值,就可能让你的程序终止运行。更可能的情况是读入一些"半随机"bits ,污染了正在进行读取动作的那个对象,最终导致不可测知的程序行为,以及许多令人不愉快的调试过程。 永远在使用对前先将它初始化。一、对于无任何成员的内置类型,你必须手工完成此事。例如:int x = 0;转载 2012-10-14 18:53:33 · 950 阅读 · 0 评论 -
函数重载与重复声明
一个函数在一个特定的域中被多次声明时,编译器解析第二个及后面函数依照下面步骤:1.参数个数或类型不同,则认为是重载 // 重载函数 void print( const string & ); void print( vector & );2.函数返回类型和参数表完全相同,则认为第二个函数是第一个函数的重复声明 参数表的比较过程与参数名无关3.如果两个函数的参数表相同转载 2012-10-14 18:21:34 · 798 阅读 · 0 评论 -
运算符优先级 计算 a^b << 2
计算 a^b 答案: 运算符优先级: 括号,下标,->和.(成员)最高; 单目的比双目的高; 算术双目的比其他双目的高; 位运算(左移、右移) 高于 关系运算; 关系运算 高于 按位运算(与,或,异或); 按位运算 高转载 2012-10-14 18:30:46 · 1111 阅读 · 0 评论 -
运算符重载
可以被重载的操作符:+-*/%^&|~!,=>>=++-->>==!=&&||转载 2012-10-14 18:32:02 · 627 阅读 · 0 评论 -
字符串、string对象、字符串字面值的区别
一、字符串字面值字符串字面值是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。字符串没有变量名字,自身表示自身"Hello World!" //simple string literal"" //empty string literal"\nCC\toptions\tfile.[c转载 2012-10-14 18:46:21 · 2391 阅读 · 1 评论 -
对象数组和指向对象的指针 指向类成员的指针
1 对象数组 对象数组是指数组元素为对象的数组。这种对象数组与其它数据类型的数组定义方式相同。如: X a[10]; 它创建了一个对象数组a,有10个数组元素,每个数组元素a [i]都是一个对象,所以,需要10次调用构造函数。 C++语言不允许初始化对象数组,所以要创建一个类的对象数组,这个类必须具备以下三个条件转载 2012-10-15 17:01:12 · 2250 阅读 · 0 评论 -
静态成员 内联成员函数 const对象和const成员函数
1 静态成员 static数据成员 (1) static数据成员属于类,而不属于对象; (2)static数据成员也是具有访问限制的; 在类外只能访问公有的static数据成员,且访问方式为: 类名::static公有数据成员 在类内可以访问所有的static数据成员,采用直接访问的转载 2012-10-15 17:02:00 · 493 阅读 · 0 评论 -
纯虚函数及抽象类
一、 纯虚函数 纯虚函数是一个在基类中声明的虚函数,它在该基类中没有定义,要求任何派生类都必须定义自己的版本。 一般格式如下: class 类名> { virtual 类型>函数名>(参数表>)=0; … };注意: 1、 纯虚函数没有函数体; 2、 最后面的“=0”转载 2012-10-15 17:03:30 · 618 阅读 · 0 评论 -
C++之父元旦专访(8+13个问题,关于C++的学习&使用和未来)
临近元旦的一个月,Bjarne在通信中答应接受一次访谈。高兴之余,为访谈的问题犯了难,我不想做成一个个人的访谈;我希望这次访谈能够代表更多的人,最好能够代表国内C++社群的一些典型的声音,同时我也希望问题是经过深思熟虑的,由真正了解C++的人提出。所以,当时我便在blog里面放了一个问题召集的声明,并在TopLanguage讨论组上置顶了一个帖子。向大伙征集好问题。一个月后我们有了一个问题集,转载 2012-10-15 19:30:58 · 1099 阅读 · 0 评论 -
多重继承构造函数执行顺序
class 派生类名:继承方式1 基类名1,继承方式2 基类名2,....{ //派生类成员定义};对每个基类可以用不同的继承方式,默认继承方式为private。 在多重继承中,派生类的构造函数与单继承下派生类构造函数相似,它必须负责该派生类所有基类构造函数以及对象成员(如果有的话)构造函数的调用。同时,派生类的参数必须包含完成所有基类、对象成员以及派生类中新增数转载 2012-10-15 17:04:18 · 2210 阅读 · 0 评论 -
如何将4个字节的int转为1个字节的BYTE?
int i=0x00000001;要取得最后一个字节的0x01?BYTE ret;BYTE *ptr;ptr=(BYTE*)(&i);ret=*ptr; //小端内存#####################################以下内容为转载x的高字节存放到x_high,把低字节x_lowint x=12345;转载 2012-10-15 17:06:04 · 1279 阅读 · 0 评论 -
sizeof用法
(1)计算一个结构体的sizeof时,要注意内存对齐原则: 1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。转载 2012-10-15 17:09:49 · 573 阅读 · 0 评论 -
堆 栈 区别
一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(stati转载 2012-10-15 13:47:13 · 400 阅读 · 0 评论 -
构造函数与虚析构函数
1. 构造函数 因为在派生类中构造函数是不能继承的,也没有重定义的必要。在构造函数中调用虚函数将破坏动态绑定逻辑。下面的例子说明了这样动态绑定逻辑。例: #include class base { protected: int x; public: base (int m)转载 2012-10-15 17:02:42 · 442 阅读 · 0 评论 -
多重继承
在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性。 由此我们不难想出如下的图例与代码:当一个派生类要使用多重继承的时候,转载 2012-10-15 17:07:38 · 605 阅读 · 0 评论 -
什么是虚继承?虚基类?
虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况:A A\ / B C \ / D而类D中会出现两次A。为节省内存空间,可以将B、C对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如下图所示情况:转载 2012-10-15 17:08:57 · 838 阅读 · 0 评论 -
重载与覆盖的区别,覆盖与隐藏的区别
重载与覆盖的区别1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。3、覆盖要求参数列表相同;重载要求参数列表不同。4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。转载 2012-10-15 17:11:01 · 640 阅读 · 0 评论 -
偷梁换柱——揭开多态的面纱
多态是面向对象理论中的重要概念之一,从而也成为现代程序设计语言的一个主要特性,从应用角度来说,多态是构建高灵活性低耦合度的现代应用程序架构所不可忽缺的能力。从概念的角度来说,多态使得程序员可以不必关心某个对象的具体类型,就可以使用这个对象的“某一部分”功能。这个“某一部分”功能可以用基类来呈现,也可以用接口来呈现。后者显得更为重要——接口是使程序具有可扩展性的重要特性,而接口的实现依赖于语言对多态转载 2012-10-15 19:24:51 · 439 阅读 · 0 评论 -
学习C++:实践者的方法
前言 我的blog以前很长一段时间关注的都是C++中的技术&细节,乃至于读者和应者都寥寥。然而5月份的时候写的一篇“你应当如何学习C++”,阅读量却达到了3万多,在blog上所有文章中却是最高的(且远远超过了第二位);评论数目也有一百多。为什么独独这篇能够激起这么多的回应,想必是国内的C++社群被C++压抑太久,或者,严格来说,是被C++的教育方式压抑太久。实际上,不管是在各大国内论坛上,还是转载 2012-10-15 19:29:17 · 1165 阅读 · 0 评论 -
你应当如何学习C++(以及编程)
Javascript是世界上最受误解的语言,其实C++何尝不是。坊间流传的错误的C++学习方法一抓就是一大把。我自己在学习C++的过程中也走了许多弯路,浪费了不少时间。 为什么会存在这么多错误认识?原因主要有三个,一是C++语言的细节太多。二是一些著名的C++书籍总在(不管有意还是无意)暗示语言细节的重要性和有趣。三是现代C++库的开发哲学必须用到一些犄角旮旯的语言细节(但注意,是库设计,转载 2012-10-16 16:22:56 · 989 阅读 · 0 评论 -
为什么C++(来自C++之父的观点)
注:9月份的时候写了一篇“Why C++”(翻译版见这里)。后来我把文章发给Bjarne,问问他的意见。Bjarne友好的对文章作了详细的评点并发回给我,我问他能不能把他的评点版发到blog上,他说原先发给我的评点比较随意,答应给我单独写一篇友情评注,也就是下面这篇。 在后来的邮件交流中,我又问了Bjarne一些C++问题,并得知Bjarne的新书将会在夏季出版,在我们的交流中我曾问起转载 2012-10-16 17:41:35 · 625 阅读 · 0 评论 -
泛型编程:源起、实现与意义
为什么泛型泛型编程(Generic Programming)最初提出时的动机很简单直接:发明一种语言机制,能够帮助实现一个通用的标准容器库。所谓通用的标准容器库,就是要能够做到,比如用一个List类存放所有可能类型的对象,这样的事情;熟悉一些其它面向对象的语言的人应该知道,如Java里面这是通过在List里面存放Object引用来实现的。Java的单根继承在这里起到了关键的作用。然而单根继承对转载 2012-10-16 17:50:08 · 605 阅读 · 0 评论 -
C++标准库的一个有趣的小bug
在看别人的代码时,意外发现了一个标准库的问题(不知到标准委员会的c++ standard lib.core issue文件里有没有提到,不管它),是这样的,代码如下:struct X{};ostream& operator{ ^^^^ ---- #1 non-con转载 2012-10-16 16:24:37 · 878 阅读 · 0 评论 -
关于C++0x内存模型和序列点的一些思考
这几天断断续续一直在看关于C++0x的并发内存模型的proposal,这堆proposal显然是所有0x proposals里面最困难的。看的时候问题不断,单单是对原始单线程内存模型的改进和序列点概念的精化就非常tricky。所以看的时候总结了一些模糊的地方,昨天给发到comp.lang.c++.moderated上面去了,Francis Glassborow给了一个回贴澄清了里面的一个问题,转载 2012-10-18 12:39:37 · 542 阅读 · 0 评论 -
C++良好代码风格之我见 - 兼谈boost的工程实用价值
TopLanguage上,一个关于“boost的理念和工程实用价值”的讨论(http://groups.google.com/group/pongba/browse_thread/thread/7501f6ff39b7ff0)吸引了很多人。我这里谈谈我的看法。 无疑,boost是很优秀的库(确切的说,是库的集合)。但是我在介绍我的StdExt库的来由时,曾经毫不客气的说,boost 走错了转载 2012-10-18 12:47:30 · 713 阅读 · 0 评论 -
C++内存管理变革(5)
引言在前文,我们引入了GC Allocator(具备垃圾回收能力的Allocator),并提供了一个实作:AutoFreeAlloc(详细内容参见《C++内存管理变革(2):最袖珍的垃圾回收器 - AutoFreeAlloc》)。但是,如前所述,AutoFreeAlloc是有其特定的适用环境的(它对内存管理的环境进行了简化,这种简化环境是常见的。详细参阅《C++内存管理变革(3):另类转载 2012-10-18 13:03:54 · 557 阅读 · 0 评论 -
C++11(及现代C++风格)和快速迭代式开发
过去的一年我在微软亚洲研究院做输入法,我们的产品叫“英库拼音输入法” (下载Beta版),如果你用过“英库词典”(现已更名为必应词典),应该知道“英库”这个名字(实际上我们的核心开发团队也有很大一部分来源于英库团队的老成员)。整个项目是微软亚洲研究院的自然语言处理组、互联网搜索与挖掘组和我们创新工程中心,以及微软中国Office商务软件部(MODC)多组合作的结果。至于我们的输入法有哪些创新的fe转载 2012-10-19 11:13:44 · 948 阅读 · 0 评论 -
Windows多线程与对话框
Windows的对话框是获取信息输入的主要手段,增加线程则是获得更好UI响应的重要方式。由于Windows在处理对话框时进行线程调度的特殊性,如果不对此加以特别注意,增加线程可能不能带来UI响应的改善。1 跨线程创建对话框1.1 需求有这样的应用场景:创建非模态对话框后需要马上做些耗时的工作,而同时又希望能够立刻在对话框上操作,所以,希望让非模态对话框工作在单转载 2012-10-19 11:52:21 · 1175 阅读 · 0 评论 -
C++中的求值|副作用|序列点所导致的模糊语义
前一阵子一个偶然的机会,在soloist的blog上(http://blog.youkuaiyun.com/soloist)看到一篇关于C/C++中的一个十分历史悠久的问题的讨论,即表达式求值的问题。说实话这个问题着实不新鲜了,被所有论坛提出过无数次,无非就是表达式求值顺序不确定的问题嘛。所以我也就没太在意,soloist那里吵翻了天,说什么的都有,热闹非凡。当时我就当复习一下,想看看标准对这一块到底有什转载 2012-10-18 12:37:59 · 525 阅读 · 0 评论 -
C++0x展望[语言核心进化]
随着C++标准委员会案头的C++0x提案[1]的与日俱增,tr1[2]的尘埃落定,tr2[3]的浮出水面,C++0x的脚步声似乎是离我们越来越近了,近到我们似乎能够嗅到她的气息,Bjarne Stroustrup在CUJ上发表的一篇文章『The Design of C++0x』[4]高屋建瓴地指出了C++0x的精神,指出了哪些东西可以进入标准,哪些东西应该慎重考虑,哪些东西是迫切需要的。尽转载 2012-10-18 12:40:52 · 777 阅读 · 0 评论 -
C++内存管理变革(4)
这篇文章拖的有点久了。NeutralEvil 在3个月之前就在催促我继续写了。只是出于WinxGui完整性的考虑,我一直在刻意优先去补充其它方面的文章,而不是让人去误会WinxGui是一个内存管理库了。:)言归正传。我们在内存池(MemPool)技术详解已经介绍了boost::pool组件。从内存管理观念的变革来看,这是是一个传统的MemPool组件,尽管也有一定的改进(但只是性能上的改进)。转载 2012-10-18 13:02:44 · 765 阅读 · 0 评论