C++的编译器会给一个空的类提供六个函数
- 默认构造函数
- 析构函数
- 拷贝构造
- 拷贝赋值
- 移动构造
- 移动赋值
在提供构造函数时,编译器将不再提供默认构造
这些函数在对象传参、返回对象、接收对象时会自动调用,所以有必要进行相应的优化,减少这种隐式调用
以下面这段代码为例:
#include <iostream>
class Foo {
public:
Foo(int a) : _a(a) { std::cout << "Foo(int)" << std::endl; }
~Foo() { std::cout << "~Foo()" << std::endl; }
Foo(const Foo &val) : _a(val._a) {
std::cout << "Foo(const Foo&)" << std::endl;
}
Foo(Foo &&val) : _a(val._a) { std::cout << "Foo(Foo&&)" << std::endl; }
Foo &operator=(const Foo &val) {
if (this == &val)
return *this;
_a = val._a;
return *this;
}
Foo &operator=(Foo &&val) {
if (this == &val)
return *this;
_a = val._a;
return *this;
}
int getA() const { return _a; }
private:
int _a;
};
Foo bar(Foo f) { // 3. Foo(const Foo&)
int a = f.getA();
Foo tmp(a);
return tmp;
}
Foo bar2(const Foo &f) { return Foo{f.getA()}; }
int main() {
{
Foo f1(42); // 1. Foo(int)
Foo f2(10); // 2. Foo(int)
f2 = bar(f1); // 4. Foo(int)
}
std::cout << "============================" << std::endl;
{
Foo f3(42); // 1. Foo(int)
Foo f4 = bar2(f3); // 2. Foo(int)
}
}
运行结果如下:
eric@eric-XPS-13-9360:~/tmp$ g++ main.cpp
eric@eric-XPS-13-9360:~/tmp$ ./a.out
Foo(int)
Foo(int)
Foo(const Foo&)
Foo(int)
~Foo()
~Foo()
~Foo()
~Foo()
============================
Foo(int)
Foo(int)
~Foo()
~Foo()
标签:传参,接收,int,对象,Foo,优化,eric,构造函数
From: https://www.cnblogs.com/ericling0529/p/18148749