C++基础知识1

1、在C++程序在调用C编译器编译后的函数,为什么需要加extern C?
首先,extern是C/C++中的表明函数的的全局变量范围的关键字,该关键字告诉编译器,其声明的函数可以在本模块和其他模块中使用。
被extern修饰的变量和函数是按照C语言方式编译和连接的,C++支持重载,在被编辑是需要包含函数名、函数参数数量以及类型信息,C被编译时只需要函数名就行。
2、头文件中的ifndef、define、endif有什么作用
这是C++预编译头文件保护符,保证即使文件被多次包含,头文件也被定义一次。
3、#include和#incldue“file.h”的区别?
前者是从标准库路径中寻找并引用file.h,后者是从当前工作路径中寻找并引用filh.h。
4、const和#define有什么区别?
(1)、都可以定义常量、但是const用途更广。
(2)const定义的常量是有数据类型的且占内存空间,而define定义的常量是没有数据类型的而不占内存空间。编译器可以对前者进行类型检查,对后者只进行字符替换,没有类型安全检查。
5、sizeof小结
(1)、sizeof不计算静态变量占的内存;
(2)、32位的指针大小是4字节,64位的指针大小是8字节,而不管指针的类型;
(3)、一个空类占用1个字节,单一继承的空类占1个字节,虚继承涉及到虚指针所以占用4个字节;
(4)、若指定了数组的长度,则不看元素个数,总字节数=数组长度*siziof(元素类型)
(5)、在默认情况下,为方便对结构体内元素的访问和管理,当结构体内元素长度小于处理器位数的时候,便以结构体内最长的数据元素的长度为对齐单位,即为其整数倍。若结构体内的元素长度大于处理器位数则以处理器位数为单位对齐;
(6)、unsigned影响的只是最高位的意义,数据长度不糊改变;
(7)、对函数使用sizeof,在编译阶段会被函数的返回值的类型取代;
(8)、sizeof后面如果是类型名则必须加括号,如果是变量名怎可以不加括号,sizeof是操作符;
(9)、当使用结构类型或者变量时,sizeof返回实际大小,当使用静态数组时返回的是数组的全部大小。sizeof不能返回动态数组或者外部数组的尺寸。
6、sizeof和strlen的区别?
(1)、sizeof返回类型是size_z(unsigned int);
(2)、sizeof是运算符、strlen‘是函数;
(3)、sizeof可以用类型做参数。其参数可以是任意类型或者是变量、函数,strlen只能用char*做参数,且必须是’\0’结尾;
(4)、数组做sizeof的参数时不会退化为指针。而传递给strlen时就退化为指针;
5、sizeod是编译时的常量,而stelen要到运行时才会计算出来,且返回的是字符串中字符的个数而不是内存的大小。
7、指针和引用的区别?
(1)、指针定义时可以不初始化,而引用在定义时就必须初始化,和一个对象绑定,只要引用存在,就会一直保持和该对象的绑定;
(2)、赋值行为的差异,指针赋值是将指针重新指向另外一个对象,而应用赋值就是修改对象本身;
(3)、指针之间存在类型转换,而引用分为const引用和非const引用,非const引用只能和同类型的对象绑定,const引用可以绑定到不同但相关类型的对象或者右值。
8、数组和指针的区别?
(1)、数组要么在全局数据区被创建,要么在栈上被创建,指针可以指向人类类型的数据区;
(2)、修改数据内容上的差别:
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”;
p[0] = ‘X’; //编译器不能发现该错误,运行时错误
(3)、sizeof(数组)可以计算出数组的总字节数,sizeof§得到的是指针占用几个字节,而不是指针所指向的内存容量,指针说到底就是一个变量。
9、空指针和悬挂指针的区别?
1、空指针是被赋值为nullptr的指针,delete指向动态内存分配对象的指针将会产生悬挂指针;
2、空指针可以被删除多次,而悬挂指针再次删除时程序会变得很不稳定。
10、C++中有malloc/free,为什么还要有new/delete?
(1)、malloc是标准库函数,new是运算符,都可以用于动态申请和释放内存;
(2)、malloc在申请内存时需要指定分配内存的字节数,而且不会做初始化,申请成功后返回的是一个void*,需要手动转换数据类型,new在申请内存时不需要指定内存的大小,而且有默认的初始化,申请成功后返回的是一个对象类型;
(3)、malloc不能被重载,new类可以被重载;
(4)、malloc在申请内存失败时返回nullptr,new会抛出异常;
(5)、对于类类型的对象而言,用mallo无法满足要求。对象在创建的时候要自动执行构造函数,消亡时自动执行析构函数。由于malloc是库函数不是操作符,不再编译器控制之内,不能把构造函数和析构函数任务强加给它,因此C++需要new/delete。

你可能感兴趣的:(c++)