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