试题一
请问如下函数调用了什么构造函数和析构函数,以及调用的顺序是什么?
如果 fun函数里写成 return s1 + s2 有什么变化?
string fun(strings1, string s2)
{
string tmp = s1 + s2;
return tmp;
}
int main()
{
string s = fun(s1, s2);
return 0;
}
解答
如果 fun
函数里写成 return s1 + s2
,那么就是省略了第3步的拷贝构造以及tmp
的析构
注意
第4步,tmp
直接拷贝构造s是编译器进行了优化,任意的C++编译器都会做如下优化:
如果用临时对象拷贝构造新对象,那么临时对象就不产生了,直接构造新对象即可。即 string str1 = string(“hello”); 《=》 string str1(“hello”);
参数传引用可以省去拷贝构造函数
返回对象时直接返回结果,不要先定义再返回,可以省去多余对象的构造和析构
试题二:空结构体大小
-
win下vs中C语言中不允许定义空的
struct
结构体(C) -
gcc linux/unix系统下 空的
struct
结构体大小为0 (C) -
win下vs以及
gcc/g++
下 C 和C++ 空结构体大小都为1B -
C中
struct
是一个变量 -
C++中
struct
是一个对象,需要内存,还需要构造,构造函数需要在一块地址上构造,所以会有一个1B的空间构造函数中可打印this指针
例子1
struct Data1{};
struct Data2 :public Data1{};
sizeof(Data2) = 1
例子2
struct Data1
{
virtual void func(){}
};
struct Data2 :public virtual Data1{};
sizeof(Data2) = 8 // vfptr + vbptr