C++中的結構體和類
結構體(struct)
定義
結構體(struct) 是由一系列具有相同類型或不同類型的數據構成的數據集合,也叫結構。
C語言中struct定義了一組變量的集合,C編譯器並不認爲這是一種新的類型。
struct Teacher{
char names[32];
int age;
};
void main() {
Teacher t1; //這是錯誤的
struct Teacher t1; //這是正確的
}
C++語言中struct是一種新類型的定義聲明,進行了類型加強
struct Teacher{
char names[32];
int age;
};
void main() {
Teacher t1;
}
定義和初始化
定義
- 先聲明結構體類型再初始化變量
//結構體的聲明
struct Student{
char name[32];
int age;
int score;
};
int main() {
Student stu1, stu2; //結構體變量的初始化
cout << sizeof(stu1) << endl;
cout << sizeof(stu2) << endl;
return 0;
}
- 在聲明結構體類型的同時初始化變量
int main() {
//結構體的聲明
struct Student{
char name[32];
int age;
int score;
} stu1, stu2; //結構體變量的初始化
cout << sizeof(stu1) << endl;
cout << sizeof(stu2) << endl;
return 0;
}
- 直接定義結構體變量
int main() {
//結構體的聲明
struct {
char name[32];
int age;
int score;
} stu1, stu2; //結構體變量的初始化
cout << sizeof(stu1) << endl;
cout << sizeof(stu2) << endl;
return 0;
}
注: 雖然這幾種定義方式都可以,但是最常用的是第一種方法
結構體類型需要注意的幾點:
只能對結構體變量中的成員賦值,而不能對結構體類型賦值。
對結構體變量中的成員(即“域”),可以單獨使用,它的作用與地位相當於同類型的普通變量。
結構體的成員也可以是一個結構體變量。
//結構體的聲明
struct Date{
int year;
int mounth;
int day;
};
struct Student{
char name[32];
int age;
int score;
Date birthday; //Date是結構體類型,birthday是Date的類型的變量
};
int main() {
Student stu; //結構體變量的初始化
Date date;
cout << sizeof(stu) << endl;
cout << sizeof(date) << endl;
return 0;
}
- 結構體中的成員名可以與程序中的變量名相同,但二者沒有關係。
初始化
- 在定義結構體時對結構體變量指定初始值
struct Student{
char name[32];
int age;
int score;
} stu1{
'li',
18,
80
};
- 在定義變量時進行初始化(這種方法更常用)
struct Student{
char name[32];
int age;
int score;
};
int main(int argc, char const *argv[]) {
Student stu1{
'li',
18,
80
};
return 0;
}
結構體變量的引用
在定義了結構體變量之後,就可以引用這個變量。
引用結構體變量中的一個成員的值
引用方式:結構體變量名.成員名,其中“.”是成員運算符,它在所有的運算符中優先級最高。
struct Date{ int year; int mounth; int day; }; struct Student{ char name[32]; int age; int score; Date birthday; //Date是結構體類型,birthday是Date的類型的變量 }; int main() { Student stu = {"li", 18, 100, 1993, 10, 1}; //結構體變量的初始化 cout << stu.name << endl; cout << stu.age << endl; cout << stu.score << endl; cout<<stu.birthday.year<<"/"<<stu.birthday.mounth<<"/"<<stu.birthday.day << endl; return 0; }
如果一個成員本身也是一個結構體類型,則要用若干個成員運算符,一級一級地找到最低一級的成員。
比如:
cout<<stu.birthday.year<<"/"<<stu.birthday.mounth<<"/"<<stu.birthday.day << endl;
可以將一個結構體變量的值付給另外一個具有相同結構的結構體變量。
可以引用結構體變量的地址,也可以引用結構體變量成員的地址。
struct Date{ int year; int mounth; int day; }; struct Student{ char name[32]; int age; int score; Date birthday; //Date是結構體類型,birthday是Date的類型的變量 }; int main() { Student stu1 = {"li", 18, 100, 1993, 10, 1}; //結構體變量的初始化 Student &stu2=stu1; stu2.age++; stu2.birthday.day+=10; cout << stu2.name << endl; cout << stu2.age << endl; cout << stu2.score << endl; cout<<stu2.birthday.year<<"/"<<stu2.birthday.mounth<<"/"<<stu2.birthday.day << endl; return 0; }
類(class)
定義
類(class) 是一種數據類型,該類型類似於普通的數據類型,但是又有別於普通的數據類型。類這種數據類型是一個包含成員變量和成員函數的一個集合。
class student
{
char name[20]; //姓名
int id_num; //學號
int age; //年齡
char sex; //性別
void set_age(int a);
int get_age();
};
定義和初始化
定義
- 定義一個類
//類的聲明
class Student{
char name[20]; //姓名
int id_num; //學號
int age; //年齡
char sex; //性別
void set_age(int a);
int get_age();
};
其中成員變量:name、id_num、age、sex;成員函數:set_age(int a)、get_age();
有兩種方法可以給出成員函數的定義:
- 內聯定義(inline)
在類內部進行函數的聲明和定義,此種方式我們成爲inline。inline是C++關鍵字,專門用於表示內聯;
class student
{
char name[20]; //姓名
int id_num; //學號
int age; //年齡
char sex; //性別
void set_age(int a){age = a;}
int get_age(){return age;}
};
- 在類內進行函數聲明,在類外部進行函數定義。
class student
{
char name[20]; //姓名
int id_num; //學號
int age; //年齡
char sex; //性別
void set_age(int a);
int get_age()const;
};
//在類外部定義set_age函數
void student::set_age(int a)
{
age = a;
}
//在類外部定義get_age函數
int student::get_age() const
{
return age;
}
- 在類內聲明函數,如果在函數聲明時使用inline關鍵字,如例4所示,則可以將類內聲明類外定義的函數強制轉換爲內聯函數。
class student
{
char name[20]; //姓名
int id_num; //學號
int age; //年齡
char sex; //性別
inline void set_age(int a);
inline int get_age();
};
//在類外部定義set_age函數
void student::set_age(int a)
{
age = a;
}
//在類外部定義get_age函數
int student::get_age()
{
return age;
}
區別
C++語言繼承了C語言的struct,並且加以擴充。在C語言中struct是隻能定義數據成員,而不能定義成員函數的。而在C++中,struct類似於class,在其中既可以定義數據成員,又可以定義成員函數。
在C++中,struct與class基本是通用的,唯一不同的是如果使用class關鍵字,類中定義的成員變量或成員函數默認都是private屬性的,而採用struct關鍵字,結構體中定義的成員變量或成員函數默認都是public屬性的。
在C++中,沒有拋棄C語言中的struct關鍵字,其意義就在於給C語言程序開發人員有一個歸屬感,並且能讓C++編譯器兼容以前用C語言開發出來的項目。