友元函数
摘要:【友元函数】 之前只知道友元类型 friend class。原来C++中还有友元函数 friend class。 1)C++中引入友元函数,是为在该类中提供一个对外(除了他自己意外)访问的窗口; 2)这个友元函数他不属于该类的成员函数,他是定义在类外的普通函数,只是在类中声明该函数可以直接访问类中的
阅读全文
基类和派生类之间的同名函数处理方式
摘要:【基类和派生类之间的同名函数处理方式】 这里涉及到一个C++中的重要的知识点。即:同名函数的重载动作,只发生在自由函数(即非成员),及同一个class/struct内部的函数之间。而不能跨越基类和派生类。当派生类写一个和基类同名(无论参数列表相同或不相同)的函数时,此时发生的动作叫“覆盖”。覆盖的意
阅读全文
一些常用的 std 类型
摘要:【std::allocator】 标准库中包含一个名为allocator的类,允许我们将分配和初始化分离。使用allocator通常会提供更好的性能和更灵活的内存管理能力。 标准库allocator类定义在头文件memory中,它帮助我们将内存分配和对象构造分离开来。它提供一种类型感知的内存分配方法
阅读全文
C++/CLI
摘要:【C++/CLI】 A C++/CLI application or component uses extensions to C++ syntax (as allowed by the C++ Specification) to enable interaction between .NET an
阅读全文
全特化与偏特化
摘要:【全特化与偏特化】 1、普通类模板 2、全特化。 3、偏特化。 4、函数模板只能全特化,不能偏特化。 5、一个示例。
阅读全文
Effective C++
摘要:【Effective C++】 1、只有int型的class static变量能在类中定义,其它类型(如double)只能在类中声明,在类外定义。 2、能不用宏定义,就尽量不用。如下例,将宏替换为函数,就不会存在此问题。 3、迭代器的作用就像个T*指针。const ::iterator 类似 T*
阅读全文
C专家编程
摘要:【C专家编程】 1、如果写了这样一条语句: if(3=i)。那么编程器会发出“attempted assignment to literal(试图向常数赋值)”的错误信息。 所以将常量放置在==前央,可以避免写成赋值语句。 2、空格会对扩展的结果造成很大的影响。 3、函数声明中可以省略形参名,如:
阅读全文
#import 指令
摘要:【#import 指令】#import指令用于从一个类型库中结合信息。该类型库的内容被转换为C++类,主要用于描述COM界面。语法 #import "文件名" [属性] #import [属性]属性: 属性1,属性2,... 属性1 属性2 ...文件名是一个包含类型库信息的文件的名称。一...
阅读全文
Clockwise/Spiral Rule
摘要:【Clockwise/Spiral Rule】 There is a technique known as the ``Clockwise/Spiral Rule''. (顺时针螺旋法则). There are three simple steps to follow:Starting with...
阅读全文
为什么C++空类的实例大小为1
摘要:【为什么C++空类的实例大小为1】 每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。所以大小为1。参考:http://bbs.csdn.net/topics/370134485
阅读全文
令assignment操作符返回一个reference to *this
摘要:【令assignment操作符返回一个reference to *this】 关于赋值,可以把它们写成连锁形式: int x, y, z; x =y =z =15; II赋值连锁形式 上述连锁赋值被解析2为 x = (y = (z = 15)); 这里 15先被赋值给 Z,...
阅读全文
文本读写vs二进制读写
摘要:[文本读写vs二进制读写] 在学习C语言文件操作后,我们都会知道打开文件的函数是fopen,也知道它的第二个参数是 标志字符串。其中,如果字符串中出现'b',则表明是以打开二进制(binary)文件,否则是打开文本文件。 那么什么是文本文件,什么是二进制文件呢? 可能大多数人都没有仔细考虑过。 所谓使用fopen标志打开文本文件与二进制文件的说法并不准确。正确的说法应该是--以文本方式和二进制方式打开文件。因为我们用两种方式都可以任意的文件。 为什么还要区分两种方式呢?因为这两种方式在读写文件时的操作是不一样的。 二进制方式很简单,读文件时,会原封不动的读出文件的全部內容,写的
阅读全文
feof使用注意
摘要:【feof使用注意】 以下是错误的用法,發生狀況->多讀一次?:1 FILE* pf;2 while(!feof(pf)){3 //fread 讀取4 //資料處理5 } feof是發生在fread使用"讀取過檔案"後,已讀到End-of-file位置時,回傳的指標才會是true(檔案結尾),所以上面的寫法在讀完最後一筆後,指標會停留在End-of-file位置前,需要再讀一次到在End-of-file位置後(判斷讀取資料失敗,因為已讀到eof),才會為true,而因為fread讀取失敗,buffer的資料不會改變,所以才會多讀一筆。 改善的方式,如先使用fread讀取,...
阅读全文
如何理解*
摘要:【如何理解*】 const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。事实上这个概念谁都有,只是三种声明方式非常相似很容易记混。Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:把一个...
阅读全文
int* V.S. int[]
摘要:【int* V.S. int[]】 在C++中,int[]有2种形态,一种是指针形态,即使用方法和int*一样,另一种是符号形态,即只是一个编译期的符号(意味着在runtime期,所定义的int[]根本不存在) int *p = "abc"; int p[] = "abc"; 对于上面2行代码,调用p[i]时结果是一样的,但执行过程不一样。具体参见《C专家编程》。
阅读全文
anonymous namespace V.S. static variant
摘要:【anonymous namespace V.S. static variant】 在C语言中,如果我们在多个tu(translationunit)中使用了同一个名字做为函数名或者全局变量名,则在链接阶段就会发生重定义错误,为了解决这个问题,我们可以在定义这些标识符(identifier)的时候加...
阅读全文
define中的:#,##,#@
摘要:[define中的:#,##,#@]#defineConn(x,y)x##y#defineToChar(x)#@x#defineToString(x)#x(2)x##y表示什么?表示x连接y,让compiler认为 xy 需要组合在一起, 被看作是一个符号而不是其它. 举例说:intn=Conn(123,456);/* 结果就是n=123456;*/char*str=Conn("asdf","adf");/*结果就是 str = "asdfadf";*/(2)再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举
阅读全文
Function Names as Strings
摘要:【Function Names as Strings】GCC provides three magic variables that hold the name of the current function, as a string. The first of these is__func__, which is part of the C99 standard(old):The identifier__func__is implicitly declared by the translator as if, immediately following the opening brace o
阅读全文
why inline functions must be put in header files?
摘要:[why inline functions must be put in header files?] 编译中有2个过程:compile、link。先进行compile,compile中把源代码编译成目标代码(.obj),然后是link,把目标代码(obj)中的外部符号替换为真实的地址。 inline函数的作用是减少函数调用而直接使用函数内部内容,显示是发生在compile阶段。所以如果把inline函数放在cc文件中,则compile过程中无法实现inline效果,连接器将给出 “unresolved external” 。 事实上,inline一个函数,也意味着给该函数加上了stat...
阅读全文
hash_map
摘要:【hash_map】 STL中的std::map内部使用的是红黑树,红黑树有序,每次操作的复杂度稳定在logN。在中,还有一个__gnu_cxx::hash_map,内部使用的是hash,在hash函数恰当的情况下,可以提供更快的查询速度O(1),如果hash函数很烂,使用hash_map,将会是一个灾难,操作复杂度最坏将到O(N)。 内部原理就是“Hash函数映射 + list解决Conflict”。更多可参考:http://blog.csdn.net/sdhongjun/article/details/4517325 我比较好奇的是 这个vector成员,它的默认大小是多少?以及...
阅读全文