Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将参数作为值传递 查找一个基本的C++代码: #include <iostream> class MaClasse { public: MaClasse(); void afficher(); void set(int valeur1,int valeur2); void add1(MaClasse c2); int _valeur1; int _valeur2; }; MaClasse::MaClasse() { std::cout << "Constructeur" << std::endl; } void MaClasse::afficher() { std::cout << _valeur1 << " " << _valeur2 << std::endl; } void MaClasse::add1(MaClasse c2) { c2._valeur1++; c2._valeur2++; } void MaClasse::set(int valeur1,int valeur2) { _valeur1 = valeur1; _valeur2 = valeur2; } int main(int argc, char *argv[]) { MaClasse a1; a1.set(10,20); MaClasse a2; a2.set(30,40); a1.add1(a2); a2.afficher(); return 0; }_C++ - Fatal编程技术网

将参数作为值传递 查找一个基本的C++代码: #include <iostream> class MaClasse { public: MaClasse(); void afficher(); void set(int valeur1,int valeur2); void add1(MaClasse c2); int _valeur1; int _valeur2; }; MaClasse::MaClasse() { std::cout << "Constructeur" << std::endl; } void MaClasse::afficher() { std::cout << _valeur1 << " " << _valeur2 << std::endl; } void MaClasse::add1(MaClasse c2) { c2._valeur1++; c2._valeur2++; } void MaClasse::set(int valeur1,int valeur2) { _valeur1 = valeur1; _valeur2 = valeur2; } int main(int argc, char *argv[]) { MaClasse a1; a1.set(10,20); MaClasse a2; a2.set(30,40); a1.add1(a2); a2.afficher(); return 0; }

将参数作为值传递 查找一个基本的C++代码: #include <iostream> class MaClasse { public: MaClasse(); void afficher(); void set(int valeur1,int valeur2); void add1(MaClasse c2); int _valeur1; int _valeur2; }; MaClasse::MaClasse() { std::cout << "Constructeur" << std::endl; } void MaClasse::afficher() { std::cout << _valeur1 << " " << _valeur2 << std::endl; } void MaClasse::add1(MaClasse c2) { c2._valeur1++; c2._valeur2++; } void MaClasse::set(int valeur1,int valeur2) { _valeur1 = valeur1; _valeur2 = valeur2; } int main(int argc, char *argv[]) { MaClasse a1; a1.set(10,20); MaClasse a2; a2.set(30,40); a1.add1(a2); a2.afficher(); return 0; },c++,C++,如您所见,我传递的不是指针,而是对象本身。当我显示a2值时:它们没有改变 但是,我不明白为什么不调用构造函数。a2应该被复制吗 谢谢一个构造函数被称为:复制构造函数 由于您没有自己定义一个构造函数,所以只创建了一个默认构造函数,编译器为您创建了一个。因为它为你做了一个,所以里面没有std::cout线来提供证据 副本构造函数的声明方式如下: MaClasse(const MaClasse&); MaClasse::MaClasse(const MaClasse&) {

如您所见,我传递的不是指针,而是对象本身。当我显示a2值时:它们没有改变

但是,我不明白为什么不调用构造函数。a2应该被复制吗

谢谢

一个构造函数被称为:复制构造函数

由于您没有自己定义一个构造函数,所以只创建了一个默认构造函数,编译器为您创建了一个。因为它为你做了一个,所以里面没有std::cout线来提供证据

副本构造函数的声明方式如下:

MaClasse(const MaClasse&);
MaClasse::MaClasse(const MaClasse&)
{
    std::cout << "Constructeur de copy" << std::endl;
}
定义如下:

MaClasse(const MaClasse&);
MaClasse::MaClasse(const MaClasse&)
{
    std::cout << "Constructeur de copy" << std::endl;
}
…除非您还需要使其执行复制构造性操作,即复制初始化所有成员

总而言之,你最终会得到这样的结果:

MaClasse::MaClasse(const MaClasse& other)
   : _valeur1(other._valeur1)
   , _valeur2(other._valeur2)
{
    std::cout << "Constructeur de copy" << std::endl;
}

顺便说一句,默认构造函数也应该初始化这些成员,可能是零。

您希望通过引用传递参数。通过值传递创建副本。是的,但是您的定义也应该手动复制成员,因为已经没有合成副本构造函数来为您处理这些了。我知道你知道这一点,但这个答案的读者可能是confused@Ayxan这是一个公平的观察。我会说明这需要做。谢谢我在末尾添加了它,而不是修改了原始的copyctor示例,因为我认为这是一个更好的故事,它展示了默认的ctor如何也需要从其等效的原始状态扩展