招商银行/招银网络科技面经、答案

本文详细解析了C++中的`static`用法,包括静态全局变量、静态局部变量和静态函数,强调了它们在作用域和生命周期上的特性。接着讨论了`static`修饰类成员函数的意义,以及`const`在常量、指针和引用中的应用,区分了`const`与`#define`的区别。文章还对比了指针和引用的差异,阐述了引用在函数参数传递中的作用。此外,文章提到了头文件保护技术`#ifdef`,并列举了哪些类型的函数不能声明为虚函数。最后,介绍了智能指针(auto_ptr、unique_ptr、shared_ptr、weak_ptr)的作用和分类,并讨论了结构体、类与联合体的区别,以及OSI七层协议的概览。
摘要由CSDN通过智能技术生成

1、介绍一下static的各种用法,static修饰的变量在别的文件中可以使用吗

Static修饰全局变量叫做静态全局变量,

Static修饰局部变量叫做静态局部变量,

Static修饰函数叫做静态函数;

静态全局变量:限制变量的作用域,仅在本文件中访问,其他文件不可访问;

静态局部变量:仅在本函数体内访问,本文件其他函数体内不可访问;但静态局部变量的值在程序运行期间不会销毁;

静态函数:仅在本文件中调用,其他文件中不可调用,即程序员不用担心编写的函数与其他文件的函数同名。
总的来说:
(1)在修饰变量的时候,static修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。
(3)static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该先考虑使用static)
2、static修饰类成员函数有什么作用
static修饰的函数叫做静态函数,静态函数有两种,根据其出现的地方来分类:

如果这个静态函数出现在类里,那么它是一个静态成员函数;

静态成员函数的作用在于:调用这个函数不会访问或者修改任何对象(非static)数据成员。

其实很好理解,类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
如果它不是出现在类中,那么它是一个普通的全局的静态函数。

这样的static函数与普通函数的区别是:**用static修饰的函数,限定在本源码文件中,不能被本源码文件以外的代码文件调用。**而普通的函数,默认是extern的,也就是说它可以被其它代码文件调用。

在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
 <1> 其他文件中可以定义相同名字的函数,不会发生冲突。
 <2> 静态函数不能被其他文件所用。

3、const用法,const与define区别,const指针
C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。
1、const与基本数据类型
int x = 3;//变量

const int x = 3;//常量

2、const修饰指针变量时:
  (1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。

(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。

(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。
3、const与引用
int x = 3;

const int &y = x;

x = 10;//正确

y = 20;//错误,const修饰x的别名y,不能更改
例1:

const int x = 3;

int *y = &x; //erro

x是不可变的,但是我们定义的指针是可变的,可变的指针去指向一个不可变的变量,就会存在风险,会通过指针y来改变x的值;权限大的去接受权限小的,是不可行
二、const与#define的区别
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。(宏定义不分配内存,变量定义分配内存。)
const常量会在内存中分配(可以是堆中也可以是栈中)。

(4)const 可以节省空间,避免不必要的内存分配。 例如:
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 …
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝(因为是全局的只读变量,存在静态区),而 #define定义的常量在内存中有若干个拷贝。
(5) 提高了效率。 编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
(6) 宏替换只作替换,不做计算,不做表达式求解;
宏预编译时就替换了,程序运行时,并不分配内存。

const 与 #define的比较
C++ 语言可以用const来定义常量,也可以用 #define来定义常量。但是前者比后者有更多的优点:
(1) const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)。
(2) 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

4、指针和引用的区别
精简版:

指针:变量,独立,可变,可空,替身,无类型检查;

引用:别名,依赖,不变,非空,本体,有类型检查ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值