看一下这个基本的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?
谢谢
构造函数被称为:拷贝构造函数.
由于您没有自己定义一个(您只创建了默认构造函数),编译器为您创建了一个.因为它为你制作了一个,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)
顺便提一下,你的默认构造函数也应该初始化那些成员,可能是零.