彭小盛

又一个WordPress站点

C++构造函数-金创软件工作室

C++构造函数-金创软件工作室
构造函数的种类
如果创建一个类没写构造函数,则系统会自动生成一个默认构造函数,该构造函数没有参数,函数为空,什么都不做田鑫雨 。只要写了如下某一个构造函数,则系统不会生成默认构造函数
1.无参构造函数
A()
{
i = 0;
j = 0;
}
2.一般构造函数
A(int v1鲁伊莎,滕旋 int v2)
{
i = v1;
j = v2;
}
3. 复制构造函数
A(const A& a)
{
i = a.i;
j = a.j;
}
若没有显式的写构造函数,则系统会创建一个默认复制构造函数,
4.类型转换构造函数
A(int v)
{
i = v;
j = 0;
}
根据指定类型的对象创建一个本类对象
5.等号运算符重载
A &operator = (const A& a)
{
if(this == &a)
return *this;
this->i = a.i;
this->j = a.j;
return*this;
}
它不属于构造函数曹曦戈,如果没有显式的写=运算符重载梦开始于篮球,则系统会默认一个,只做基本的拷贝工作。return *this是为了支持连等a=b=c,首先运行b=c,然后运行a=(b=c的返回值慕少请自重,即复制了c的b的对象)
构造函数使用用例
1.调用无参数构造函数
A a1百变郡主,a2;
2.调用一般构造函数
A a3(1); 或者 A a3 = A(1);
3.把a3赋给a1
a1 = a3;
由于a1已经被提前创建,所以这里不会调用任何构造函数,只调用=运算符重载函数
4.调用类型转换构造函数
a2 = 1;
先调用转换构造函数将1创建为一个本类的临时对象,再调用=运算符重载
5,调用拷贝构造函数
A a4(a1); 或者 A a4 = a1;
这里有区别于=运算符重载,因为a4并未提前创建,所以调用拷贝构造函数
深拷贝和浅拷贝 如上所述,如果没有显式的写复制构造函数,则系统默认一个,这个默认的的复制构造函数只是简单的进行赋值,这时如果类里有一个成员变量是指针,或者有成员在构造函数中分配了资源,这时如果只进行简单的赋值,则会出现新对象的指针所指向的地址与被拷贝对象的指针所指向的地址是同一个地址,会造成错误,这就涉及到深拷贝和浅拷贝。 浅拷贝是指在对象复制时,只对对象中的成员变量进行赋值,默认赋值构造函数进行的就是浅拷贝;深拷贝是指对象复制时奕詝怎么读 ,对对象中的动态成员重新分配内存永信中药网。//示例
class Person
{
public:
Person(char *pN)
{
m_pName = new char[strlen(pN) + 1];
if(m_pName != NULL)
{
strcpy(m_pName, pN);
}
}
//默认复制构造函数,只做模式拷贝
Person(const Person& p)
{
m_pName = p.m_pName;
}
~Person()
{
delete m_pName;
}
private:
char * m_pName;
}
void main()
{
Person man("lily");
Person woman(man);
}
导致man和woman的指针指向了同一地址,调用析构函数时,同一地址被delete了两次,下面自己设计复制拷贝构造函数,实现深拷贝
Person(const Person& p)
{
m_pName = new char[strlen(pN) + 1];
if(m_pName)
{
strcpy(m_pName, p.m_pName);
}
}