當以拷貝的方式初始化物件時會呼叫拷貝建構函式,這裡需要注意兩個關鍵點,分別是以拷貝的方式
和初始化物件
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...