海康衛視筆試 總結(struct 與 class)

今天答海康的題總體來說比較簡單

 1、一個類定義爲定義struct sEmpty{},編譯器會爲它添加幾個默認函數?

      結構體也有自己的構造、析構、重載運算符河函數,可以簡單的認爲結構體是類的一種形式。

    struct Student
    {
        string name;
        int age;
    };
    struct Student stu = {"liming", 18};
    struct Student stu2 = {"wanger", 20};
    stu2 = stu;

    cout<<"age is : "<< stu2.age <<endl;
    cout<<"name is :"<< stu2.name<<endl;
說明此時的拷貝是成功的,此時的結構體可以通過“=”來直接進行賦值操作,但是接下來的問題產生了,假設存在如下的結構體:​
    struct stu
    {
        int i;
        char c;
        char* p;
    };

執行下面的程序:

    struct stu s1,s2;
    char * str = "rabbit is cute";
    s1.i = 345;
    s1.c = 'y';
    s1.p = (char*)str;
    s2 = s1;
    printf("s2 %d, %c, %s\n", s2.i, s2.c, s1.p);
    printf("s1 ptr: %d, s2 ptr : %d\n", s1.p, s2.p);
​產生的結果是這樣的:

    s2 345, y, rabbit is cute
    s1 ptr: 7934, s2 ptr : 7934
這說明指針的並沒有將內容複製一塊給新指針來指向,只是讓新指針指向原來的那個內存,這樣就相當於,指針在這個複製的過程中只是複製了地址,而不是內容


在結構體中加入自己的拷貝構造函數:
struct stu
{
    int i;
    char c;
    char* p;
    stu operator=(stu& stuTmp)
    {
        i = stuTmp.i;
        c = stuTmp.c;
        p = new char(strlen(stuTmp.p) + 1);
        strcpy(p, stuTmp.p);
        return *this;
    };
};
相當於重載operator=方法,這樣還是運行,產生的結果就是這樣的:
s2 345, y, rabbit is cute
s1 ptr: 7910, s2 ptr : 1050000

struct和class最根本的區別就是默認的成員屬性不同,其他的時候可以互換

注意:

在 C++ 中,struct 可以同 class 一樣擁有自己的成員,只不過 struct 成員的訪問默認的是 public 範圍。如果在 struct 中定義了構造函數,則默認構造函數(無參構造函數)必須顯示定義才能使用。否則,在創建此結構體的實例時,會出現編譯錯誤。

struct Test  {
	int a; 
	char* b;
};
Test* test = new Test; // 結構體使用默認構造函數,編譯通過

struct Test1 {
	Test1(int a):_a(a) {}
	int _a;
};
struct Test2 {
  Test1 t1;
};
Test2* test2 = new Test2; // 結構體 Test1 沒有顯示定義無參構造函數,調用失敗,編譯不通過
Test1 中沒有顯示的定義無參構造函數,而生成實例的方法卻調用的是無參構造。解決方法有:1. 爲 Test1 定義默認構造函數; 2. 將 Test1 數據成員聲明爲指針類型(此時 Test2 結構體中存儲的是 Test1 的4字節地址,不需要調用 Test1 的構造函數)。

// 提供默認構造函數
struct Test1 {
	Test1():_a(0) {}
	Test1(int a):_a(a) {}
	int _a;
};

// 數據成員聲明爲指針
struct Test2 {
	Test1* t;
};
此時編譯即可通過。

c++空類默認有六個函數

默認構造函數、默認拷貝構造函數、默認析構函數、默認賦值運算符 這四個是我們通常大都知道的。但是除了這四個,還有兩個,那就是取址運算符和 取址運算符 const

即總共有六個函數

 

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