C++面试点之变量

1:全局变量与static变量
全局变量的作用域为全局作用域,static变量的作用域为当前代码块,但是static变量存储在静态存储区,在当前代码再次调用该static变量的时候变量的值不变。全局变量的生存周期是在整个程序运行期间一直存在。全局静态变量是在全局变量前面加上static 关键字,全局静态变量也存储在静态存储区,全局静态变量的作用域为当前文件,生存周期为整个程序运行期间一直存在。
2:static函数与普通函数的区别
static函数在内存中只有一份,而普通函数默认是extern 的,每次调用该函数都在内存中维持其一份拷贝,static函数只在声明他的文件中可见,而普通函数在其他文件中也可见。
3:两个文件中声明两个同名变量
如果使用了extern 那就是静态的,在内存中只有一份, 如果没有,那就是模块的变量,在内存中有两份。
4:全局数组和局部数组的初始化

static int array_static_glogal[5];//定义静态全局数组,未初始化数组成员
int array_glogal[5];                 //定义全局数组,但未初始化数组成员
int main()
{
    int array[5];
    static int array_static[5];
    return 0;
}

在以上代码中我们分别定义了全局数组,全局静态数组,局部数组和局部静态数组,运行程序可发现只有局部数组的未初始化的会用随机值填充,其他的未初始化都用0填充。
5:指针和引用的区别?
定义上看,指针是指向变量的地址的一个变量,而引用则是变量的别名,从大小来看,指针的大小由CPU的寻址位数决定,64为机器64位编译器一般为8,其他的位4,引用的大小和被引用的变量一样。也就是在同样的环境下指针的大小是一定的,引用的大小和被引用的变量一样。从初始化上看,指针可以位空指针,但是没有空引用,也就是引用必须被初始化。指针在运行时可以改变其所指向的值,引用一旦和某个对象绑定就不再改变。从内存上看,指针会分配内存区域,而引用不会,它仅仅是一个别名。在参数传递时,引⽤用会做类型检查,而指针不会。
6:C++中的强制转换
C++中一共有4中强制转换运算符,分别是const_cast
,reinterpret_cast和static_cast。
const_cast 运算符用于修改类型的 const / volatile 属性。除了 const 或 volatile 属性之外,目标类型必须与源类型相同。这种类型的转换主要是用来操作所传对象的 const 属性,可以加上 const 属性,也可以去掉 const 属性。
例如下面的代码:

int fun(int* ptr) 
{ 
    return (*ptr + 10); 
}   
int main(void) 
{ 
    const int val = 10; 
    const int *ptr = &val; 
    int *ptr1 = const_cast <int *>(ptr); 
    cout << fun(ptr1); 
    return 0; 
} 

函数fun() 接受一个非常量指针,我们可以通过const_cast 将非常量指针转换为常量指针。

class student 
{ 
private: 
    int roll; 
public: 
    // constructor 
    student(int r):roll(r) {} 
    // A const function that changes roll with the help of const_cast 
    void fun() const
    { 
        ( const_cast <student*> (this) )->roll = 5;    
    } 
    int getRoll()  { return roll; } 
};   
int main(void) 
{ 
    student s(3); 
    cout << "Old roll number: " << s.getRoll() << endl; 
    s.fun();   
    cout << "New roll number: " << s.getRoll() << endl;   
    return 0; 
} 

在上面的例子中,类中的this指针实际上是常量指针,并且他指向常对象,如果我们通过this指针直接去改变类中对象的值是不可行的,通过const_cast 则可以做到这一点。
dynamic_cast 在运行时执行转换,验证转换的有效性。如果转换未执行,则转换失败,表达式 expr 被判定为 null。dynamic_cast 执行动态转换时,type 必须是类的指针、类的引用或者 void*,如果 type 是类指针类型,那么 expr 也必须是一个指针,如果 type 是一个引用,那个 expr 也必须是一个引用。dynamic_cast 主要用作类间的转换,将一个基类的指针或者引用转换到派生类,如果转换是安全的,返回新指针,如果转换不安全,则返回NULL。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。在进行类之间的上下转换时候,static_cast和reinterpret_cast运算符要么直接被编译器拒绝进行转换,要么就一定会得到相应的目标类型的值。 而dynamic_cast却会进行判别,确定源指针所指的内容,是否真的合适被目标指针接受。如果是否定的,那么dynamic_cast则会返回null。
reinterpret_cast 可以用于任意类型的转换,但是结果未定义。
7:如何修改const 常量
加上volatile 关键字告诉他是易变的,或者利用const_cast?
8:如何判断浮点型的大小
直接用==会出现错误,要利用精度来判断

#define EPSILON 0.000001 //根据精度需要
if ( fabs( fa - fb) < EPSILON )
{
printf("fa<fb\n");
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容