C/C++基础概览

(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);
  1. strcpy函数不对传入参数的有效性进行检查(如是否为NULL),若destsrc为空,程序会引发空指针异常而崩溃。
  2. strcpy函数会拷贝src的内容到dest,直到遇到'\0'为止,并且会将'\0'拷贝到dest
  3. strcpy函数返回dest指针。

(6) 指针与引用的区别

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

(7) free

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

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

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

(9)C++虚函数表

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

(10)class与struct的区别

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

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

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

(12)const与宏的区别

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

(13)STL容器的实现方式

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

(14)const用法

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

(15)static的作用

  1. 在函数体内,static变量只在第一次进入函数体内时被初始化。该变量存储在静态存储区。
  2. 在模块(源文件)内,被声明为static的函数只在该模块(源文件)内可见。
  3. 在模块(源文件)内,被声明为static的全局变量只在该模块(源文件)内可见。
  4. 在类内,被声明为static的成员变量必须在类的外部初始化,不属于类的任何对象,被整个类所拥有。
  5. 在类内,被声明为static的成员函数,不属于类的任何对象,被整个类所拥有,可以访问类的static成员变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

china_jeffery

你的鼓励是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值