C++ 賦值運算子和拷貝建構函式
阿新 • • 發佈:2022-05-11
拷貝建構函式
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, '.');//拷貝建構函式初始化
但在一下情況,也會隱式呼叫拷貝建構函式:
- 將物件作為實參傳遞。
- 返回一個物件(非引用)。
- 用花括號初始化陣列中的元素或者一個聚合類的成員。
- 容器的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