C++4種類のコンストラクタが呼び出されるタイミング

3333 ワード

コピー、割り当て、コンテナ
#include 
#include 
#include 
#include 
using namespace std;


class A
{
public:
    A()
    {
        cout << "construct a" << endl;
    };
    A& operator=(const A &a)
    {
        cout << "assign function" << endl;
    }
    A(const A& a)
    {
        cout << "copy construct" << endl;
    }


    ~A()
    {
        cout << "destruct a" << endl;
    }
};

void func(A a)
{
    cout << "func a" << endl;
}

int main()
{
    vectorvec_1;
vectorvec_2;
//    map map_1;
A a;//construct
//    cout << "-------------------" << endl;
//    vec_1.push_back(a);//copy construct
vec_2.push_back(a);//copy construct
//    swap(vec_1, vec_2);//copyまたはconstructは  されません
/*    
construct a
copy construct
copy construct
destruct a
destruct a
assign construct
*/
//    map_1[0] = a;
//    func(a);//copy construct
//    cout << "-------------------" << endl;
//    A a1 = a;//copy construct 
//    A a1;
//    a1 = a;//assignは、 じて1つのプロファイルを び すことが なくなり、a 1のプロファイルは  され、    は コンストラクション  と なすことができる。   は しいオブジェクトを  しないため、オブジェクト  はすでに  する。
//    swap(a1, a);//copy construct assign construct assign construct destruct a
}
//コンテナ   に メンバーの    が び されます
//コンテナを  する  は、クラスの  、コピー  、  、    に に  する

継承中
#include 

using std::cout;
using std::endl;

class Base
{
public:
    Base()
    {   
        cout << "No param" << endl;    
    }   
    Base(int a)
    {   
        cout << "with param" << endl;    
    }   
private:// COPY     Private    COPY    
    Base(const Base &b) 
    {   
        cout << "copy" << endl;
    }   
};

class Derived:public Base
{
public:
    Derived()//              
    {   
    }   
    Derived(int a):Base(a)
    {}  
};



int main()
{
    Derived a;
    Derived b(2);
//    Derived c = a;
    cout << "main" << endl;
    return 0;
}


オペレータリロード
#include 
#include 

using namespace std;

//
class Book
{
private:
    unsigned int mId;
    string mName;
public:
    Book(unsigned int id, string name);
    Book(const Book &book);
    Book &operator=(const Book &book);
    ostream &operator<mId << endl;
    os << "name:" << this->mName << endl;
    return os; 
}

ostream &operator<mName + book.mName;
    return tmp;
}

Book operator-(Book &book1, Book &book2)
{
    Book tmp(0,"");
    tmp.mName = book1.mName + "-" + book2.mName;
    return tmp;
}

int main()
{
    Book hualuo(1, "hua luo zhi duo shao");
    Book zhiduoshao(2, "zhi duo shao");

    Book hualuo_copy = hualuo;//copy
    hualuo_copy = hualuo;//assign
    hualuo_copy << cout;
    cout << hualuo << endl;


    Book total = hualuo + zhiduoshao;
    cout << total << endl;

    Book minu = hualuo - zhiduoshao;
    cout << minu << endl;

    return 0;
}