1,初始化与未初始化数据段
Q:
void func()
{
static int val;
…
}
中,变量val的内存地址位于?
A:
- 未初始化数的据段
初始化的全局变量和静态变量存放在 data段(全局初始化区)
未初始化的全局变量和未初始化的静态变量存放在bss段(全局未初始化区),其中BSS段的特点是:
- 在程序执行之前BSS段会自动清0,所以未初始化的全局变量和静态比那辆在程序执行之前就已经变成0,但是并不是存放在初始化段,是因为存放在未初始化段才初始化为0的。
2,构造顺序
假如说D继承自B,则基类的构造函数会先执行。
而C是D的成员函数,那么在D的构造函数执行之前,会对其进行初始化,先执行C的构造函数。
以B、C、D,可以看做带有构造函数的类。
3,数组定义方式
Q:
在C语言中,一维数组的定义方式为:
元素类型 数组名 [E]
其中,E为?
A:
- 整型常量表达式
整型常量表达式可以的,比如3+3,但是整型表达式不可以,比如n+n就是错误的。
4,传递参数
-
指针
传地址,对形参的操作就是对实参的操作。 -
引用
形参作为实参的别名,因此实质上也是对实参的操作。 -
传值
如果没有返回值,对形参的操作并不会引起实参的变化。
5,字节对齐
字节对齐的三个准则:
- 结构体变量的首地址能够被其最宽基本类型的成员的大小整除;
- 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如果有需要,编译器会在成员之间填充字节;
- 结构体的总大小为结构体最宽节本类型成员大小的整数倍,如果有需要,编译器会在最末一个成员之后加上填充字节。
6,类型的混合运算
Q:
设在程序中 a、b、c 均被定义成整型,所赋的值都大于 1,则下列 C++ 表达式能正确表示右图所示代数式的是?(假设abc不超出整型表示的范围)、
A. 1.0/(abc)
B. 1/(abc)
C. 1/a/b/(float)c
D. 1.0/a/b/c
A:
正确答案为AD
对于C选项,1/a/b/(float)c,由于除法运算的结合方向是从左到右,先算1/a,因为a的值大于 1,结果为0,之后再除b和c结果还是0。
7,指针的指针
Q:
阅读下面代码,程序会打印出来的值是?
#include <stdio.h>
void f(char**p){
*p +=2;
}
main()
{
char *a[] = {"123","abc","456"},**p;
p = a;
f(p);
printf("%s\r\n",*p);
}
A:
在上面的代码中,*p指向的是字符串“123”的第一个元素,即‘1’,指针p向后移动两个元素的地址,即指向‘3’。
而 *(p+2)才是基于p每次向后移动一个字符串的长度,即 *(p+2)指向的是“456”。
8,运算符重载
- 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
- 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。
- 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。 C++提供4个类型转换函数:reinterpret_cast(在编译期间实现转换)、const_cast(在编译期间实现转换)、stactic_cast(在编译期间实现转换)、dynamic_cast(在运行期间实现转换,并可以返回转换成功与否的标志)。
- 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。
- 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。
- 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。
- 当需要重载运算符具有可交换性时,选择重载为友元函数。
- 运算符重载并不会定义新的运算符。
- 若重载运算符+,则相应的运算符函数名是operator+。
- 二目运算符重载为类成员函数时 由于this指针的作用,函数参数会少一个。
9,文件操作
打开方式 | 说明 |
---|---|
r | 以只读方式打开文件,该文件必须存在。 |
r+ | 以读/写方式打开文件,该文件必须存在。 |
rb+ | 以读/写方式打开一个二进制文件,只允许读/写数据。 |
rt+ | 以读/写方式打开一个文本文件,允许读和写。 |
w | 打开只写文件,若文件存在则长度清为0,即该文件内容消失,若不存在则创建该文件。 |
w+ | 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。 |
a | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF符保留)。 |
a+ | 以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的EOF符不保留)。 |
wb | 以只写方式打开或新建一个二进制文件,只允许写数据。 |
wb+ | 以读/写方式打开或建立一个二进制文件,允许读和写。 |
wt+ | 以读/写方式打开或建立一个文本文件,允许读写。 |
at+ | 以读/写方式打开一个文本文件,允许读或在文本末追加数据。 |
ab+ | 以读/写方式打开一个二进制文件,允许读或在文件末追加数据。 |
10,友元函数重载
- 友元函数重载时,参数列表为1,说明是一元运算符,为2则说明是二元运算符。因为没有this指针指向对象,因此参数个数保持和原来一样。
- 成员函数重载时,参数列表为空,说明是一元运算符,为2则说明是二元运算符。