C++ 按值传递类
C++ Passing class by value
当我在XCode版本5.1.1中运行以下程序时,
#include <iostream>
class MyClass
{
public:
MyClass() { std::cout << "MyClass Cons " << this << std::endl;}
~MyClass() { std::cout << "MyClass Dest " << this << std::endl;}
};
void Func(MyClass myClass)
{
}
int main(int argc, const char * argv[])
{
MyClass myClass1;
Func(myClass1);
return 0;
}
我得到的输出是
MyClass Cons 0x7fff5fbff918
MyClass Dest 0x7fff5fbff910
MyClass Dest 0x7fff5fbff918
为什么析构函数触发两次,构造函数只触发一次?
对象被销毁一次,从指针值中可以看出。您还会看到另一个对象的破坏。此对象是原始对象的副本。
通过按值传递对象,将调用copy-constructor
。由于此构造函数不打印某些内容,因此在输出中看不到它。
将其添加到类定义中:
MyClass(const MyClass & other) { std::cout << "MyClass Copy-Cons " << this << " from " << &other << std::endl;}
它应该出现:
MyClass Cons 0x7fff1beee7ee
MyClass Copy-Cons 0x7fff1beee7ef from 0x7fff1beee7ee
MyClass Dest 0x7fff1beee7ef
MyClass Dest 0x7fff1beee7ee
当您输入 Func()
时,将创建副本。副本在超出范围时将被销毁。当您退出 Func()
时会发生这种情况。最后,当您退出main()
函数时,原始文件将被销毁。
您看到两个析构函数的原因是因为您按值传递参数。按值传递调用复制构造函数。
第一个析构函数:
At the end of the func function, the object goes out of scope, hence, it is destructed
.
第二个析构函数:
When the program end, the object is destructed.
我删除第一个析构函数的建议是通过引用而不是按值传递对象。
例如
void Func(MyClass &myClass)
{
}
所以现在输出将只有:
MyClass Cons 0x7fff5fbff918
MyClass Dest 0x7fff5fbff918
在这里,对象被构造了两次(正如上面提到的(。因此,调用 2 个构造函数 + 2 个析构函数。您看到 1 个构造函数的原因是您尚未定义复制构造函数。为按值传递操作创建副本时调用 CC。
添加复制构造函数,然后可以看到调用的两个构造函数。
Add Copy constructor - MyClass(const MyClass& obj( { std::cout <<"MyClass Copy Cons " <<this <<std::endl;}
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 不同于按值传递和常量引用传递的程序集
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么按值传递QStringView比引用常量更快?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 防止在按值传递对象(继承)时进行切片
- 按值传递类和结构
- C++按引用传递还是按值传递?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 可移动但不可复制的对象:按值传递还是按引用传递?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 在C++中指针是按值传递的吗
- shared_ptr构造函数参数是否应按值传递
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?