笔试面试中C/C++重要知识点整理(不定期更新)1. C和C++语言中的优先级规则C语言中语言声明的优先级规则如下(以后分析的基础):A 声明从它的第一个名字开始读取,然后按照优先级顺序依次读取B 优先级从高到低依次是 : 括号()表示这是一个函数 括号[]表示这是一个数组 :星号*表示“指向……的指针” 下面我们使用上述规则来分析以下例子(1) char*const*(*next)(); (2) char*(*c[10])(int**p) 一步步分析:先分析括号里面的容,我们知道C是一个数组,保存的是“…..的指针”然后根据规则B,要先分析后缀,得到指针是一个函数指针。该函数参数为P返回值为char*。最后得到:C是一个数组元素,它的元素类型是函数指针,其所指向的函数的返回值是一个指向char的指针。(3) void(*signal(intsig,void(*func)(int)))(int); 从signal所在的括号开始提取:void(*signal( ))(int); 首先signal后缀跟的是括号,我们得到signal是一个函数,然后得到前缀为*表示此函数返回的是一个”……指针”…………最后得到signal是一个函数,返回函数指针,函数所指向的指针接受一个int类型的参数并且返回void。 然后我们看signal函数参数本身:void(*func)(int) 表示func是一个函数指针,此指针指向的函数接收一个int参数,返回值是void。 如果我们定义typedefvoid(*ptr_to_func)(int)则表示ptr_to_func是一个函数指针,该函数接受一个int参数,返回值为void那么上述函数可以写为 ptr_to_funcsignal(intsig,ptr_to_func); 表示signal是一个函数,接收参数为int和ptr_to_func,返回ptr_to_func; 2. typedefintx[10]与#definexint[10]的区别 typedef与宏文本替换之间存在关键性的区别。如下: 第一:可以用其他类型说明符对宏名进行扩展,但对typedef所定义的类型名却不能这样做。如下: #definepeachint unsignedpeachi;//可以 typedefintbanana; unsignedbananai;//错误 第二:在连续声明的变量中用typedef定义的类型能够保证声明中所有变量均同一种类型,而用#define定义的类型却无法保证。如下: #defineint_ptrint* int_ptrchalk,cheese; 经过宏扩展,第二行变为: int*chalk,cheese; 这使得chalk与cheese为不同的类型。chalk为int类型的指针,而cheese只是int类型变量。 typedef char*char_ptr; char_ptrBenley,Royce; Benley,和Royce类型是相同的。都是指向char的指针 原因:#define在编译时仅仅是名称替换而typedef可以被看成一个彻底封装的“类型”。在了解typedef中变量具体表达什么意思的时候可以按照前面说的优先级规则进行解析。 3. 指针与typedeftypedef中使用指针往往带来意外的结果。例:typedefstring*pstring;constpstringcstr;c_str究竟代表什么类型。我们知道pstring是指向string的指针很多人都会误认为真正的类型是conststring*cstr。错误原因是将typedef当成#define直接进行文本扩展了,其实const修饰的是pstring而pstring是一个指针,因此,正确的等价形式应该是string*constcstr; 4. : 每个类都定义了一个接口(可以不是很确切的理解为类中访问级别为public的函数为接口)和一个实现。接口由使用该类的代码需要执行的操作组成。实现一般包括该类所需要的数据。实现还包括定义该类需要的但又不供一般性使用的函数。 定义类时,通常先要定义该类的接口,即该类所提供的操作。通过这些操作,可以决定该类完成其功能所需要的数
++重要知识点整理 来自淘豆网m.daumloan.com转载请标明出处.