34 C与C++变量初始化有什么不同
1)在C语言中全局变量存放在全局数据区,由编译器建立,如果在定义的时候不做初始化,系统会将其自动初始化,数值型为0,字符型和指针变量会自动赋值为NULL。静态变量和全局变量类似。而非静态局部变量不做初始化,它的值将是随机数。
2)在C++中,如果在一个文件中定义了int a=5,要在另一个文件中定义int b = a的话,前面必须对a进行声明:extern int a;否则编译不通过,即使是这样,int b = a;这两句话也是分两步进行的,在编译阶段,编译器把b当做是未初始化数据而将它初始化为0,在执行阶段,在main被执行前有一个全局对象的构造过程, int b = a,被当作是int型对象b的拷贝初始化构造来执行。准确地说,在C++中全局对象、变量的初始化是独立的,如果不是 像 int a = 5这样的已初始化数据,那么就是像b这样的未初始化数据。
而C++中全局对象、变量的构造函数调用顺序是跟声明有一定关系的,即在同一个文件中先声明的先调用。对于不同文件中的全局对象、变量,它们的构造函数调用顺序是未定义的,取决于具体的编译器。
35 struct和union的区别
一、Struct 和 Union有下列区别:
1.在存储多个成员信息时,编译器会自动给struct第个成员分配存储空间,struct 可以存储多个成员信息,而Union每个成员会用同一个存储空间,只能存储最后一个成员的信息。
2.都是由多个不同的数据类型成员组成,但在任何同一时刻,Union只存放了一个被先选中的成员,而结构体的所有成员都存在。
3.对于Union的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于struct 的不同成员赋值 是互不影响的。
注:在很多地方需要对结构体的成员变量进行修改。只是部分成员变量,那么就不能用联合体Union,因为Union的所有成员变量占一个内存。eg:在链表中对个别数值域进行赋值就必须用struct.
36 C++中struct与class的区别
1)默认的继承访问权限。struct是public的,class是private的。
2)struct作为数据结构的实现体,它默认的数据访问控制是public的,而class作为对象的实现体,它默认的成员变量访问控制是private的。
3) “class”这个关键字还用于定义模板参数,就像“typename”。但关键字“struct”不用于定义模板参数。
4)C++中的struct是对C中的struct的扩充,既然是扩充,那么它就要兼容过去C中struct应有的所有特性。
5)关于使用大括号初始化
class和struct如果定义了构造函数的话,都不能用大括号进行初始化
如果没有定义构造函数,struct可以用大括号初始化。
如果没有定义构造函数,且所有成员变量全是public的话,可以用大括号初始化。
关于默认访问权限
class中默认的成员访问权限是private的,而struct中则是public的。
关于继承方式
class继承默认是private继承,而struct继承默认是public继承。
37 main函数中的参数含义是什么?
argv为指针的指针 argc为整数
char **argv or: char *argv[ ] or: char argv[ ][ ]
main()括号内是固定的写法。argv是一个指针数组,他的元素个数是argc,存放的是指向每一个参数的指针,他的第一个元素即argv[0]为编译生成的可执行文件名(包括路径eg:"F:\VC\Ex1\Debug\Ex1.exe"),从二个元素(argv[1])开始,是每一个参数 .
int argc 表示argv的大小,是实际参数个数+1,其中+1是因为argv[0]是编译后的可执行文件名
39 内联函数与带参宏函数的区别
宏做的是简单的字符串替换,在编译之前用宏体替换宏名。 内联函数首先是函数,会发生参数的传递,在编译之后执行,其次,作为内联函数就是将很简单的函数"内嵌"到调用他的程序代码中,以减少一定的时空开销。
40 带参宏函数和函数的区别
宏会在编译器在对源代码进行编译的时候进行简单替换,不会进行任何逻辑检测,即简单代码复制而已。
2、宏进行定义时不会考虑参数的类型。
3、参数宏的使用会使具有同一作用的代码块在目标文件中存在多个副本,即会增长目标文件的大小。
4、参数宏的运行速度会比函数快,因为不需要参数压栈/出栈操作。
5、参数宏在定义时要多加小心,多加括号。
6、函数只在目标文件中存在一处,比较节省程序空间。
7、函数的调用会牵扯到参数的传递,压栈/出栈操作,速度相对较慢。
8、函数的参数存在传值和传地址(指针)的问题,参数宏不存在。