将参数作为值传递

时间:2018-12-17 18:41:53

标签: c++

看下面这个基本的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;
}

在这一行上我有些不明白:

a1.add1(a2);

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

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

谢谢

1 个答案:

答案 0 :(得分:6)

一个构造器 被称为:复制构造器。

由于您没有自己定义(您仅创建了 default 构造函数),因此编译器为您创建了一个。而且由于它为您创造了一个,所以里面没有std::cout行可以提供证据!

将使用以下方式声明副本构造函数:

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

顺便说一句,您的默认构造函数还应该初始化这些成员,可能会初始化为零。