看下面这个基本的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吗?
谢谢
答案 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;
}
顺便说一句,您的默认构造函数还应该初始化这些成员,可能会初始化为零。