浅谈自己对构造函数、析构函数、复制构造函数的理解

来源:互联网 发布:java encoder编码器 编辑:程序博客网 时间:2024/06/05 09:11
构造函数,析构函数复制构造函数等问题。最开始一直不太明白,今天终于对这几个概念有所了解,写篇博客以便后面学习。(在学习中使用的教材是李龙澍老师编写的C++程序设计第二版,有些定义及部分源码摘自该书)


以下我将分三次对上面三个概念我的理解进行总结
1、构造函数
在我看来,构造函数主要是对对象进行初始化,并且在对象被创建的时候由系统进行自动调用。并且,构造函数的函数名与类的名字保持一致,没有任何返回类型,而且构造函数可以进行重载。构造函数的语法结构如下:
<类名><对象名>(<构造函数的参数表>)
class Date {
int year, month, day;
public:
Date(int y, int m, int d);
void set(int y, int m, int d);
void display();
};




Date::Date(int y, int m, int d)    
{
year = y;
month = m;
day = d;
}
void Date::set(int y, int m, int d)
{
year = y;
month = m;
day = d;
}
void Date::display()
{
cout << "日期为:" << endl;
cout << "\t" << year << "年";
cout << month << "月";
cout << day << "日" << endl;
}
void main()
{
Date Mydate(2008, 1, 1);
cout << "第一次显示初值的日期:" << endl;
Mydate.display();
Mydate.set(2008, 10, 15);
cout << "第二次显示设置的日期:" << endl;
Mydate.display();
Mydate.set(2008, 11, 9);
cout << "第三次显示设置的日期:" << endl;
Mydate.display();
system("pause");
}
其中:
Date::Date(int y, int m, int d)    //为构造函数,不带默认参数,在这句话中,可以看成是在Date类中名为Date的带有三个产量的构造函数
{
year = y;
month = m;
day = d;
}
另外:
Date Mydate(2008, 1, 1);    //由于只有三个参数,并且未调用set函数,因此此命令直接调用构造函数将三个参数值分别赋值给构造函数中的三个参数
cout << "第一次显示初值的日期:" << endl;
上面的例子是不带有默认值的构造函数,构造函数也可以带有默认值,如下面的例子(计算长方形的周长和面积的类):
class Rect {
float x, y;
public:
Rect(float a = 1, float b = 1) { x = a; y = b; }    //带有默认值的构造函数
void set(float a = 0, float b = 0) { x = a; y = b; }
float peri();
float area();
};
上例中示出了一个带有默认值的构造函数,在不输入构造函数的参数时,在后续进行计算的时候将采用默认值进行计算和分析,如上例中,在不改变构造函数的参数时将长方形的长和宽设置为1进行计算。
另外,构造函数还可以重载,并且要求参数表不同,根据重载的构造函数的参数的个数不同进行不同的处理,如下面的例子:
#include<iostream>
#include<Windows.h>
using namespace std;




class circle {
float r;
public:
circle() { r = 0; }       //此处为无参数的构造函数
circle(float x) { r = x; }       //一个参量的构造函数
void set(float x) { r = x; }
float peri() { return(r*2*3.1416); }   
float area() { return(r*r*3.1416); }
};
void main() 
{
circle obj1(25.6), obj2;
cout << "第一次计算结果:" << endl;
cout << "圆1的周长为:" << obj1.peri() << ",面积为:" << obj1.area() << endl;
cout << "圆2的周长为:" << obj2.peri() << ",面积为:" << obj2.area() << endl;
obj1.set(42.3);
obj2.set(36.8);
cout << "第二次计算结果:" << endl;
cout << "圆1的周长为:" << obj1.peri() << ",面积为:" << obj1.area() << endl;
cout << "圆2的周长为:" << obj2.peri() << ",面积为:" << obj2.area() << endl;
system("pause");
}
其中:
circle obj1(25.6), obj2;
obj1带有一个参数所以调用的构造函数时circle(float x){ r = x; }这个构造函数;而obj2不带有参数,因此调用的是circle(){{ r = 0; }这个构造函数,并且有默认值r = 0;因此用默认值来进行计算。
总之,对于构造函数,我总结了三点:
1)构造函数的一个目的是用来对对象进行初始化;
2)构造函数必须与类名保持一致;

3)构造函数可以进行重载,根据参数的个数不同来进行区分


未完待续。。。。。

阅读全文
1 0