C++ 中真的分值類型和引用類型嗎(透徹解析版)

歡迎來拍磚

我認爲,C++中沒有一個類型是可以肯定地說是 值類型 or 引用類型 的,一切取決於你如何使用它,如果你使用指針,哪怕是int型也可以當做引用類型來用。

以上是我由思考struct類型所引發的思考的結論,接下來上代碼:

#include<iostream>
using namespace std;

struct ss{
    int a;
    int b;
};

int main(){
    
    // 構造對象 
    ss s = {1, 2};  // or ss s = new ss();  s.a = 1; s.b = 2
    // 這裏是深拷貝(就像克隆一樣,從頭到腳克隆出來一模一樣的動物,然而它們並不是同一個個體) 
    ss s2 = s; 
    s2.a = 3;
    s2.b = 4;
    // 將 s 賦值給 s2 ,改變 s2 的值之後,發現 s 的值並沒有改變,所以這裏的賦值顯然是 深拷貝 
    cout<<s.a<<", "<<s.b<<endl;   // 結果是   1, 2 
    
    
    // 此處爲淺拷貝,原理是將 s 的地址賦值給 s3,當改變 s3地址所對應的值時,s 的值自然也變了 
    // 淺拷貝就像 你給寵物起的名字,你一會叫它 小寶,一會兒叫他 貝貝,但指的是同一個個體,你喂小寶,就是在喂貝貝 
    ss *s3 = &s; 
    s3->a = 3;
    s3->b = 4;
    cout<<s.a<<", "<<s.b<<endl;   // 結果是   3, 4

	return 0;
}

再舉個例子:

#include<iostream>
using namespace std;

int main(){
    
    // 哪怕是一向以引用類型自居的string,它也是通過指針才能實現淺拷貝 
    string a = "asd";
    string b = a;
    b = "gkhj";
    cout<<a<<endl;  // 結果是 asd
    
    string *c = &a;
    *c = "gkhj";
    cout<<a<<endl;  // 結果是 gkhj

	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章