c++ corner case

1. 定义一个空类型,不包含任何成员变量和函数,用sizeof大小为什么?

#include <iostream>
using namespace std;

class A {
};

int main() {
    cout << sizeof(A) << endl;
    return 0;
}

答:这种取决于编译器的定义,看空类型占用多少个字节。

第一种:占字节1,为什么是1而不是0呢,这是因为定义一个类型要生成对象肯定是要占用一定空间的,1只是占位大小。

第二种:在类型里加入构造函数和析构函数,sizeof的大小还是1

第三种:如果在空类型里加入一个函数,而没有实现,sizeof的结果依然是1

第四种:如果空类型里加入了一个int变量类型的变量之后呢?我们用sizeof的时候,发现大小变成了4

第五种:加入虚函数,类型就需要创建一个虚函数列表,有一个指针指向虚函数,指针的sizeof结果决定于系统,32位系统为4,64位系统为8 ,不过这个类型里只有一个指针指向虚函数列表,不管你定义几个虚函数

第六种:如果类型中既有虚函数占8个字节,又定义int占用4个字节,那这个类的sizeof是16个字节。因为会按8进行对齐

2. 定义一个类型,包含一个long和2个int,如果把long放到第一个定义和放到第二个定义,分别占用几个字节?

#include <iostream>
using namespace std;

class A { 
private:
    int value;
    int value2;
    long value3;
};

int main() {
    cout << sizeof(A) << endl;
    return 0;
}

答:根据计算机系统不同,占用的字节数会有区别,假设按int占用4个字节,long占用8个字节考虑。

第一种:当long放到第一个和最后一个定义时,总共占用16个字节

第二种:当long放到中间位置定义时,总共会占用24个字节

这是因为会按大字节对齐以保证读写速度

3. 拷贝构造函数

#include <iostream>
using namespace std;

class A { 
private:
    int value;
    int value2;
    long value3;
public:
    A(int n) {
        value = n;
    }   

    A(A other) {
        value = other.value;
    }   

    void Print() {
        cout << value << endl;
    }   

    ~A() {
    }   
};

int main() {
    A a = 10; 
    A b = a;
    b.Print();

    return 0;
}

上面程序有什么问题?

答:当编译上面程序的时候会出错,因为复制构造函数传入的是值而不是引用或者指针,会造成在传递过程中重新构造other的情况,会返回调用复制构造函数造成死循环。解决方法:把传值改成传递常量引用可以解决这个问题:

#include <iostream>
using namespace std;

class A { 
private:
    int value;
    int value2;
    long value3;
public:
    A(int n) {
        value = n;
    }   

    A(const A& other) {
        value = other.value;
    }   

    void Print() {
        cout << value << endl;
    }   

    ~A() {
    }   
};

int main() {
    A a = 10; 
    A b = a;
    b.Print();

    return 0;
}

猜你喜欢

转载自blog.csdn.net/lwc5411117/article/details/83211524