CC++基础概览

xiaoxiao2021-02-28  15

(1) sizeof

在32位系统下,各类型所占字节数 sizeof(char) = 1 sizeof(short) = 2 sizeof(int) = 4 sizeof(unsigned int) = 4 sizeof(long) = 4 sizeof(long long) = 8 sizeof(float) = 4 sizeof(double) = 8 数组的大小 char buf[3]; sizeof(buf) = 3; wchar_t wbuf[3]; sizeof(buf) = 6; 数组作为函数参数时的大小 int getSize(char buf[]) { return sizeof(buf); } int main() { char buf[3]; printf("%d", getSize(buf)); // 数组作为参数时,退化为指针,在32位系统上指针占4字节 } 引用的大小 int main() { char a = 'A'; char &b = a; printf("%d", sizeof(b)); // `sizeof(引用)`得到的是引用的变量的大小,char占1各字节,故结果为1 return 0; }

(2) 运算符优先级

运算符的优先级 记忆口诀 括号成员第一; //括号运算符[]() 成员运算符. -> 全体单目第二; //所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、& 乘除余三,加减四; //这个"余"是指取余运算即% 移位五,关系六; //移位运算符:<< >> ,关系:> < >= <= 等 等于(与)不等排第七; // == 和 != 位与异或和位或; //位运算: 位与(&) 异或(^) 位或(|) "三分天下"八九十; 逻辑或跟与; //逻辑运算符:|| 和 && 十二和十一; //注意顺序:优先级(||) 底于 优先级(&&) 条件高于赋值, //三目运算符优先级排到13 位只比赋值运算符和","高 逗号运算级最低! //逗号运算符优先级最低 相关内容 int *p[3]; // 指针数组 int (*p)[3]; // 数组指针 *p++; // 先p++, 后取值

(3) 内存对齐

参考文章:《彻底理解内存对齐》

(4) C++各种类型转换函数

参考文章:《C++ 类型转换》

(5) strcpy

char *strcpy(char* dest, const char *src); strcpy函数不对传入参数的有效性进行检查(如是否为NULL),若dest或src为空,程序会引发空指针异常而崩溃。strcpy函数会拷贝src的内容到dest,直到遇到'\0'为止,并且会将'\0'拷贝到dest。strcpy函数返回dest指针。

(6) 指针与引用的区别

引用必须在定义的时候进行初始化。如果是成员变量的引用类型,则必须通过构造函数初始化列表来初始化。引用一经初始化之后,不能修改;而指针可以修改,重新指向其他变量。因为引用不可变,所以没有必要用const修饰(视编译器不同,有的会产生警告,有的会产生编译错误);而指针有const,const的指针不可变指针可以为NULL,而引用不能。指针归根到底是一个变量,存储的是变量地址;而引用则是变量的一个别名,是指针的弱化版本。sizeof(指针)得到的是指针的大小,而sizeof(引用)得到的是引用的变量的大小。

(7) free

free函数会对参数是否为NULL进行校验,所以free(NULL);不会引发程序崩溃。

(8) C++内存分配方式

C++的内存分配分为:堆、栈、全局/静态存储区、常量存储区。 堆:由程序员分配和释放,若程序员未释放,则在程序结束时由操作系统释放。堆是向着内存地址增加的方向生长。 栈:由编译器自动分配和释放,主要存储函数参数,局部变量等。栈是向着内存地址减少的方向生长。 全局/静态存储区:存储全局变量和静态变量。初始化的和未初始化的全局/静态变量分开存储。 常量存储区:存储程序中的常量。

(9)C++虚函数表

参考:《C++虚函数的实现原理》

(10)class与struct的区别

class的默认访问级别是private;而struct得默认访问级别是public。C语言中的struct不能有成员函数,而C++中的struct可以有成员函数,甚至可以有虚函数。

(11)为什么拷贝构造函数的参数要为常引用?

分解开来解释: 1. 为什么要是引用?因为如果为传值的方式的话,会再次引发拷贝构造,这个会一直循环递归下去。 2. 为什么要是常引用?防止成员的值被修改。

(12)const与宏的区别

const有数据类型,而宏没有数据类型。编译器会对前者进行类型安全检查,而宏只是单纯的字符串替换。

(13)STL容器的实现方式

vector:通过数组来实现。vector每次扩容时,会扩大为当前需要容量的2倍。map:通过红黑树来实现。查找非常快,查找算法复杂度为 log2n l o g 2 n list:通过链表来实现。

(14)const用法

归纳为一句话就是:const永远是修饰它前面的内容。但有个例外就是const在最前面时,如const int *p;,等同于int const *p;。

(15)static的作用

在函数体内,static变量只在第一次进入函数体内时被初始化。该变量存储在静态存储区。在模块(源文件)内,被声明为static的函数只在该模块(源文件)内可见。在模块(源文件)内,被声明为static的全局变量只在该模块(源文件)内可见。在类内,被声明为static的成员变量必须在类的外部初始化,不属于类的任何对象,被整个类所拥有。在类内,被声明为static的成员函数,不属于类的任何对象,被整个类所拥有,可以访问类的static成员变量。 china_jeffery 认证博客专家 C/C Qt Node.js 持续学习者;擅长开发开源组件及相关工具;长期致力于应用各种IT新技术提升生产效率和解决实际问题;china_jeffery@163#com
转载请注明原文地址: https://www.6miu.com/read-1450076.html

最新回复(0)