对象和引用
代码演示:
#include<iostream>
using namespace std;
class A {
public :
A() = default;
A(const A&) = default;
private :
};
class B {
public :
B(A &a) : a(a) {}
private :
A &a;
};
class C {
public :
C() = default;
C(const C &) = default;
static void destroy(C *c) {
delete c;
return ;
}
private :
~C() {}
};
int main() {
A a;
B b(a);
C *c = new C();
C::destroy(c);
return 0;
}
返回值优化
先回顾一下一个对象是如何进行创建的:
如下代码:
#include<iostream>
using namespace std;
class A {
public :
A() {
cout << this << " default constructor" << endl;
}
A(const A &) {
cout << this << " copy constructor" << endl;
}
string s;
};
A func() {
//这里创建temp调用了默认构造
A temp;
cout << "temp = " << &temp << endl;
temp.s = "hello func";
//return这里会有一个匿名对象
//然后temp会通过拷贝构造拷贝给这个匿名对象
return temp;
}
int main() {
//然后这里的a通过拷贝构造,拷贝这个匿名对象
//那么创建a对象最终会调用
//一次默认构造,两次拷贝构造对吧
A a = func();
cout << "a = " << &a << endl;
return 0;
}
执行结果:
会发现结果只调用了一次默认构造,也就是在调用func函数时创建temp进行调用的默认构造,这就就是编译器进行了返回值优化,可以看到对象a的地址和对象的temp的地址一摸一样都没变,说明中间的这些拷贝过程就是浪费资源。
那么我在编译时关闭了,返回值优化,再看结果
和我对于代码的分析是一样的。