zoukankan      html  css  js  c++  java
  • GEEK学习笔记— —程序猿面试宝典笔记(二)

    所谓笔记,就是比較个人的东西,把个人认为有点意思的东西记录下来~~

    程序猿面试宝典笔记(一)基本概念
    程序猿面试宝典笔记(二)预处理、const和sizeof
    程序猿面试宝典笔记(三)auto_ptr、递归
    程序猿面试宝典笔记(四)面向对象、类型转换、static
    程序猿面试宝典笔记(五)数据结构基础
    程序猿面试宝典笔记(六)软件測试

    题目

    写一个“标准”宏MIN。这个宏输入两个參数并返回较小的一个。

    解析

    为什么要把如此简单的题目也放进来呢?为了强调宏定义里面括号的重要性!

    。!

    答案

    #define MIN(A,B) ((A) <= (B) ? (A) : (B))

    题目

    const与指针的关系?const成员函数?以及mutable!

    解析

    一般分为4种情况:

    int b = 500;
    const int* a = &b;
    int const* a = &b;
    int* const a = &b;
    const int* const a = &b;

    答案

    1)先看情况1。假设const位于星号的左側,则const就是用来修饰指针所指向的变量,即指针指向为常量。假设const位于星号的右側。const就是修饰指针本身。即指针本身是常量。

    因此,1和2的情况同样,都是指针所指向的内容为常量(const放在变量声明符的位置无关),这样的情况下不同意对内容进行更改操作。

    对于情况1。能够先不进行初始化。

    由于尽管指针内容是常量。但指针本身不是常量。


    2)情况2与情况1同样。
    3)情况3为指针本身是常量。这样的情况下不能对指针本身进行更改操作,而指针所指向的内容不是常量。

    对于情况3,定义时必须同一时候初始化。
    4)对于情况4为指针本身和指向的内容均为常量。


    以下再说一下const成员函数是什么?
    我们定义的类的成员函数中。经常有一些成员函数不改变类的数据成员,也就是说。这些函数是“仅仅读”函数。而有一些函数要改动类数据成员的值。

    假设把不改变数据成员的函数都加上const关键字进行标识。显然。可提高程序的可读性。事实上,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图改动数据成员的值,则编译器按错误处理。
    在const成员函数中。用mutable修饰成员变量名后,就能够突破const的限制,改动类的成员变量了。

    题目

    const与#define相比有什么不同?

    答案

    C++语言能够用const定义常量,也能够用#define定义常量,可是前者比后者有很多其它的长处:
    ● const常量有数据类型。而宏常量没有数据类型。编译器能够对前者进行类型安全检查,而对后者仅仅进行字符替换,没有类型安全检查。而且在字符替换中可能会产生意料不到的错误(边际效应)。


    ● 有些集成化的调试工具能够对const常量进行调试,可是不能对宏常量进行调试。

    在C++程序中仅仅使用const常量而不使用宏常量,即const常量全然代替宏常量。

    题目

    以下两段程序分别输出什么?
    代码一

    #include <iostream>
    
    using namespace std;
    
    class A
    {
    private:
        bool a;
        int b;
        bool c;
    };
    
    class B
    {
    private:
        int b;
        bool a;
        bool c;
    };
    
    int main()
    {
        cout << sizeof(A) << endl;
        cout << sizeof(B) << endl;
        return 0;
    }

    代码二

    #include <iostream>
    
    using namespace std;
    
    #pragma pack(1)
    class A
    {
    private:
        static bool a;
        int b;
        bool c;
    };
    
    class B
    {
    private:
        int b;
        bool a;
        bool c;
    };
    
    int main()
    {
        cout << sizeof(A) << endl;
        cout << sizeof(B) << endl;
        return 0;
    }
    

    解析

    非常明显,这道题是考察结构的对齐。

    一般来说。为了方便对结构体内元素的訪问和管理。结构体的长度一定是最长的数据元素的整数倍。
    代码一类A的对齐为
    |bool|—-|—-|—-|
    |——–int———|
    |bool|—-|—-|—-|
    代码一类B的对齐为
    |——–int———|
    |bool|bool|—-|—-|
    而代码二用pack预处理指令来禁止对齐调整。所以就是本身的内存大小。

    可是须要注意sizeof是计算栈中分配的内存大小,静态变量是存放在全局数据区。不会被计算在内。

    答案

    代码一:类A 12字节;类B 8字节
    代码二:类A 5字节;类B 6字节

  • 相关阅读:
    还不懂MySQL索引?这1次彻底搞懂B+树和B-树
    11条MySQL规范,你知道的有几个?
    4个点说清楚Java中synchronized和volatile的区别
    还不知道如何实践微服务的Java程序员,这遍文章千万不要错过!
    14个Java并发容器,你用过几个?
    分布式事务解决方案,中间件 Seata 的设计原理详解
    一篇文章搞明白Integer、new Integer() 和 int 的概念与区别
    一线大厂面试官最喜欢问的15道Java多线程面试题
    70道阿里百度高频Java面试题(框架+JVM+多线程+算法+数据库)
    关于spark当中生成的RDD分区的设置情况。
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7286925.html
Copyright © 2011-2022 走看看