1.函数调用的参数是以什么顺序压栈的,为什么?
从右向左压栈的。因为C, C++支持可变参函数。
可变参函数就是参数个数可变的函数,如printf()就是可变参函数
void func(int a,...){}
2.有一个函数
在main函数中通过:string s = fun(s1, s2);调用,按照代码执行顺序分析一下调用了什么构造函数和顺序,以及析构函数的调用顺序。
由于fun函数定义中没有使用&,故调用时进行拷贝构造。
- 拷贝构造s2
- 拷贝构造s1
- 执行string tmp = s1+s2; 拷贝构造tmp
- 使用tmp拷贝构造string s(如果使用临时对象拷贝构造新对象,那么临时对象就不产生了,直接构造新对象即可。
但如果是
string s;
s = fun(s1, s2);
那么临时对象就存在,并且s的构造函数是赋值构造。
析构时正好相反,先析构tmp,然后s1,然后s2,最后main函数结束析构s
3.空结构体有多大?
struct Data1{
};
对于C语言:
windows下,vs 2013 15 17 20是不允许定义空的struct结构体
linux/unix系统下,sizeof(Data)=0,因为在C语言中,struct是结构体变量,定义变量只需要内存即可,空的结构体什么也没有,无需内存。
对于C++:
windows/linux/unix系统下均为1,在C++中,struct不叫变量,而是对象,需要内存+构造,什么也没有也需要分配一块最小的内存,有了这块内存才能给构造函数的this指针传东西,才能构造,才能创建对象,这块最小的内存就是1.
struct Data3:public Data1{
};
sizeof(Data3)是多大? 也是1
struct Data2{char a1;
};
sizeof(Data2)是多大? 也是1 (此时不再按照空结构体占一个字节算,char是1个字节)