对象作为参数dectructor调用但不是构造函数?

Stef1611

(我来自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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?

对象的构造函数作为函数参数

将构造对象但不是构造函数的方法

将对象作为构造函数的参数传递

数组作为对象构造函数中的参数

使用可变对象作为构造函数参数

使用默认参数而不是默认构造函数调用构造函数

当我添加一个不同的对象作为复制构造函数的参数时,为什么调用复制构造函数?

将匿名对象作为参数传递时,不会调用任何构造函数

如何通过将对象作为参数来调用javascript / typescript构造函数?

当对象作为参数传递时,为什么不调用我的自定义构造函数?

为什么将类对象作为参数的外部函数在返回相同对象时调用移动构造函数

Python调用函数作为对象的参数传递

调用对象内的函数作为指令的参数

无法从PyYAML调用的构造函数中的参数构造对象

如何访问JavaScript构造函数对象作为IFFI函数参数?

使用“ this”作为构造函数中方法调用的参数

从作为构造函数的参数给出的lambda调用实例方法

当我显式调用构造函数作为参数时,未调用move构造函数

用通用参数而不是显式调用构造函数

使用类构造函数作为可调用对象

将对象作为参数传递给构造函数?

在Javascript构造函数中将键/值对象作为参数传递

参数作为对象传递时的 Typescript 构造函数简写

使用Rcpp公开以指向对象的指针作为参数的构造函数

带有对象指针作为参数的C ++复制构造函数

在构造函数中将对象作为参数传递

如何使用对象类型作为方法/构造函数的参数?

调用对象的构造函数