C++面试考点

1.下面程序在x64下结果

struct  st
{
    int a;
    long long b;
    double c;
};


int main() {
    st s;
    cout << &s.a << endl;
    cout << &s.b << endl;
    cout << &s.c << endl;
    cout << sizeof(s) << endl;
    int* p = nullptr;
    cout << sizeof(p) << endl;

    system("pause");
    return 0;
}

结果:

0000003DC3CAF658
0000003DC3CAF660
0000003DC3CAF668
24
8

知识点1.
结构体每个成员相对结构体首地址的偏移都是每个成员本身大小的整数倍。
知识点2.
x64下,指针为8位。

2.知识点
const int* p; p的内容可以变,*p不可以变。
int * const p; *p可以变,p不可以变。

3.下面程序的结果

int i=0,a=1,b=2,c=3;
i=++a||++b||++c;
printf("%d %d %d %d",i,a,b,c);

结果:1 2 2 3
知识点:
||前++a 返回true,所以不会再计算后面的表达式

4.一元运算符重载

class A
{
public:

    A& operator++()
    {
        return *this;
    }

    A& operator++(int)
    {
        return *this;
    }
};



int main() {

    A a;
    a++; //++(int)
    ++a; //++
    system("pause");
    return 0;
}

5.下面程序

class A
{
public:
    void fun() const
    {
        delete this;
    }

    ~A()
    {
        delete this;
    }
};

void fun()
{
    static int i = 10;
    i++;
    cout << i << endl;
}


int main() {
    A *a = new A();
    a->fun();
    delete a;

    system("pause");
    return 0;
}

析构函数中会导致无限循环,堆栈溢出。fun按原理说不会出错,但vs下会出错。

6.多态分为静态和动态多态,静态多态也就是函数重载,包括函数重载和运算符重载
7.C++中的常量折叠:指const变量(即常量)值 放在编译器的符号表中 ,计算时编译器直接从表中取值,省去了访问内存的时间,从而达到了优化。

const int i = 0;
int *j = (int *)&i;
*j = 1;
printf("%d,%d", i, *j);

C++结果:0,1
8.数组指针和二级指针的区别

  • 二级指针是指向指针的指针, 也就是说二级指针必须指向一个一级指针, 而这个一级指针存放的是一个内存地址。
  • 一维数组可以看成是一级指针,但是二维数组却不能看成是二级指针。

就以a[2][3]举例:
a[2][3]其实就是两个维度为3的一维数组合并起来的二维数组, 也可以看成是一个一级数组指针 所以并不能用二级指针直接操作二维数组。 应该使用 数组指针int (*p)[3] = a;

原文地址:https://www.cnblogs.com/ggzone/p/10121256.html