C 拷貝建構函式的呼叫時機

2021-09-11 05:35:08 字數 2181 閱讀 2464

​ 當以拷貝的方式初始化物件時會呼叫拷貝建構函式,這裡需要注意兩個關鍵點,分別是以拷貝的方式初始化物件

1. 初始化物件

初始化物件是指,為物件分配記憶體後第一次向記憶體中填充資料,這個過程會呼叫建構函式,物件被建立後必須立即初始化。也就是說只要建立物件就會呼叫建構函式。

2.初始化和賦值的區別

初始化和賦值都是將資料寫入記憶體中,從表面看,初始化在很多時候都是以複製的方式來實現的,很容易引起混淆。在定義的同時進行複製叫做初始化,定義完成以後再賦值(不管定義的時候有沒有賦值)就叫做賦值。初始化只能由一次,賦值可以由很多次。具體可以看下面的示例。

int a = 100;  //以賦值的方式初始化

a = 200; //賦值

a = 300; //賦值

int b; //預設初始化

b = 29; //賦值

b = 39; //賦值

​ 對於基本的資料型別,我們很少會區分初始化和賦值,即使是混淆了,也不會出現什麼錯誤。但是對於類,他們的區別就非常重要了,因為初始化時會呼叫建構函式(以拷貝的方式初始化時會呼叫拷貝建構函式),而賦值時會呼叫過載過的賦值運算子。

#include#includeusing namespace std;

class student ;

//普通建構函式

student::student(string name , int age )

//拷貝建構函式

student::student(const student &stu)

// 過載 = 運算子

student& student:: operator=(const student &stu)

void student::display()

int main()

/*輸出:

copy constructor was called.

operator=() was called.

copy constructor was called.

operator=() was called.

*/

1. 初始化物件時會呼叫建構函式,不同的初始化方式會呼叫不同的建構函式:

2. 以拷貝的方式來初始化物件的幾種情況:

將其它物件作為實參。

student stu1("xiao ming", 18);  // 普通初始化

student stu4(stu1); // 以拷貝的方式進行初始化

/* 即使我們不在類中顯示定義拷貝建構函式,這種初始化方式也是有效的,編譯器會生成預設的拷貝建構函式 */

在建立物件的同時賦值。

student stu1("xiao ming", 18);  // 普通初始化

student stu3 = stu1; // 以拷貝的方式進行初始化

/* 這是最常見的一種以拷貝的方式初始化物件的情況 */

函式的形參為類型別。

如果函式的形參為類型別(物件),那麼呼叫函式時要將另外乙個物件作為實參傳遞進來賦值給形參,這也是以拷貝的方式初始化形參物件,如下所示。

void func(student s)

student stu1("xiao ming", 18); // 普通初始化

func(stu1); //以拷貝的方式初始化

/* func() 函式有乙個 student 型別的形參 s,將實參 stu 傳遞給形參 s 就是以拷貝的方式初始化的過程。 */

函式返回值為類型別(與編譯器有關不絕對)

​ 當函式的返回值為類型別時,return 語句會返回乙個物件,不過為了防止區域性物件被銷毀,也為了防止通過返回值修改原來的區域性物件,編譯器並不會直接返回這個物件,而是根據這個物件先建立出乙個臨時物件(匿名物件),再將這個臨時物件返回。而建立臨時物件的過程,就是以拷貝的方式進行的,會呼叫拷貝建構函式,如下所示。

student func()

student stu = func();

posted @

2019-02-21 22:41

ay-a 閱讀(

...)

編輯收藏

C 拷貝構造函式呼叫時機

class a 傳入乙個字串代表變數的名字 a string n name n a 拷貝建構函式a const a a 過載 運算子 a operator const a a friend ostream operator ostream os,const a a private string na...

C 拷貝建構函式的呼叫時機

include iostream using namespace std class test2 test2 int a test2 int a,int b 有參建構函式 兩個引數 test2 析構函式 test2 const test2 obj void printf void main31 in...

C 拷貝建構函式的呼叫時機

define crt secure no warnings includeusing namespace std class person person int a person const person p person int m age 1 使用乙個已經建立好的物件來初始化另乙個物件 void...