C++基础知识1

1、在C++程序在调用C编译器编译后的函数,为什么需要加extern C?

首先,extern是C/C++中的表明函数的的全局变量范围的关键字,该关键字告诉编译器,其声明的函数可以在本模块和其他模块中使用。

被extern修饰的变量和函数是按照C语言方式编译和连接的,C++支持重载,在被编辑是需要包含函数名、函数参数数量以及类型信息,C被编译时只需要函数名就行。

2、头文件中的ifndef、define、endif有什么作用

这是C++预编译头文件保护符,保证即使文件被多次包含,头文件也被定义一次。

3、#include<file.h>和#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。

相关推荐
_GR20 分钟前
每日OJ题_牛客_牛牛冲钻五_模拟_C++_Java
java·数据结构·c++·算法·动态规划
Death20039 分钟前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
六点半88840 分钟前
【C++】速通涉及 “vector” 的经典OJ编程题
开发语言·c++·算法·青少年编程·推荐算法
coduck_S12004zbj1 小时前
csp-j模拟五补题报告
c++·算法·图论
Death2001 小时前
Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系
c语言·c++·qt·3d·c#
sukalot1 小时前
windows C++-windows C++-使用任务和 XML HTTP 请求进行连接(二)
c++·windows
qianbo_insist2 小时前
simple c++ 无锁队列
开发语言·c++
zengy52 小时前
Effective C++中文版学习记录(三)
数据结构·c++·学习·stl
MinBadGuy3 小时前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
QuantumStack5 小时前
【C++ 真题】B2037 奇偶数判断
数据结构·c++·算法