行业门户型网站制作,阳江市建设局网站,泰安市人才网官网,苏州高端网站建设咨询1 面试题1#xff1a;static的用法
static 关键字可用于修饰全局函数和全局变量、函数的局部变量、类数据成员和类函数。 #xff08;1#xff09;修饰全局函数和全局变量#xff1a;只能在本代码文件中使用。 #xff08;2#xff09;修饰函数的局部变量#xff1a;有…1 面试题1static的用法
static 关键字可用于修饰全局函数和全局变量、函数的局部变量、类数据成员和类函数。 1修饰全局函数和全局变量只能在本代码文件中使用。 2修饰函数的局部变量有默认值0。始终驻留在全局数据区直到程序运行结束。但其作用域仍为局部作用域当定义它的函数或语句块结束时其作用域随之结束。虽然静态局部变量在函数调用结束后仍然存在但其他函数是不能引用它的。 3修饰类数据成员和类函数不依赖于类对象的存在而存在。 static 类函数不可以使用 this 指针同时 static 类函数也不能声明为虚函数
1.1 作用1保持变量内容的持久
定义为 static 的变量会在程序刚开始运行时就完成初始化这也是唯一的一次初始化。定义为 static 的变量在程序的运行过程中存储在静态数据区 C 的内存包括栈区、堆区、全局区静态区、BSS段、文字常量区以及程序代码区。特别是对于静态局部变量而言该变量也是始终驻留在全局数据区直到程序运行结束。
static int s_val 0; // 静态全局变量 int main()
{static int val2 0; // 静态局部变量 return 0;
}上面代码中的 s_val 与 val2 的声明周期均是整个程序运行过程。
1.2 作用2隐藏
当同时编译多个文件时被 static 关键字修饰全局函数和全局变量只能在本代码文件中使用而所有未加 static 前缀的全局变量和函数都具有全局可见性。 该功能在 C 代码中更为常见用于实现类似 C 中的私有成员变量以及私有成员函数的特性。
1.3 作用3默认初始化为0
C 的内存分布中的两个区域全局区静态区与 BSS 段。这两个区域所有的字节默认值都是0x00。 1全局区静态区 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域未初始化的全局变量和静态变量又放在相邻的另一块区域中。程序结束后由系统释放。 2BSS段 通常是指用来存放程序中未初始化的全局变量、静态变量全局变量未初始化时默认为 0 的一块内存区域。
1.4 作用4 static 修饰类数据成员和类函数
1static 成员变量属于整个类所拥有对类的所有对象只有一份拷贝 2static 成员函数属于整个类所拥有这个函数不接收 this 指针并且只能访问类的 static 成员变量。 3static 成员函数不能被 virtual 修饰即不能为虚函数。
2 面试题2const 关键字的作用
使用 const 关键字可以创建命名常量即具有特定名称的常量变量。const 修饰符用于表示变量的值是不可修改的。例如
const int val11; 2.1 const 关键字修饰函数入参
设计函数参数的有一个原则是能用 const 的就用 const方便调用 。比如创建一个用于打印字符串的函数。从这个需求来看这个函数有一个字符串的入参在其函数体中只要读入这个字符串入参即可无需对其修改。如果设计一个按值传递的函数如下
void printStr(string str) //采用引用的原因是避免值传递带来的拷贝过程从而造成性能损失
{printf(%s\n,str.c_str());
} 这样就会带来另外两个问题第一该函数只需要读入字符串的入参并不用对其做修改而按引用的传递赋予了这个函数不应该有的权限。第二不方便调用比如有如下调用方式
void printStr(string str)
{printf(%s\n,str.c_str());
}int main()
{printStr(hello); //错误由于字符串 hello 是 const 类型所以这里编译会报错。return 0;
}因此最合理的设计就是使用 const 关键字
void printStr(const string str)
{printf(%s\n, str.c_str());
}2.2 const 关键字修饰指针
对指针来说可以指定指针本身为 const 也可以指定指针所指的数据为 const 或二者同时指定为 const 。两者区别如下 如果 const 位于*的左侧则 const 就是用来修饰指针所指向的变量即指针指向为常量。例如
int a1;
const int * ptr a; //等同于 int const * ptr a;
*ptr 2; //错误不能通过指针来修改变量的值如果 const 位于*的右侧 const 就是修饰指针本身即指针本身是常量。例如
int a 1;
int b 2;
int * const ptr a;
ptr b; //错误不能修改指针的指向2.3 const 关键字在类中的作用
使用 const 关键字修饰的类的成员函数表明其是一个常函数可以访问非 const 数据成员也可以访问 const 数据成员。但是 const 成员函数不能修改类的成员变量另外类的常对象只能访问类的常成员函数。如下为样例代码
#include iostream
using namespace std;class Student
{
public:Student() {}~Student() {}public:void sayHello() const{m_name zhangsan; //错误 不能修改类的成员变量printf(%s\n, m_name.c_str());}string getName(){return m_name;}private:string m_name;
};int main()
{Student st;st.sayHello();const Student st2;string name st2.getName(); //错误 const 对象不能调用非 const 成员函数return 0;
}2.4 const 与 define 定义常量的区别
1处理阶段 const 常量是一个Run-Time的概念他在程序中确确实实的存在可以被调用、传递。 define 常量是预处理器预处理阶段完成的它的生命周期止于编译期在实际程序中他只是一个常数、一个命令中的参数没有实际的存在。 2定义不同 define 是宏定义它最大的特点就是语义替换它定义的常量值没有类型限定不做运算也不做类型检查在宏出现的地方直接展开。例如
#define VAL 11 //我们预想的 VAL 值是 2 我们这样使用 VAL
double a VAL/2; //我们预想的a的值是1可实际上 VAL 的值是 2
//实际上就是 a 11/1 2const 是关键字其实就是一个只读变量不能更改它会在编译时检查数据类型。 3存储方式 const 常量存在于程序的数据段。 define 常量存在于程序的代码段。 const 定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量存放在静态区)而#define定义的宏常量在内存中有若干个拷贝。 就空间效率而言const 优于 define。 总结上述区别一般推荐使用const关键字定义常量因为它具有类型限制更安全、更可读、更易于维护。