大厂常见面试题----C++篇(3)

1.说一下explicit关键字

explicit是用来防止由构造函数定义的隐式转换,不能自动的隐式类型转换,只能显式的进行类型转换。

隐式类型转换:

class Person {
private:
    int age;
    
public:
    Person() = delete;
    Person(int age) : age(age) {};
    void Print() {
        std::cout << age << "\n";
    }
};

int main()
{
    Person p = 'a';
    p.Print(); // 输出 97
    std::cin.get();
}

显式类型转换:

class Person {
private:
    int age;
    
public:
    Person() = delete;
    explicit Person(int age) : age(age) {};
    void Print() {
        std::cout << age << "\n";
    }
};

int main()
{
    Person p = Person('a');
    Person p2 = (Person)('a');
    p.Print(); // 输出 97
    p2.Print(); // 输出 97
    std::cin.get();
}

2.说一下register关键字

register是从C语言就存在的一个关键字,但是我好想从来没有用过。register修饰符暗示编译程序相应的变量频繁的使用,请求编译器将其保存在CPU 的寄存器中,以加快器存储速度。
register char *s;
register int a;
注意:
(1)register变量必须是一个单个的值,并且长度不能太长,一般不能大于一个int 的长度。
(2)不能被取地址,所以&a是违法的
(3)register static int a非法,局部静态变量不可以声明为register,全局变量也不能声明为register。

3.说一下static关键字

(1)函数体内:static修饰的局部变量作用范围为该函数体,不同于auto变量,其内存只被分配一次,因此其值在下次调用的时候维持了上次的值。
(2)模块内:static修饰全局变量或全局函数,可以被模块内所有函数访问,但是不能被模块外的其他函数访问,使用范围限制在声明它的模块内。
(3)类中:修饰成员变量,表示该变量属于整个类所有,对类的所有对象只有一份拷贝,
(4)类中:修饰成员函数,表示该函数属于整个类所有,不接受this指针,只能访问类中的static成员变量

4.说一下inline关键字

C++提供了inline函数,以减少函数调用的开销。内联函数是在调用时扩展的函数。调用内联函数时,将在内联函数调用时插入或替换内联函数的整个代码。替换由C++编译器在编译时执行,如果内联函数很小,则可以提高效率。
inline函数对于函数体积很小,却又频繁的调用,这样的函数来说,可能比函数的调用时产生的代码更少,但是效率却不可相比及。inline只是对编译器提出一个申请,并不是强制命令。编译器可以忽略内联请求。
在以下情况下,可能不会执行内联:
(1)如果包含循环
(2)如果函数包含静态变量
(3)如果函数是递归的
(4)如果函数返回类型不是void,并且函数主体中不存在return语句
(5)如果函数包含Switch或goto语句
内联函数的缺点:
(1)内联函数中添加 的变量消耗了额外的寄存器,在内联函数之后,如果要使用寄存器的变量编号添加,则他们可能会增加寄存器变量资源利用的开销,这意味着当在函数调用点替换内联函数主体时,该函数使用的变量总数也会被插入。因此,该用于变量的寄存器数量也将增加。因此,如果函数内联后的变量数急剧增加,则肯定会导致寄存器利用率增加。
(2)如果使用太多的内联函数,则由于重复执行相同的代码,二进制可执行文件的大小将很大。
(3)过多的内联也会降低指令Cache的命中率,从而降低了从高速缓存到主存储器的指令获取速度。
(4)如果有人更改了内联函数中的代码,则内联函数可能会增加编译时间开销,然后必须重新编译所有调用位置,这是因为编译器需要再次替换所有代码以反应更改,否则它将继续使用旧功能。
(5)内联函数对于许多嵌入式系统可能没有用。因为嵌入式系统中,代码大小比速度更重要。
(6)内联函数可能会导致崩溃,因为内联可能增加二进制可执行文件的大小。内存溢出会导致计算机性能下降。
内联函数的优点:
(1)不会发生函数调用开销
(2)他还节省了从函数返回调用的开销
(3)内联函数时,可以使编译器对函数主体执行特定于上下文的优化。对于正常的函数调用,这种优化是不可能的。通过考虑调用上下文和被调用上下文的流程可以获得其它优化。
(4)内联函数可能对于嵌入式系统有用,因为内联函数所产生的代码少于函数调用的前导和返回。

5.说一下Final关键字

Final关键字就是当我们不希望某个函数被子类重写时,我们只需要添加一个Final,这个时候编译的时候就会报错了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值