构造函数的定义
在构造对象时自动调用此函数,往往用来处初始化对象内的成员变量
函数名与类名一致且没有返回值
代码示例:
class circle{
public:
circle();
double calculateArea();
private:
int r;
int x;
int y;
};
circle::circle()
{
r = 0;
x = 0;
y = 0;
}
double circle::calculateArea()
{
return 3.14 * r * r;
}
默认构造函数:当类中没有构造函数时,编译器会自动生成一个构造函数
代码示例:
class circle{
public:
circle();
circle(int _r);
circle(int _x,int _y,int _r);
double calculateArea();
private:
int r;
int x;
int y;
};
circle::circle()
{
r = 0;
x = 0;
y = 0;
}
circle::circle(int _r)
{
r = _r;
x = 0;
y = 0;
}
circle::circle(int _x,int _y,int _r)
{
r = _r;
x = _x;
y = _y;
}
double circle::calculateArea()
{
return 3.14 * r * r;
}
初始化列表:在初始化时,也可以使用初始化列表的方式来实现构造函数,一般用在继承中
代码示例:
class circle{
public:
circle();
circle(int _r);
circle(int _x,int _y,int _r);
double calculateArea();
private:
int r;
int x;
int y;
};
circle::circle(int _x,int _y,int _r):r(_r),x(_x),y(_y)//初始化列表
{
cout << "x, y = " << x << " , " <<y <<endl;
cout <<" r = " << r <<endl;
}
拷贝构造函数:当一个对象需要通过另一个对象初始化,则需要使用拷贝构造函数
代码示例 :
class circle{
public:
circle();
circle(const circle &c);
circle(int _r);
circle(int _r,int _x,int _y);
double calculateArea();
private:
int x;
int y;
int r;
};
circle::circle(const circle &c)
{
r = c.r;
x = c.x;
y = c.y;
}
int main()
{
circle a;
circle b(a);// 此时会调用拷贝构造函数
circle c = b;//
return 0;
}
c++标准允许一种(编译器)实现省略创建一个只是为了初始化另一个同类型对象的临时对象。指定参数(-fno-elide-construtors)将关闭这种优化
代码示例:
#include<iostream>
using namespace std;
class A{
public:
A();//构造函数
A(const A &a);//拷贝构造函数
private:
int x;
};
A::A()
{
x = 0; //构造函数的实现
}
A::A(const A &a) //拷贝构造函数的实现
{
cout << "copy my" <<endl;
x = a.x;
}
A ceshi() //编写一个函数,返回一个A类对象
{
A a;
return a;
}
int main()
{
ceshi(); //调用函数ceshi()会调用一次拷贝构造函数
A a = ceshi(); //将ceshi()返回的对象接收回再次调用一次拷贝构造函数
return 0;
}
4.深拷贝和浅拷贝
(1).深拷贝:针对指针对象,拷贝指针指向的空间
2.针对指针对象,只拷贝指针存储的地址