C/C++面试八股总结

1、变量作用域

变量根据作用域的不同可分为局部变量和全局变量。全局变量的作用域是本工程(但要访问其他文件中的全局变量需要使用extern关键字),生命周期是从声明到整个工程运行结束,因此存放在内存四区(代码区、全局区、堆区、栈区)的全局区,在工程结束时被销毁;局部变量作用域是本代码块(以{}分隔),生命周期是从声明到本代码块运行结束,存放在栈区,随着本代码块的运行结束会被自动销毁。

特殊情况:

(1)如在某代码段声明一个与全局变量同名的局部变量,在局部变量的生命周期内全局变量将被局部变量屏蔽。

(2)一个全局变量只能在同一工程中的一个源文件中被定义,其他源文件中不能重复定义同名全局变量,若想访问其他文件中的全局变量,可以使用extern关键字。

source2.cpp中定义全局变量:

source1.cpp中使用extern关键字访问:

d在source1.cpp声明时不可再赋值:

(3)若多个源文件都需要访问同一个全局变量,可以在一个源文件中实现,在一个头文件中使用extern进行声明,再在其他源文件中include此头文件。

若在头文件中直接定义全局变量,也可以通过include的方式被包含在源文件中,此时相当于该全局变量在该源文件中被定义,其他源文件不可再定义,可通过extern访问,而不能通过include头文件访问,否则相当于在多个源文件中重定义相同的全局变量。

2、static

 static是一个起修饰作用的关键字,可以修饰变量、函数以及类等等。

(1)static修饰变量

static关键字能够改变变量的生命周期和作用域。

  • 当使用static修饰局部变量,称为静态局部变量,它将被存放在全局区,即在程序结束前都不会被销毁。但需要注意,被延长的只有生命周期,作用域并没有被改变,仍然是本代码段。

静态全局变量在第一次声明时被创建,后面每次操作都是在原来所有操作的结果上继续叠加,但后续的声明将被忽略。

  • 当使用static修饰全局变量,称为静态全局变量,该变量的作用域将被固定为本文件,不能再被其他文件访问(若使用extern访问,编译不报错,链接报错)。如果多个文件存在同名静态全局变量,将互不影响。这样做的好处是降低耦合,减少误用,增加安全性。

头文件head.h:

source2.cpp:

main.cpp:

(2)static修饰普通函数

当使用static修饰函数,情况与全局变量类似,都是将作用域限定在本源文件内,拒绝其他文件访问。

错误场景1:在source.cpp中定义一个static修饰的函数,在头文件head.h的声明中使用static修饰,在main.cpp中包含head.h,但未对该函数进行实现,直接进行调用。链接时报错:静态函数已声明未定义。说明编译器把声明当作内部函数(本文件的函数),在本文件未找到定义,因此报错。

错误场景2:在source.cpp中定义一个static修饰的函数,在头文件head.h的声明中使用static修饰,在main.cpp中包含head.h,但未对该函数进行实现,直接进行调用。链接时报错:无法解析的外部符号。说明编译器把声明当作外部函数,链接时未找到该函数,因此说不认识该函数。

(3)static修饰类的成员

类中的成员包括成员变量和成员函数,一个类无论被实例化出多少对象,其中被static修饰的成员只会有一份拷贝,其内容被所有对象共享,不占用对象内存,可使用类名直接调用(需要成员的权限是public)。

静态成员变量类内声明,类外定义+初始化。相比于全局变量,静态成员变量的一大优势是可以被设置为private权限,另一个优势是其只在某个类的名字空间下,减少冲突。

静态成员函数只能访问静态成员变量和静态成员函数,不能访问普通成员;普通成员函数可访问静态成员、也可以访问非静态成员。

其原因在于每个对象在实例化时都隐含着一个this指针,这个指针指向对象本身,普通成员确定得属于某一个对象,因此可以通过该对象的this指针访问,而静态成员属于整个类,因此没有this指针,也就无法访问普通成员。

同样因为指针的原因,静态成员函数不能是[虚函数](#virtual)。因为虚函数通过虚函数表调用,指向虚函数表的指针存储在对象的内存中,静态成员函数不属于任何对象,因此无法通过虚函数表访问。

3、变量类型(auto)

<div id="virtual"></div> 

4、虚函数

5、define

6、const

杂散知识点:

1、C/C++不允许在函数外进行赋值操作(以及其他执行语句,但可初始化),因为函数外语句的执行顺序是无法确定的。

  • 36
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值