上来先给结论:
1、函数参数带【&】表示引用,参数传入不会调用复制构造函数,否则会通过复制构造函数构建临时值
2、如果没有重载【&&】右值引用函数,【const &】也可以接收右值,都分配在栈空间
首先定义类A,编写构造函数、析构函数和赋值运算符
class A {
public:
int val;
A(int v = 0) : val(v) {
cout << val << ": A construct" << endl;
}
~A() {
cout << val << ": A destructor" << endl;
}
A(const A &other) : val(other.val) {
cout << val << ": A copy construct" << endl;
}
A(A &&other) : val(other.val) {
cout << val << ": A move construct" << endl;
}
A &operator=(const A &other) {
val = other.val;
cout << val << ": A operator= invoke" << endl;
return *this;
}
};其他函数调用代码ru'xi
void funObj(A a) {
cout << "in funObj" << endl;
}
void func(A &a) {
cout << "in func0" << endl;
}
void func(const A &a) {
cout << "in func1" << endl;
}
void func(A &&a) {
cout << "in func2" << endl;
}
int main() {
A obj(-1);
funObj(obj);
cout << "out obj" << endl;
A ref;
func(ref);
cout << "out ref" << endl;
const A constRef(1);
func(constRef);
cout << "out constRef" << endl;
func(A(2));
cout << "out rightRef" << endl;
return 0;
}输出如下:
-1: A construct // obj在main中构造,main结束后销毁 -1: A copy construct // obj传入参数, 调用复制构造函数生成临时对象a in funObj // 进入普通参数函数 -1: A destructor // 普通参数函数结束, 临时对象a被销毁 out obj // 普通参数函数退出 0: A construct // ref在main中构造, main结束后销毁 in func0 // 进入引用参数函数 out ref // 引用参数函数退出 1: A construct // 常量 constRef在main中构造, main结束后销毁 in func1 // 进入常量引用参数函数 out constRef // 常量引用参数函数退出 2: A construct // 右值构造 in func2 // 被右值引用参数接收, 分配到栈内存 2: A destructor // 右值引用参数函数结束, 回收栈内存 out rightRef // 右值引用参数函数退出 1: A destructor // main函数结束, 销毁 1 0: A destructor // main函数结束, 销毁 0 -1: A destructor // main函数结束, 销毁 -1

京公网安备 11010502036488号