一起做网站17杭州女装,青岛栈桥介绍,网络营销推广方案论文,局域网组网方案c编译器可能会给类添加四个函数
1默认构造函数
2默认析构函数
3默认拷贝构造函数#xff0c;对成员变量进行浅拷贝。
4默认赋值函数#xff0c;队成员变量进行浅拷贝。
#includeiostream
using namespace std;
class CGirl
{
public:int m_bh;string m_name;voi…c编译器可能会给类添加四个函数
1默认构造函数
2默认析构函数
3默认拷贝构造函数对成员变量进行浅拷贝。
4默认赋值函数队成员变量进行浅拷贝。
#includeiostream
using namespace std;
class CGirl
{
public:int m_bh;string m_name;void show() { cout 编号: m_bh , 姓名 m_name endl; }
};
int main() {CGirl g1, g2;g1.m_bh 8;g1.m_name zhongge;g1.show();g2.show();return 0;
}
定义一个CGirl类有公有成员编号和姓名还有个show方法输出姓名编号
创建俩对象g1 g2给g1赋值不给g2赋值 现在让 g2g1并展示g2
#includeiostream
using namespace std;
class CGirl
{
public:int m_bh;string m_name;void show() { cout 编号: m_bh , 姓名 m_name endl; }
};
int main() {CGirl g1, g2;g1.m_bh 8;g1.m_name zhongge;g1.show();g2 g1;//行代码就是对象的赋值运算和普通变量的赋值不一样普通变量的赋值是一对一的关系。对象的赋值是多对多的但也是一一对应的。g2.show();return 0;
} 对象的赋值运算是用一个已经存在了的对象给另一个已经存在的对象赋值。
如果类的定义没有重载赋值函数编译器就会提供一个默认的赋值函数如果类中重载了赋值函数编译器将不提供默认赋值函数。
重载复制函数的语法
类名 operator(const 类名 源对象)
#includeiostream
using namespace std;
class CGirl
{
public:int m_bh;string m_name;void show() { cout 编号: m_bh , 姓名 m_name endl; }CGirl operator(const CGirl g) {this-m_bh g.m_bh;this-m_name g.m_name;cout 调用了重载赋值函数 endl;return *this;}
};
int main() {CGirl g1, g2;g1.m_bh 8;g1.m_name zhongge;g1.show();g2 g1;g2.show();return 0;
} 编译器提供的默认赋值函数是浅拷贝如果对象中不存在堆区内存空间默认赋值函数可以满足需求否则要用深拷贝。
重载赋值函数深拷贝的代码
#includeiostream
using namespace std;
class CGirl
{
public:int m_bh;string m_name;int* m_ptr;CGirl() { m_ptr nullptr; }~CGirl() { if (m_ptr)delete m_ptr; }void show() { cout 编号: m_bh , 姓名 m_name , m_ptrm_ptr endl; }CGirl operator(CGirl g) {this-m_bh g.m_bh;this-m_name g.m_name;if (g.m_ptr nullptr) {if (m_ptr ! nullptr) { delete m_ptr; m_ptr nullptr; }}else {if (m_ptr nullptr)m_ptr new int;memcpy(m_ptr, g.m_ptr, sizeof(int));}cout 调用了重载赋值函数 endl;return *this;}
};
int main() {CGirl g1, g2;g1.m_ptr new int(3);g1.show();g2 g1;g2.show();return 0;
}
拷贝构造与赋值运算不同拷贝构造是指原来的对象不存在用已存在的对象进行构造赋值运算是指已存在了两个对象把其中一个对象的成员变量的值赋值给另一个对象的成员变量。