(我来自C世界,并且是C ++的初学者,所以只需回答这个问题即可)
在c ++中,参数按值传递。因此,我尝试使用以下代码来了解其工作原理。
#include <iostream>
using namespace std;
class MyClass {
int a;
public:
MyClass() {
a = 0;
cout<<"Default Constructor call\n"; }
MyClass(int x) {
a = x;
cout<<"Constructor call\n"; }
~MyClass() {
cout<<"Destructor call\n"; }
};
void myfoo(MyClass arg) {}
int main() {
cout<<"Obj declaration\n";
MyClass obj(10);
cout<<"Function call\n";
myfoo(obj);
cout<<"End of main\n";
}
因为没有构造函数MyClass(MyClass&xxx),所以在函数末尾调用析构函数,而在开始时不调用构造函数。
那么,如何在函数中构造对象arg呢?一个简单的内存副本?总是拥有构造函数MyClass(MyClass&xxx)是否足够?
并且在开始时不调用构造函数
不太正确。该拷贝构造函数被调用,这是编译器隐式定义。您可以自己定义:
MyClass(const MyClass& other) { cout << "Copy Constructor call\n"; }
隐式副本构造函数使用其副本构造函数复制每个成员。如果无法复制任何成员,则复制构造函数被隐式删除。
可以显式禁用复制构造函数。在C ++ 11之前的日子里,习惯用法是将其声明为私有。在现代C ++中,使用了delete
关键字:
MyClass(const MyClass& other) = delete;
如果执行此操作,则代码将无法编译。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句