【C++】八股文(一)
1.引用和指针的区别?
1
2
int m;
int &n = m;
n 相当于 m 的别名(绰号),对 n 的任何操作就是对m的操作。
所以 n 既不是m的拷贝,也不是指向 m 的指针,其实n就是 m 它自己。
2.引用规则?
- 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)
- 不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)。
- 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。
3.函数的参数和返回值的传递方式?
值传递,引用传递,指针传递
4.引用传递和指针传递的区别?
值传递:形参即使在函数体内值发生变化,也不会影响实参的值;
- 引用传递:形参在函数体内值发生变化,会影响实参的值;
- 指针传递:在指针指向没有发生改变的前提下,形参在函数体内值发生变化,会影响实参的值;
指针能够毫无约束地操作内存中的任何东西,尽管指针功能强大,但是非常危险。引用传递则不能引用初始化时给定的变量;
5.互相引用怎么办?
前向声明
6.常量指针和指针常量
const int a; //指的是a是一个常量,不允许修改。
const int a; //a指针所指向的内存里的值不变,即(a)不变
int const *a; //同const int *a;
int *const a; //a指针所指向的内存地址不变,即a不变
const int const a; //都不变,即(a)不变,a也不变
7.使用指针需要注意什么?
- 定义指针时,先初始化为NULL。
- 用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
- 不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
- 避免数字或指针的下标越界,特别要当心发生“多1”或者“少1”操作
- 动态内存的申请与释放必须配对,防止内存泄漏
- 用free或delete释放了内存之后,立即将指针设置为NULL,防止“野指针”
8.new和malloc的区别,各自底层实现原理
- new是操作符,而malloc是函数。
- new在调用的时候先分配内存,在调用构造函数,释放的时候调用析构函数;而malloc没有构造函数和析构函数。
- malloc需要给定申请内存的大小,返回的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转。
- new可以被重载;malloc不行
- new分配内存更直接和安全。
- new发生错误抛出异常,malloc返回null
9.操作符
操作符可以分为:算术操作符、移位操作符、位操作符、赋值操作符、单目操作符、关系操作符、逻辑操作符、条件操作符、逗号表达式、下标引用函数调用和结构成员操作符等
10.define宏定义和const的区别
- 处理阶段:define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用;
- 安全性:
- define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部的内容,要不然很容易出错;
- const常量有数据类型,编译器可以对其进行类型安全检查
- 内存占用
- define只是将宏名称进行替换,在内存中会产生多分相同的备份。const在程序运行中只有一份备份,且可以执行常量折叠,能将复杂的的表达式计算出结果放入常量表
- 宏定义的数据没有分配内存空间,只是插入替换掉;const定义的变量只是值不能改变,但要分配内存空间。
下一篇:[]
“Time after time have given me new courage to face life cheerfully, have been Kindness, Beauty, and Truth. “ —Albert Einstein
This post is licensed under CC BY 4.0 by the author.