深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结

转自 http://www.jb51.net/article/37527.htm,感谢作者

#include "stdafx.h"  
    #include <iostream>  
    using namespace std;  
    class B  
    {  
    public:  
        B():data(0)    //默认构造函数  
        {   
            cout << "Default constructor is called." << endl;  
        }  
        B(int i):data(i) //带参数的构造函数  
        {  
            cout << "Constructor is called." << data << endl;  
        }  
        B(B &b)   // 复制(拷贝)构造函数  
        {  
            data = b.data; cout << "Copy Constructor is called." << data << endl;  
        }  
        B& operator = (const B &b) //赋值运算符的重载  
        {  
            this->data = b.data;  
            cout << "The operator \"= \" is called." << data << endl;  
            return *this;  
        }  
        ~B() //析构函数  
        {  
            cout << "Destructor is called. " << data << endl;  
        }  
    private:  
        int data;  
    };

//函数,参数是一个B类型对象,返回值也是一个B类型的对象  
    B fun(B b)  
    {  
        return b;  
    }

//测试函数  
    int _tmain(int argc, _TCHAR* argv[])  
    {  
        fun(1);  
        cout << endl;

B t1 = fun(2);  
        cout << endl;

B t2;  
        t2 = fun(3);

return 0;  
    }

Constructor is called.1             //用1构造参数b     
    Copy Constructor is called.1      //用b拷贝构造一个临时对象,因为此时没有对象来接受fun的返回值     
    Destructor is called. 1            //参数b被析构     
    Destructor is called. 1             //临时对象被析构  
    Constructor is called.2                  //用2构造参数b        
    Copy Constructor is called.2           //用b拷贝构造t1,此时调用的是拷贝构造函数     
    Destructor is called. 2                  //参数b被析构  
    Default constructor is called.             //调用默认的构造函数构造t2        
    Constructor is called.3                       //用3构造参数b        
    Copy Constructor is called.3             //用b拷贝构造一个临时对象        
    Destructor is called. 3                        //参数b被析构        
    The operator "= " is called.3              //调用=操作符初始化t2,此时调用的是赋值操作符     
    Destructor is called. 3                         //临时对象被析构        
    Destructor is called. 3                         //t2被析构        
    Destructor is called. 2                         //t1被析构        
    请按任意键继续. . .

时间: 2024-10-05 10:32:34

深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结的相关文章

C++ 拷贝构造函数和重载赋值操作符相互调用分析 [转]

结论: 从面相对象编程的角度考虑,拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的.应该避免. Don't try to implement one of the copying functions in terms of the other. Instead, put common functionality in a third function that both call. ——Effective C++ Third Edition By Scott M

C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数.构造函数的工作就是保证每个对象的数据成员具有合适的初始值. 构造函数与其他函数不同:构造函数和类同名,没有返回类型. 构造函数与其他函数相同:构造函数也有形参表(可为void)和函数体.  (参数表为void的构造函数为默认构造函数

C++中关于拷贝构造函数的使用问题?

奉庵耪 C++中关于拷贝构造函数的使用问题?

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程:

C++编译器合成默认构造函数和复制控制成员(拷贝构造函数,赋值操作符,析构函数)的条件

(参考自<深入理解C++对象模型>) ”C++新手一般有两个常见的误解: 任何class如果没有定义default constructor,就会被合成一个出来. 编译器合成出来的default constructor会明确设定class 内每一个data member的默认值.” 现在主要解释第一条为什么是错误的,根据<深入理解C++对象模型>,”default constructor 在需要的时候被编译器产生出来”,以下就是4种”需要的时候”: 1). 该类含有一个成员对象而后者

【c++ primer, 5e】构造函数 &amp; 拷贝、赋值和析构

[构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码执行完后,才被赋予const性质. 4.如果自定义了构造器,那么默认的构造器将无效化,可以理解为自定义内容覆盖了默认的内容. 5.构造函数使用类内初始值并不是一个坏选择. 6.default. 7.构造函数初始值列表. [拷贝.赋值和析构] 如果我们不主动定义这些操作,那么编译器将会替我们合成它们.

构造函数 、析构函数 、拷贝构造函数 ~~~~~~~~~~拷贝构造函数

拷贝构造函数 1.拷贝构造函数作用: ①:程序中需要新建立一个对象,并用另一个同类的对象对它初始化: ②:当函数的参数为类的对象时,需要建立一个实参的拷贝: ③:函数的返回值是类的对象: 2 格式: 注意:关键字const是为了保护参数值,防止被改变 ///在类外定义,加域符 :: Box::Box(const Box &b) { hei=b.hei; len=b.len; wid=b.wid; } 3. 使用情况即考虑到其作用时 ① 建立一个新的对象 #include<iostream&g

拷贝构造函数和赋值操作符

假设有一个如下的MyClass类: class MyClass { public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 MyClass& operator = (const MyClass& that) { if(this != that) {

拷贝构造函数和赋值函数

在 C++ 中,赋值和拷贝是不同的, 1)拷贝构造函数是对未初始化的内存进行初始化操作 2)而赋值是对现有的已经初始化的对象进行操作.(这里我对"已经初始化"的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可),赋值函数应该给所有数据成员都初始化. 3)重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 4)可以说,C++中什么时候有临时对象产生,此时刻c++一定要调用拷贝构造函数.(临时对象产生时有一个特例,此时不需要调用拷