当前位置:网站首页>西加加

西加加

2022-07-17 00:14:00 HYYyyying

转自阿秀^ _ ^

1、指针和引用的区别

  1. 指针是一个变量,存储一个地址;引用和原来的变量实质上是一个东西,时原变量的别名。
  2. 指针可以有多级,引用只能有一级。
  3. 指针可以为空,引用不能为空且在定义的时候必须初始化。
  4. 指针在初始化后可以改变指向,而引用在初始化后不可变。
  5. sizeof指针得到该指针的大小,sizeof引用得到的是引用所指向变量的大小。
  6. 当把指针作为参数进行传递时,也是将实参的一个拷贝传递给形参,两者指向的地址相同,但不是同一个变量,在函数中改变这个变量的指向不影响实参;而引用却可以。

2、指针和引用的使用场景

  1. 需要返回函数内局部变量的内存的时候用指针。使用指针传参需要开辟内存,用完要释放,不然会造成内存泄漏。而返回局部变量的引用是没有意义的
  2. 对栈空间大小比较敏感(比如递归)的时候使用引用。使用引用传递不需要创建临时变量,开销更小。
  3. 类对象作为参数传递的时候使用引用,这是C++类对象传递的标准方式。

3、struct和class的区别

共同点:

  1. 两者都拥有成员函数、共有和私有部分
  2. 任何可以用class完成的工作都可以用struct完成

不同点:

  1. 两者如不对成员指定公私有,struct默认公有,class默认私有
  2. struct默认public继承,class默认private继承

4、define和const区别

1、编译阶段
define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用
2、安全性
define只做替换,不做类型检查和计算,也不求解,容易产生错误。
const常量有数据类型,编译器可以对其进行类型安全检查。
3、内存占用
宏定义的数据没有分配内存空间,只是插入替换掉;
const定义的变量只是值不能改变,但要分配内存空间。

5、static和const的作用

static

  • 不考虑类的情况

    • 隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用
    • 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区
    • 静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用
  • 考虑类的情况

    • static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。
    • static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问

const

  • 不考虑类的情况
    • const常量在定义时必须初始化,之后无法更改
    • const形参可以接收const和非const类型的实参,例如// i 可以是 int 型或者 const int 型void fun(const int& i){ //…}
  • 考虑类的情况
    • const成员变量:不能在类定义外部初始化,只能通过构造函数初始化列表进行初始化,并且必须有构造函数;不同类对其const数据成员的值可以不同,所以不能在类中声明时初始化
    • const成员函数:const对象不可以调用非const成员函数;非const对象都可以调用;不可以改变非mutable(用该关键字声明的变量可以在const成员函数中被修改)数据的值

补充一点const相关:const修饰变量是也与static有一样的隐藏作用。只能在该文件中使用,其他文件不可以引用声明使用。 因此在头文件中声明const变量是没问题的,因为即使被多个文件包含,链接性都是内部的,不会出现符号冲突。

6、堆和栈的区别

申请方式不同

  • 栈由系统自动分配。
  • 堆是自己申请和释放的。

申请大小限制不同

  • 栈大小固定,是一块连续的内存空间,向低地址方向增长;
  • 堆是一块不连续的内存区域,向高地址增长

申请效率不同

  • 栈由系统分配,速度快,不会有碎片。
  • 堆由程序员分配,速度慢,会有碎片。

7、区分以下指针类型

int *p[10] 
int (*p)[10] 
int *p(int) 
int (*p)(int)

int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。

int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。

int *p(int)是函数声明,函数名是p,参数是int类型的,返回值是int *类型的。

int (*p)(int)是函数指针,强调是指针,该指针指向的函数具有int类型参数,并且返回值是int类型的。

8、new/delete和malloc/free的异同

相同点

  • 都可用于内存的动态申请和释放
  • new是类型安全的,malloc不是。例如:
int *p = new float[2]; //编译错误 
int *p = (int*)malloc(2 * sizeof(double));// 编译无错误 
  • new调用名为operator new的标准库函数分配足够空间并调用相关对象的构造函数,delete对指针所指对象运行适当的析构函数;然后通过调用名为operator delete的标准库函数释放该对象所用内存。后者均没有相关调用
  • 后者需要库文件支持,前者不用

9、new和delete如何实现

  • new的实现过程是:首先调用名为operator new的标准库函数,分配足够大的原始为类型化的内存,以保存指定类型的一个对象;接下来运行该类型的一个构造函数,用指定初始化构造对象;最后返回指向新分配并构造后的对象的指针。
  • delete的实现过程:对指针指向的对象运行适当的析构函数;然后通过调用名为operator delete的标准库函数释放该对象所用的内存。
原网站

版权声明
本文为[HYYyyying]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_45759072/article/details/125768113