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

C++构造函数、复制构造函数、赋值操作符、析构函数--个人总结

2014-04-15 21:31 615 查看
一、构造函数:

构造函数是一个特殊的、与类同名的成员函数,用于给每个成员设置适当的初始值。

构造函数不能有返回值,函数名为类名。

缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空。缺省构造函数是不带参数的。

创建一个对象时,系统自动调用构造函数。

总结:

     1.构造函数可以重载

     2.实参决定使用哪个构造函数

     3.构造函数自动执行

     4.构造函数不能声明为const   // 如: Base( )  const;

注意:一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数了。这条规则根据是:如果一个类在某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制。

例子:

默认构造函数:

Sales_item::Sales_item():units_sold(0),revenue(0.0){}

自定义构造函数:

Sale_item::Sale_item(int a,double b):units_sold(a),revenue(b){}

二、复制构造函数

只有单个形参,而且该形参是对本类类型对象的引用(常用const修饰),这样的构造函数称为复制构造函数。

复制构造函数的定义与其他构造函数一样:它与类同名,没有返回值,可以(而且应该)使用构造函数初始化列表初始化新创建对象的成员,可以在函数体重做任何其他必要工作。

c++支持两种初始化形式:直接初始化和复制初始化。复制初始化使用=符号,而直接初始化将初始化式放在圆括号中(见于c++Primer P406)。

string  a="123-123";  //复制初始化

string  b(10,'.')           // 直接初始化

string  c=string();      //复制初始化

实例:

class  Sales_item

{

      private:

           std::string   isbn;

           int    units_sold;

           double   revenue;

};

Sale_item::Sales_item(const  Sales_item  & orig): isbn(orig.isbn),units_sold(orig.units_sold),revenue(orig.revenue)

{}

理解:

复制构造函数是一种特殊的构造函数!!

三、赋值操作符

Sales_item & Sale_item::operator=(const Sales_item &rhs)

{

    isbn =rhs.isbn;

    units_sold = rhs.units_sold;

    revenue = rhs.revenue;

    return *this;

}

类赋值操作符接受类类型形参,通常,该形参是对类类型的const引用,但也可以是类类型或对类类型的非const引用。

可以为一个类定义许多附加的赋值操作符。这些赋值操作符会因右操作数类型的不同而不同。

赋值操作符可以重载。

唯一一个有返回值的复制控制函数

四、析构函数

析构函数名字在类名字钱加个~(注意~和类名是一体的,不准分开),没有返回值,没有形参。因为不能指定任何形参,故不能重载析构函数。虽然可以给一个类定义多个构造函数,但是只能提供一个析构函数。

析构函数与复制构造函数或赋值操作符之间的一个重要区别是,即使我们编写了自己的析构函数,合成析构函数仍然运行

基类几乎总是需要析构函数,从而可以将析构函数设为虚函数。即使析构函数没有工作要做,继承层次的根类也应该定义一个虚析构函数。



五、调用构造函数、复制构造函数、赋值操作符、析构函数的例子如下:



new    调用构造函数

delete 调用析构函数

在定义的时候就调用构造函数(复制构造函数属于构造函数的一种,这种情况下,要创建新对象)

已经定义好了就调用赋值操作符(不必创建新对象



#include <cstdlib>

#include <iostream>

#include<string> 

using namespace std;

class Base

{

      private:

         string SName; 

      public: 

         Base();                                                            // 默认构造函数

         Base(string name):SName(name)                    // 自定义构造函数

         {

              cout<<"Define Constructor(自定义构造函数)"<<endl; 

         } 

         Base(Base & B1);                                            // 复制构造函数

         Base & operator=(const Base & B1);              //  赋值操作符

         string GainName()                                          //  普通成员函数

         {

                return SName; 

         } 

         ~Base();                                                        // 析构函数

}; 

Base::Base()

{

     //SName("abc"); 

     string stmp("abc");

     SName=stmp; 

     cout<<"Default Constructor(默认构造函数)"<<endl; 



inline Base::Base(Base & B1):SName(B1.SName)       // 定义为内联函数

{

     cout<<"Copy Constructor Function(复制构造函数)"<<endl; 

}

Base & Base::operator=(const Base & B1)               // 唯一一个有返回值的复制控制函数

{

     // Base b1 = new Base();

     SName = B1.SName;

     cout<<"Assignment Operator(赋值操作符)"<<endl; 

     return *this; 



Base::~Base()                                                          // 自定义析构函数

{

     cout<<"Destructor(析构函数)"<<endl; 



int main(int argc, char *argv[])

{

    string a("Hello"); 

    Base *b5=new Base(a); 

    Base b6;

    b6=(*b5);                                                           // b6是已经定义好的对象,“=” ,就需要赋值操作符。

    cout<<b5->GainName()<<endl;

    cout<<b6.GainName()<<endl;

       

    Base *b1 = new Base("World");

    Base b2 =(*b1);                                                  // 复制初始化  定义的时候初始化,都是复制构造函数。

    Base b3(*b1);                                                     // 直接初始化  [b]定义的时候初始化,都是复制构造函数[/b]

    cout<<b1->GainName()<<endl;

    cout<<b2.GainName()<<endl;

    cout<<b3.GainName()<<endl; 

    delete b5;

    delete b1;

    //delete &b6;

    //delete &b2;

    //delete &b3;                                                       //delete必须要跟new对应,不是new出来的对象,就不要用delete

    system("PAUSE");

    return EXIT_SUCCESS;

}

执行结果:

Define Constructor(自定义构造函数)

Default Constructor(默认构造函数)

Assignment Operator(赋值操作符)

Hello

Hello

Define Constructor(自定义构造函数)

Copy Constructor Function(复制构造函数)

Copy Constructor Function(复制构造函数)

World

World

World

Destructor(析构函数)

Destructor(析构函数)

Destructor(析构函数)

Destructor(析构函数)

Destructor(析构函数)

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