对象的赋值。
#include <iostream>
using namespace std;
class Sample
{
public:
Sample(){}
Sample(int a){x=a;}
Sample(Sample &a){x=a.x++;}
void disp(){cout<<x++;}
private:
int x;
};
void fun(Sample &s1, Sample s2) {
s1.disp ();s2.disp ();
}
int main()
{
Sample s1(2),s2=s1;
fun(s2,s1);
s1.disp ();
s2.disp ();
}
若类中没有析构函数,则类的两个对象的赋值,为直接赋值,分别令其数据成员相等即可。
若有对应匹配的构造函数,则调用构造函数进行赋值。
此题注意s1,s2实参和形参顺序不一致。
s1.x初始化为3
s2.x初始化为2
进入fun语句。 s2为引用传递,即形参为s2的别名,调用disp后s2实参的值也对应发生变化,s2.x=3.s1为值传递。调用构造函数赋值,因此s1本身又加1,s1.x=4,而形参的x的3。
输出 2 3
然后 s1输出 4
s2输出3
答案 2343
例题2 析构函数
#include
using namespace std;
class Sample
{
int x;
public:
Sample(){x=0;}
Sample(int a) {cout<<(x=a);}
~Sample()
{
cout<<++x;
}
void disp()
{
cout<<x;
}
};
int main()
{
Sample s1(2);
s1.disp ();
s1.~Sample ();
s1.disp();
}
手动调用析构函数,对象不销毁内存空间(非new创建的对象)
浅拷贝(位拷贝)和深拷贝
浅拷贝:即简单的将实参的数据成员复制给了形参,二者各占独立的空间。
深拷贝:通过构造函数来实现,通常将构造函数的形参设为const避免被改变,
c++默认参数特点:
1、当函数既有原型声明又有定义的时候,默认参数就只能在原型声明中定义。
2、在函数原型中,所有带默认值得参数都必须出现在没有默认值的右边,也就是一开始定义带有默认值的参数,后边就不能再定义没有默认值得参数。
3、不循序某个参数省略后,再给其后的参数指定参数值。
例如 Complex(,9,6)是错误的
和特点2 刚刚好反着来。
毕竟左边可能会没有默认参数,所以左边一定要有实参进去。
4、避免二义性
在函数重载中会涉及