文章目录
前言
从C语言过渡到C++中有些新的概念浮现出来,其中我最近在学习过程中遇到的一些值得体味的概念想拿出来再辨析一下,一个是构造函数,一个是拷贝构造函数。二者其实是包含关系,我将用三个实例来概括出构造函数,与拷贝构造函数的简单用法及优越性。
`
题目:用C++实现输出圆的半径、周长、和面积。
###(下列三个示例都是实现上述题目功能)
一、示例1、(用普通成员函数实现数据成员的初始化)
代码如下:
#include <iostream>
using namespace std;
class Circle
{
private :
double radius;
public :
void Set_Radius(double r) { radius = r; }
//定义普通成员函数为数据成员初始化
double Get_Radius() { return radius; }
double Get_Area() { return 3.14 * radius * radius; }
double Get_Girth() { return 2 * 3.14 * radius; }
};
int main()
{
Circle A, B;
A.Set_Radius(6.23);
cout << "A.Radius = " << A.Get_Radius() << endl;
cout << "A.Area = " << A.Get_Area() << endl;
cout << "A.Girth = " << A.Get_Girth() << endl;
B.Set_Radius(10.5);
cout << "B.Radius = " << B.Get_Radius() << endl;
cout << "B.Area = " << B.Get_Area() << endl;
cout << "B.Girth = " << B.Get_Girth() << endl;
return 0;
}
运行结果
二、示例2、(用构造函数实现数据成员初始化)
代码如下:
#include <iostream>
using namespace std;
class Circle
{
private:
double radius;
public:
Circle (double r) { radius = r; }
//定义构造函数为数据成员赋储值(数名与类名相同且无返回值)
double Get_Radius() { return radius; }
double Get_Area() { return 3.14 * radius * radius; }
double Get_Girth() { return 2 * 3.14 * radius; }
};
int main()
{
Circle A(6.23), B(10.5);
//相当于A.Set_Radius(6.23);B.Set_Radius(10.5);
cout << "A.Radius = " << A.Get_Radius() << endl;
cout << "A.Area = " << A.Get_Area() << endl;
cout << "A.Girth = " << A.Get_Girth() << endl;
cout << "B.Radius = " << B.Get_Radius() << endl;
cout << "B.Area = " << B.Get_Area() << endl;
cout << "B.Girth = " << B.Get_Girth() << endl;
return 0;
}
运行结果
三、示例3、(使用拷贝构造函数实现用一个已存在的对象初始化新建立的对象)
代码如下:
#include <iostream>
using namespace std;
class Circle
{
private:
double radius;
public:
Circle(double r) { radius = r; }
//定义构造函数为数据成员赋储值(函数名与类名相同且无返回值)
Circle(Circle & p) { radius = p.radius; }
//定义拷贝构造函数,实现用一个已存在的对象初始化新建立的对象
double Get_Radius() { return radius; }
double Get_Area() { return 3.14 * radius * radius; }
double Get_Girth() { return 2 * 3.14 * radius; }
};
int main()
{
Circle A(6.23);
//相当于A.Set_Radius(6.23);B.Set_Radius(10.5);
cout << "A.Radius = " << A.Get_Radius() << endl;
cout << "A.Area = " << A.Get_Area() << endl;
cout << "A.Girth = " << A.Get_Girth() << endl;
Circle B(A);
//用一个已存在的对象A初始化新建立的对象B
cout << "B.Radius = " << B.Get_Radius() << endl;
cout << "B.Area = " << B.Get_Area() << endl;
cout << "B.Girth = " << B.Get_Girth() << endl;
return 0;
}
运行结果
总结
1.与使用普通成员函数为数据成员赋初值相比较,用构造函数为数据成员初始化,在定义时可直接赋初值,因为定义了构造函数,(与定义的类同名)所以定义类的同时,也直接调用了构造函数为数据成员初始化;
这样就使得代码简化,且操作简便。
2.拷贝构造函数是一种特殊的构造函数,即用一个已存在的对象去初始化一个新建立的对象。拷贝构造函数是与类名相同,其形参是本类的对象的引用。
如上述示例3 所示,同时定义拷贝构造函数和构造函数,就可以理解为函数的重载,这样就使得代码的功能更加多元化,不仅可以输入一个数给半径赋值,算出圆的周长、面积。还可以直接用已存在的对象的数据成员来初始化新对象。
总之从这里开始我才逐渐感觉到,原来一个程序为实现同一种目的,可以有多种方法,这些方法有的十分简便,有的极为复杂,有的可同时兼容多种功能,有的只针对某一特定值甚至改个数都能不对。技术的学习仍然任重道远,如何写出漂亮的代码,如何学好更多的知识,是需要去不断探索的。