是否有一种方法可以始终通过值(制作副本)而不是在使用类成员函数时通过参考来传递

Is there a way to always pass by value (Make a copy) rather than passing by reference when working with class member functions?

本文关键字:函数 参考 成员 一种 方法 是否 副本      更新时间:2023-10-16

对于一些背景,我已经研究了C 3个月,所以我基本上是一个新手,我正在尝试理解包含原始指针作为数据成员以及如何使用的类抄写器并与它们移动语义。

所以我有一个简单的类,其中包含一个简单的构造函数/驱动器和一个未实现的复制构建器。

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

所以我的问题是:

我能以某种方式保证,当我调用成员函数时,我会制作一个对象的副本,而不是通过参考将其传递给它?

如果添加"&",则可以通过参考轻松传递某些内容。但是操作员如何按价值传递东西?我已经阅读了按值按值的通行证是编译器这样做的默认方式,但是由于某种原因,当我执行代码时,复制构造函数未调用。

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;
    }

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

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

感谢您的任何帮助。

好吧,如果要复制对象,然后在新对象上调用函数,则需要明确地进行操作:

dog test{};
dog{test}.talk("copy talk");

请注意,您还需要实际实现副本构造函数以使其工作,否则课程将不可原始化:

dog(const dog &source)
: name{new string{*(source.name)}}
, age{new int{*(source.age)}}
{
       cout << "copy constructor for " << *name << endl;
}

是否有一种方法可以始终通过值(制作副本(而不是在使用类成员函数时通过参考来传递?

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

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 ");
}