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;
}