1. 程式人生 > 其它 >C++ 賦值運算子和拷貝建構函式

C++ 賦值運算子和拷貝建構函式

拷貝建構函式

class Foo{
public:
    Foo();
    Foo(const Foo&); //自己定義的拷貝建構函式
};

如果不自己定義,編譯器會自己合成一個預設拷貝建構函式

class Foo{
public:
    int a,b,c;
    Foo();
    Foo(const Foo&); //合成的拷貝建構函式
};
Foo::Foo(const Foo& f) : a(f.a), b(f.b), c(f.c) {}

拷貝建構函式總是用在初始化的時候,不要和賦值搞混。

string dots(10,'.');//建構函式初始化
string s(dots);		//建構函式初始化
string s2 = dots;	//拷貝建構函式初始化,不是賦值
string s3 = string(10, '.');//拷貝建構函式初始化

但在一下情況,也會隱式呼叫拷貝建構函式:

  1. 將物件作為實參傳遞。
  2. 返回一個物件(非引用)。
  3. 用花括號初始化陣列中的元素或者一個聚合類的成員。
  4. 容器的push(), push_back()等就是拷貝初始化,而emplace_back()是直接初始化。

拷貝賦值運算子:“=”

class Foo{
public:
    Foo();
    Foo& operator=(const Foo&); //過載賦值運算子
};

如果不自己定義,編譯器會自己合成一個預設拷貝賦值運算子

class Foo{
public:
    int a,b,c;
    Foo();
    Foo& operator=(const Foo&); //合成的拷貝建構函式
};
Foo& Foo::operator=(const Foo& f)
{
    a = f.a;
    b = f.b;
    c = f.c;
    return *this;
}

一般情況下,如果類需要自定義的解構函式,那麼必定需要自定義賦值運算子和拷貝建構函式。

如果需要自定義賦值運算子(拷貝建構函式),那麼必定需要自定義拷貝建構函式(賦值運算子),但不一定必須定義解構函式。

禁止拷貝、賦值

一些情況下類禁止拷貝,賦值,例如cin,cout。

class Foo
{
public:
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;
}

連結一個以前寫過的:
https://www.cnblogs.com/hellozhangjz/p/12347628.html