将参数传递为Value

Bob*_*421 -3 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;
}
Run Code Online (Sandbox Code Playgroud)

在这一行上有一些我不理解的东西:

a1.add1(a2);
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢

Lig*_*ica 6

构造函数称为:拷贝构造函数.

由于您没有自己定义一个(您只创建了默认构造函数),编译器为您创建了一个.因为它为你制作了一个,std::cout它内部没有线提供证据!

复制构造函数将如下声明:

MaClasse(const MaClasse&);
Run Code Online (Sandbox Code Playgroud)

并定义如下:

MaClasse::MaClasse(const MaClasse&)
{
    std::cout << "Constructeur de copy" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

...除了你还需要让它做复制构造的东西,即复制初始化你的所有成员.

全押,你最终得到类似的东西:

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

顺便提一下,你的默认构造函数也应该初始化那些成员,可能是零.

  • 是的,但是您的定义也应该手动复制成员,因为没有合成的复制构造函数可以为您处理.我知道你知道这一点,但这个答案的读者可能会感到困惑 (4认同)