您的位置:首页 > 编程语言 > C语言/C++

关于C++中的构造函数、拷贝构造函数、析构函数的总结

2016-10-18 20:04 375 查看
     C++ 中提到了构造函数、拷贝构造函数、析构函数这几个概念,在此我将对这几个概念进行简单的解释及总结。写的不全,请见谅

   一、构造函数

      1、构造函数:一种特殊的成员函数,用来初始化对象。

       2、构造函数的特点: a、函数名和类名相同。

                          b、无返回值,没有类型。(实际返回当前对象的引用)

                          c、构造函数不需要用户调用,也不能被用户调用,只会在新的对象被创建时,由编译器自动调用,且在对象的生命周期内仅调用一次,以保证每个数据成员都有一个合适的初始值。

                          d、有初始化列表(可以不用,只有构造函数有初始化列表)。

                          e、构造函数可以重载,实参决定调用哪个构造函数。

                          f、如果没有显示定义,系统会提供一个默认的构造函数。

                          g、无参构造函数和带有缺省值的构造函数都被认为是缺省构造函数,而且缺省构造函数只能有一个。

                          h、构造函数不能用const和volatile来修饰。

       3、使用构造函数需了解一下问题:

           a、构造函数不能用const修饰的原因:构造函数的作用是初始化对象,如果用const修饰构造函数,之后不能对该对象重新赋值。

           b、什么情况下系统会合成一个默认构造函数?

              有两个类,A和B,B类中含有A类的对象,A中显式定义了构造函数,B中无构造函数,此时,系统会在B类中合成一个默认构造函数。

                                            class A                                         

                                           {

                                             public:

                                                A();

                                           };

                                            class B

                                           {

                                             public:

                                                A a;

                                             char * ptr;

                                           };

                                             int main()

                                           {

                                                B b;

                                                return 0;

                                           }

           c、成员初始化列表只提供该类数据化成员的初始化,而在构造函数体内对数据成员设置值失忆个赋值操作。

      eg:



<span style="font-size:14px;">#include<iostream>
#include<stdio.h>
using namespace std;
class Time              //声明Time类
{
public:                 //公有函数
Time()              //定义构造成员函数(函数名与类名相同)
{
hour = 0;       //利用构造函数对对象中的数据成员赋初始值
minute = 0;
second = 0;
}
void set_time();   //成员函数声明
void show_time();   //成员函数声明
private:               //私有数据
int hour;          //定义标识符
int minute;
int second;

};
void Time::set_time()      //定义成员函数,向数据成员赋值
{
cin >> hour;
cin >> minute;
cin >> second;
}
void Time::show_time()      //定义成员函数,输出数据成员的值
{
cout << hour << ":" << minute << ":" << second << endl;
}
int main()
{
Time t1;       //建立对象t1,同时调用构造函数t1.Time()
Time t2;       //建立对象t2,同时调用构造函数t2.Time()
t1.set_time(); //对t1的数据成员赋值
t1.show_time();//显示t1的数据成员的值
t2.set_time();//对t2的数据成员赋值
t2.show_time();//显示t2的数据成员的值
system("pause");
return 0;
}</span>



二、拷贝构造函数

    1、拷贝构造函数:一种特殊的构造函数,只有一个形参,而且该形参是对本类类型对象的引用,这样的构造函数称为拷贝构造函数。

    2、拷贝构造函数的特点:a、它是构造函数的重载。

                          b、只有一个参数。

                          c、由普通构造函数和赋值操作符共同实现。

                          d、它的参数必须使用同类型对象的引用传递。

                          e、如果没有显式定义,系统会自动合成一个默认的拷贝构造函数。默认的拷贝构造函数会依次拷贝类的数据成员完成初始化。

    3、拷贝构造函数的使用场景:  a、对象实例化对象

                               Time t1(21,55,32);

                               Time t2(t1);

                                b、传值方式作为函数的参数

                                void test(cost Time time)

                                {}

                                c、传值方式作为函数的返回值

                                Time test()

                                {

                                   Time time;

                                   return time;

                                }

    4、需了解:

          拷贝构造函数的参数必须使用同类型对象的引用传递的原因:避免拷贝构造函数无限制的递归下去。

三、析构函数

   1、析构函数:析构函数名也与类名相同,只是在函数名前面加一个位取反符~,例~Time(),以区别构造函数。

   2、析构函数的特点:a、析构函数与构造函数作用相反。

                      b、析构函数无参数,无返回值。

                      c、一个类有且只有一个析构函数。若未显式定义,系统会生成缺省的析构函数。

                      d、对象生命周期结束时,C++编译系统自动调用析构函数。

                      e、析构函数体内并不是删除对象,而是做一些清理工作。

   3、需了解:

                   a、由于析构函数没有函数参数,所以不能被重载。

                   b、系统自动生成的析构函数只是徒有析构函数的名称和形式,实际上什么操作都不进行。要让析构函数完成任何工作,都必须在定义的析构函数中指定。

eg:

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
class student//声明一个类
{
private://私有部分
int num;
char name[10];
char sex;
public://公用部分
student(int n, char nam[], char s)//构造函数
{
num = n;
strcpy(name,nam);
sex = s;
cout << "Constructor called." << endl;
}
~student() //析构函数
{
cout << "Distructor called." << endl;
}
void display()//成员函数,输出对象的数据
{
cout << "num:" << num <<endl ;
cout << "name:" <<name<<endl;
cout << "sex:" << sex << endl;
}
};
int main()
{
student stud1(10010, "xue", 'f');//建立对象stud1
student stud2(10011, "jia", 'm');//建立对象stud2
stud1.display();//输出学生1的数据
stud2.display();//输出学生2的数据
system("pause");
return 0;
}



                 

 




                 

        

   



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐