在处理类成员函数时,是否有一种方法可以始终按值传递(制作副本),而不是按引用传递? 一个小的背景,我已经学习C++ 3个月了,所以我基本上是新手,我试图理解包含数据指针的原始指针和如何使用复制契约并移动语义的类。
所以我有一个简单的类,它包含一个简单的构造函数/析构函数和一个未实现的复制构造函数 我所做的就是使用所述类创建一个对象,然后用它调用一个成员函数 所以我的问题是: 我能保证当我调用成员函数时,我会复制调用它的对象,而不是通过引用传递它吗 如果添加&运算符,可以很容易地通过引用传递某些内容,但是通过值传递某些内容呢? 我已经读到,passby value是编译器执行它的默认方式,但是由于某些原因,当我执行代码时,不会调用复制构造函数在处理类成员函数时,是否有一种方法可以始终按值传递(制作副本),而不是按引用传递? 一个小的背景,我已经学习C++ 3个月了,所以我基本上是新手,我试图理解包含数据指针的原始指针和如何使用复制契约并移动语义的类。,c++,class,pointers,C++,Class,Pointers,所以我有一个简单的类,它包含一个简单的构造函数/析构函数和一个未实现的复制构造函数 我所做的就是使用所述类创建一个对象,然后用它调用一个成员函数 所以我的问题是: 我能保证当我调用成员函数时,我会复制调用它的对象,而不是通过引用传递它吗 如果添加&运算符,可以很容易地通过引用传递某些内容,但是通过值传递某些内容呢? 我已经读到,passby value是编译器执行它的默认方式,但是由于某些原因,当我执行代码时,不会调用复制构造函数 using namespace std; class
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指针通过引用传递的
在调用函数时,我如何更改它并实际复制对象
谢谢你的帮助
在处理类成员函数时,是否有一种方法可以始终按值传递而不是按引用传递副本
使用静态操作按值接收实例
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 ");
}
如果要复制对象,然后对新对象调用函数,则需要显式执行:
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;
}
我只是想说清楚。在您的示例中,您希望test.talk创建一只新狗,调用talk并立即销毁它?如果是这样,为什么呢?你也可以创建一个临时狗,并调用该方法。狗{}.talkhi@Frank我只想在调用test.talk函数时复制测试对象,而不是使用This通过引用传递它pointer@RaXeD我问的原因是我觉得这是一个XY问题,C++所提供的其他机制可能更好地为你所要完成的任务提供更好的服务。对对象调用方法会调用该对象上的方法,而不是该对象的副本。一言不发。虽然在大多数实现中,方法调用可能被实现为一个函数调用,并带有一个额外隐藏的this参数,但这在逻辑上并不是这样。这实际上是可行的,但我必须将测试对象作为函数参数传入。在调用函数时,有没有办法复制对象:test.talkTest\u Text@RaXeD你必须明白你不想跟随语言的行为,所以你必须明确地要求拷贝,无论以什么方式去做-这正是我想做的谢谢你的帮助!