首页 > 解决方案 > 在使用类成员函数时,有没有办法始终按值传递(制作副本)而不是按引用传递?

问题描述

对于一点背景,我已经学习了 3 个月的 c++,所以我基本上是一个新手,我试图理解包含作为数据成员的原始指针的类以及如何使用复制承包商和移动语义。

所以我有这个简单的类,它包含一个简单的构造函数/析构函数和一个未实现的复制构造函数。

我所做的就是使用所述类创建一个对象,然后用它调用一个成员函数。

所以我的问题是:

我能以某种方式始终保证当我调用成员函数时,我会复制调用它的对象而不是通过引用传递它吗?

如果添加“&”运算符,您可以轻松地通过引用传递某些内容,但是按值传递内容呢?我已经读过按值传递是编译器执行此操作的默认方式,但由于某种原因,当我执行我的代码时,不会调用复制构造函数。

using namespace std;

    class dog {
    public:
        string* name;
        int* age;

        dog(string NameVal = { "Null" }, int AgeVal = { 10 }) { 
            name = new string{ NameVal };
            age = new int{ AgeVal };
            cout << "constructor for " << *name << endl;
        }
        ~dog() {
            cout << "destructor for " << *name << " " << age << endl;
        }
        dog(const dog &source) {
            cout << "copy constructor for " << *name << endl;
        }
        void talk(string text) {
            cout << text << *name << endl;
        }
    };

    int main() {
        dog test;

        test.talk("Test_Text ");
        return 0;
    }

所以我希望复制构造函数会被测试对象调用,但看起来它是使用“this”指针通过引用传递的。

在调用函数时如何更改它并实际制作对象的副本?

谢谢你的帮助。

标签: c++classpointers

解决方案


在使用类成员函数时,有没有办法始终按值传递(制作副本)而不是按引用传递?

使用静态操作按值接收实例

class dog {
       ...
       static void talk(dog inst, string text) {
            cout << text << *(inst.name) << endl;
        }
       ...
};

int main() {
    dog test;

    dog::talk(test, "Test_Text ");
    // or even
    test.talk(test, "Test_Text ");
}

推荐阅读