C++
文章平均质量分 69
插入光盘即可
这个作者很懒,什么都没留下…
展开
-
const&volatile 与函数重载
首先要明确的概念:const&volatile关键字,可以用于实现函数重载。然而事情并不是像这句话看起来这么简单。首先,对于采用传值方式的参数,const &volatile 关键字无法区分参数类型,不具备实现函数重载的能力。如:void func (int a );void func (const int a);这两个函数声明会被编译器视为重复声明。 其次,对于采用指针和引用这两种原创 2007-08-13 04:08:00 · 1698 阅读 · 1 评论 -
local static对象和non-local static对象在初始化时机上的差异
C++中的static对象是指存储区不属于stack和heap、"寿命"从被构造出来直至程序结束为止的对象。这些对象包括全局对象,定义于namespace作用域的对象,在class、function以及file作用域中被声明为static的对象。其中,函数内的static对象称为local static 对象,而其它static对象称为non-local static对象。 这两者在原创 2007-09-08 06:38:00 · 7628 阅读 · 0 评论 -
三种继承方式与三种访问权限的相互组合
对基类进行继承时,三种继承方式下,基类的三种访问权限在子类中会有如何的变化这个问题,本科时上C++这门课的时候曾仔细的分析并弄得挺清楚,后来时间久了、用的也不多,慢慢的又变得心里不太有谱了。这次接着准备面试的契机,又重新仔细分析了一番,留个案底,以免再犯糊涂。三种访问权限 public:可以被任意实体访问 protected:只允许子类及本类的成员函数访问 pri原创 2007-09-09 22:04:00 · 9395 阅读 · 1 评论 -
由一个问题引发的思考
记不请是那个大哥的blog了,名字好像叫做“用了10年,才知道C++才懂了一点“。俺觉得这话说的太实在了,正如TAOUP中4.2节所言:”C++ is anti-compact—the languages designer has admitted that he doesnt expect any one programmer to ever understand it all.“原创 2008-02-18 21:49:00 · 2687 阅读 · 0 评论 -
How Non-Member Functions Improve Encapsulation ZZ
How Non-Member Functions Improve EncapsulationScott MeyersWhen it comes to encapsulation, sometimes less is more. Ill start with the punchline: If youre writing a function tha转载 2008-02-22 12:34:00 · 3121 阅读 · 0 评论 -
几条C Puzzle Problem中的为什么
发现了一个收集C puzzle的页面,挺有意思的,都看了一遍。除去那些常见的Marco、类型转换、printf格式符、指针和内存之类的常见puzzle外,我发现以下一个puzzle很是值得想一想。问题1The following program doesnt "seem" to print "hello-out". (Try executing it) #include stdio.原创 2008-03-01 11:26:00 · 2997 阅读 · 0 评论 -
容易被误解的inline
C++中的inline是个容易被误解的关键字,即使是专家也常会犯错。不信?请打开《Thinking in C++ 2rd Edition Volumn 1》,找到Chapter 9 "Inline Function"的Exercise 6:“Prove that inline functions default to internal linkage."为什么我说这里作者犯错了呢?因为C++原创 2008-03-02 14:50:00 · 4757 阅读 · 5 评论 -
C++:The One-Definition Rule
(注:本文翻译自《C++ template:the complete guide》的Appendix A)Appendix A. The One-Definition Rule 被亲切的称为ODR的One-Define-Rule是构建良好的C++程序的基础。ODR常见的表现形式很容易理解和使用:对non-inlinefunction在所有文件中保证只存在一处定义;对于类和内联函数,在翻译 2008-03-08 21:58:00 · 7856 阅读 · 4 评论 -
关于Stack unwinding
转点资料,用于备忘 @_@Stack unwinding (C++ only)When an exception is thrown and control passes from a try block to a handler, the C++ run time calls destructors for all automatic objects constructed sinc原创 2007-12-16 16:17:00 · 3498 阅读 · 3 评论 -
C++拾遗
因为C++实在是过于复杂了,时不时都会碰见一些晦涩的细节,因此特意发个帖子,留好位置,随时添加Item 1 前置声明 当不需要class A的完整定义而只需要其名称时,可以通过前置声明函数来避免包含class A对应的头文件,这样可以减少编译依赖关系 然而,需要注意的是,string和iostream不是类型名,而是typedef;由于标准不允许向std空间增加声明或定义,所以这原创 2008-03-11 10:09:00 · 3176 阅读 · 1 评论 -
由一道面试题想到的
注:近日同学拿着《程序员面试宝典》这本书中的一道面试题来跟我讨论题目大意如下: int i =1; j=(i++)*(i++); k=(++i)*(++i); 则j=?,k=?本猪看了一阵恶心,服了,国内的教材和考试、面试怎么总喜欢鼓捣这些不入流的trick?以本题为例,所谓的trick根本就是错误!根据C++标准的规定,这样的语句属于Undefine原创 2007-09-06 10:44:00 · 2328 阅读 · 1 评论 -
VPTR与构造函数和继承
C++中类的成员函数默认情况下是non-virtual,即被调用时为静态绑定。 至少包含一个virtual成员函数的类,都有一个VTABLE——虚函数映射表,表中的每项对应类中一个virtual成员函数的函数体地址。相应的该类的每个对象在为其分配存储空间时,编译器会额外的为每个对象附加一个指针VPTR,该指针指向该对象所属类的VTABLE。 一定要明确概念,VTABLE原创 2007-09-11 20:03:00 · 2375 阅读 · 2 评论 -
异常机制与析构函数
以下时一段关于C++异常机制的示例代码:在有异常抛出的情况下,C++会负责自动析构已创建的对象,如果在析构函数中又抛出异常(此时还未进入当前异常的处理函数),则运行时系统会调用terminate(),终止程序。#include iostream>#include cstdlib>#include exception>using namespace std;void new_terminat原创 2007-06-09 10:37:00 · 825 阅读 · 0 评论 -
浅析C++的构造函数,拷贝构造函数和赋值运算符
一.首先通过下面的测试程序,粗略的感知一下这三个函数分别在什么情况下被调用 #include using namespace std;class T{public: T() { cout"dafault constructor"endl;} T(const T & t) {cout"copy constructor"endl;} void operator =(const T原创 2007-08-21 23:03:00 · 5618 阅读 · 1 评论 -
const关键字的internal linkage属性
当将const关键字用于声明某个常量时,该标识符自动具备internal linkage属性,即只对相同文件内的函数可见,对其他文件中的函数是不可见的。这可以通过如下的示例程序证明 //const1.cpp#include iostream>using namespace std;const int a=1;void funcA()...{ cout"cout int原创 2007-06-09 09:37:00 · 1245 阅读 · 0 评论 -
constructor的细节之处
#include iostream>using namespace std;class Who...{public: static Who * NewWho() ...{ cout"calling constructor"endl; return (new Who() ); } void test()...{ Who();};private: Who() ...原创 2007-06-09 10:03:00 · 869 阅读 · 0 评论 -
Reference
C++中 的引用在涉及到初始化和参数传递时,也必须满足了类似C中指针参数传递时的要求: 右侧具备的限定符,都必须在左侧出现。所以,下面的代码都是存在问题,无法通过编译的: int & a=1; void f( int & x) ...{;} f(1);需要修改为如下才能通过编译 const int & a=1; void f( c原创 2007-06-09 10:15:00 · 760 阅读 · 0 评论 -
C/C++中 const的不同含义
在C中const所表示的意思是变量对应的值是不可修改的;然而这个小小的保证也只是看起来如此,程序员完全可以通过强制类型转换,随意修改cosnt变量对应的内存位置的值。 在C++中const表达了双重意味:常量&不可修改。前者保证对所有使用到标识符地方,自动用对应的常值进行替换;后者则保证除非使用const_cast去除const属性,否则任何对const变量的修改都被视为非法操作。原创 2007-06-09 11:09:00 · 1453 阅读 · 0 评论 -
读书摘要—《Thinking in C++ 2rd:Vol 2》
第七章 异常处理 通过使用C++提供的异常处理机制: 1. 编写异常处理代码不再是一项枯燥的工作,而且不会与正常情况下的代码混在一起。 2. 程序运行时的错误不允许被忽略。 C++异常处理机制所提供的优势之一就是允许程序员将面临的任务集中在一个地点解决,而在另外一个地点处理可能出现的错误。 异常处理理论中存在两种基本模型:Terminati原创 2007-06-09 12:28:00 · 1231 阅读 · 0 评论 -
for循环体中定义的变量的生存期
在for的循环体中定义的non-static对象,其生存期仅限于一次循环迭代,即在本次循环结束时,对象会被自动销毁。 试验代码如下:#include iostream>using namespace std;class A...{public: A()...{cout"in ctor of A"endl;} A(A&)...{cout"in copy ctor原创 2007-09-08 23:19:00 · 5714 阅读 · 1 评论 -
转型操作的中的一个陷阱
今天看《Effective C++ 3rd》中的第27款时看到的: "关于强制转型的一件有趣的事,是很容易写出看起来似是而非(在其它语言中也许是对的)的代码。例如,许多应用程序框架要求 derived classes中的virtual member function要首先调用 base class(的对应函数。假设我们有一个 Window base class(基类)原创 2007-09-08 23:55:00 · 1425 阅读 · 3 评论 -
几个需要清晰理解的概念
1 名称覆盖 子类若定义了与基类成员名称相同的成员,则基类成员在子类中会被覆盖。这里要理解的是C++的名称掩盖规则(name-hiding rules)是很简单的:只看名称,不区别类型。 此外,如果基类中存在某个成员函数的若干个重载版本,而子类也定义了同名函数(参数类型与返回值是否一致都不重要),则基类所有版本的重载函数都会被覆盖。 例如,下面例子中基类的成员x和 foo()都原创 2007-09-09 22:47:00 · 1495 阅读 · 0 评论 -
C++命名空间namespace ZZ
转载 2007-12-31 10:19:00 · 1033 阅读 · 1 评论