今天答海康的題總體來說比較簡單
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
即總共有六個函數。