目錄
結(jié)構(gòu)體
定義與訪問結(jié)構(gòu)
結(jié)構(gòu)作為函數(shù)參數(shù)
指向結(jié)構(gòu)的指針
typedef 關(guān)鍵字
示例 1:為結(jié)構(gòu)體創(chuàng)建類型別名
示例 2:為函數(shù)指針創(chuàng)建類型別名
結(jié)構(gòu)體
定義與訪問結(jié)構(gòu)
在C++中,結(jié)構(gòu)體(structure)是一種用戶自定義的數(shù)據(jù)類型,用于組合不同類型的數(shù)據(jù)成員。結(jié)構(gòu)體可以包含變量、函數(shù)和其他數(shù)據(jù)類型。
要定義一個結(jié)構(gòu)體,在C++中使用struct關(guān)鍵字,然后指定結(jié)構(gòu)體的名稱和成員變量。結(jié)構(gòu)體的定義位于大括號{}內(nèi)部,每個成員變量都由其類型和名稱組成,并用分號;分隔。
struct 語句的格式如下:
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
- type_name是為結(jié)構(gòu)體定義的名稱,它可以自定義,但建議遵循C++命名約定,例如使用駝峰式命名法。類似于變量名或函數(shù)名,結(jié)構(gòu)體名稱也需要唯一。
- 在結(jié)構(gòu)體定義的末尾,可以選擇性地指定一個或多個結(jié)構(gòu)體變量。這些變量將使用結(jié)構(gòu)體類型中定義的成員變量分配內(nèi)存空間。結(jié)構(gòu)體變量的定義方式與其他變量的定義方式相同。
- 結(jié)構(gòu)體成員變量可以是任何有效的數(shù)據(jù)類型,包括基本類型(如int、float等)、自定義類型(如字符串、數(shù)組等)和其他結(jié)構(gòu)體類型。結(jié)構(gòu)體成員變量之間用逗號分隔。
- 結(jié)構(gòu)體成員變量的訪問方式是使用點運算符? “.”,例如:object.member_name。其中,object是結(jié)構(gòu)體變量的名稱,member_name是結(jié)構(gòu)體成員變量的名稱。
- 結(jié)構(gòu)體變量的初始化方式與其他變量的初始化方式相同,可以使用賦值運算符或花括號語法。
下面是一個示例,演示如何定義一個名為Person的結(jié)構(gòu)體,并創(chuàng)建兩個Person結(jié)構(gòu)體變量:
#include <iostream>
#include <string>
// 定義結(jié)構(gòu)體
struct Person {
std::string name;
int age;
double height;
} person1, person2; // 創(chuàng)建兩個Person結(jié)構(gòu)體變量
int main() {
// 初始化person1結(jié)構(gòu)體變量
person1.name = "Alice";
person1.age = 25;
person1.height = 1.65;
// 初始化person2結(jié)構(gòu)體變量
person2.name = "Bob";
person2.age = 30;
person2.height = 1.8;
// 訪問結(jié)構(gòu)體成員
std::cout << "Name: " << person1.name << std::endl;
std::cout << "Age: " << person1.age << std::endl;
std::cout << "Height: " << person1.height << " meters" << std::endl;
std::cout << "Name: " << person2.name << std::endl;
std::cout << "Age: " << person2.age << std::endl;
std::cout << "Height: " << person2.height << " meters" << std::endl;
return 0;
}
在上述代碼中,我們使用struct關(guān)鍵字定義了一個名為Person的結(jié)構(gòu)體,并在大括號內(nèi)部定義了三個成員變量:name、age和height。然后,在結(jié)構(gòu)體定義的末尾,我們定義了兩個Person結(jié)構(gòu)體變量:person1和person2。
在main函數(shù)中,我們初始化了這兩個結(jié)構(gòu)體變量,并使用點運算符.訪問它們的成員變量。最后,我們使用std::cout語句打印結(jié)構(gòu)體中的成員變量值。
結(jié)構(gòu)作為函數(shù)參數(shù)
在C++中,可以將結(jié)構(gòu)作為函數(shù)的參數(shù)傳遞。這意味著我們可以將結(jié)構(gòu)體變量作為參數(shù)傳遞給函數(shù),以便在函數(shù)中訪問和操作結(jié)構(gòu)體成員變量。
結(jié)構(gòu)體可以作為函數(shù)參數(shù)傳遞,有兩種傳遞方式:
- 傳值方式:將整個結(jié)構(gòu)體作為參數(shù)傳遞給函數(shù),這將復(fù)制整個結(jié)構(gòu)體,并將副本傳遞給函數(shù)。在函數(shù)中對結(jié)構(gòu)體成員變量的更改不會影響原始結(jié)構(gòu)體。
- 引用方式:將結(jié)構(gòu)體作為引用參數(shù)傳遞給函數(shù),這將允許函數(shù)直接訪問原始結(jié)構(gòu)體。在函數(shù)中對結(jié)構(gòu)體成員變量的更改將直接反映在原始結(jié)構(gòu)體上。
下面是一個示例程序,演示如何將結(jié)構(gòu)體作為函數(shù)參數(shù)傳遞:
#include <iostream>
#include <string>
// 定義結(jié)構(gòu)體
struct Person {
std::string name;
int age;
double height;
};
// 函數(shù)聲明
void printPerson(Person p); // 傳值方式
void updatePerson(Person& p, std::string newName, int newAge, double newHeight); // 引用方式
int main() {
// 創(chuàng)建一個Person結(jié)構(gòu)體變量
Person person;
person.name = "Alice";
person.age = 25;
person.height = 1.65;
// 傳值方式調(diào)用函數(shù)
printPerson(person);
// 引用方式調(diào)用函數(shù)
updatePerson(person, "Bob", 30, 1.8);
printPerson(person);
return 0;
}
// 函數(shù)定義 - 傳值方式
void printPerson(Person p) {
std::cout << "Name: " << p.name << std::endl;
std::cout << "Age: " << p.age << std::endl;
std::cout << "Height: " << p.height << " meters" << std::endl;
}
// 函數(shù)定義 - 引用方式
void updatePerson(Person& p, std::string newName, int newAge, double newHeight) {
p.name = newName;
p.age = newAge;
p.height = newHeight;
}
在上面的示例程序中,我們定義了一個名為Person的結(jié)構(gòu)體,并創(chuàng)建了一個名為person的結(jié)構(gòu)體變量。然后,我們調(diào)用了兩個函數(shù)printPerson和updatePerson,并將person作為參數(shù)傳遞給這些函數(shù)。
printPerson函數(shù)采用傳值方式將結(jié)構(gòu)體作為參數(shù)傳遞,而updatePerson函數(shù)采用引用方式將結(jié)構(gòu)體作為參數(shù)傳遞。
在printPerson函數(shù)中,我們使用點運算符"."訪問結(jié)構(gòu)體成員變量,并打印它們的值。
在updatePerson函數(shù)中,我們使用引用參數(shù)修改了結(jié)構(gòu)體成員變量的值。由于p是指向person結(jié)構(gòu)體的引用,因此對p的更改將直接反映在person結(jié)構(gòu)體上。
最后,我們再次調(diào)用printPerson函數(shù),并打印已更新的結(jié)構(gòu)體成員變量的值。
指向結(jié)構(gòu)的指針
在C++中,可以使用指針來引用和操作結(jié)構(gòu)體。指向結(jié)構(gòu)的指針指向結(jié)構(gòu)體變量的內(nèi)存地址,允許我們通過解引用操作符(*)來訪問和修改結(jié)構(gòu)體成員變量。
以下是一個示例演示如何聲明和使用指向結(jié)構(gòu)的指針:
#include <iostream>
#include <string>
// 定義結(jié)構(gòu)體
struct Person {
std::string name;
int age;
double height;
};
int main() {
// 創(chuàng)建一個Person結(jié)構(gòu)體變量
Person person;
person.name = "Alice";
person.age = 25;
person.height = 1.65;
// 創(chuàng)建指向Person結(jié)構(gòu)體的指針,并將其指向person變量
Person* ptr = &person;
// 通過指針訪問結(jié)構(gòu)體成員變量
std::cout << "Name: " << ptr->name << std::endl;
std::cout << "Age: " << ptr->age << std::endl;
std::cout << "Height: " << ptr->height << " meters" << std::endl;
// 修改結(jié)構(gòu)體成員變量
ptr->name = "Bob";
ptr->age = 30;
ptr->height = 1.8;
// 通過原始結(jié)構(gòu)體變量訪問已修改的成員變量
std::cout << "Name: " << person.name << std::endl;
std::cout << "Age: " << person.age << std::endl;
std::cout << "Height: " << person.height << " meters" << std::endl;
return 0;
}
在上述示例中,我們定義了一個名為Person的結(jié)構(gòu)體,并創(chuàng)建了一個名為person的結(jié)構(gòu)體變量。
然后,我們聲明了一個指向Person結(jié)構(gòu)體的指針ptr,并使用取地址運算符(&)將其指向person變量的內(nèi)存地址。
通過指針訪問結(jié)構(gòu)體成員變量時,我們使用箭頭運算符(->),它結(jié)合了解引用操作符(*)和點運算符(.)。例如,ptr->name等效于(*ptr).name,允許我們訪問ptr所指向的結(jié)構(gòu)體的成員變量。
我們還可以通過指針對結(jié)構(gòu)體成員變量進行修改。例如,ptr->name = "Bob"將修改person的name成員變量的值。
最后,我們通過原始結(jié)構(gòu)體變量訪問已修改的成員變量,并打印它們的值。
請注意,當(dāng)使用指向結(jié)構(gòu)的指針時,需要確保指針指向有效的結(jié)構(gòu)體對象。否則,解引用指針可能會導(dǎo)致未定義的行為或錯誤。
typedef 關(guān)鍵字
typedef是C和C++中的關(guān)鍵字,用于為已存在的類型創(chuàng)建一個新的類型別名。通過typedef,您可以為已有類型指定一個新的名稱,從而增強代碼的可讀性和可維護性。
typedef的語法如下:
typedef existing_type new_type;
其中,existing_type是已存在的類型,而new_type是您為該類型定義的新的類型別名。
下面是一些使用typedef的例子:
typedef int myInt; // 為int類型創(chuàng)建一個新的類型別名為myInt
typedef unsigned int uint; // 為unsigned int類型創(chuàng)建一個新的類型別名為uint
typedef float distance; // 為float類型創(chuàng)建一個新的類型別名為distance
typedef int* IntPtr; // 為int*類型(指向int的指針)創(chuàng)建一個新的類型別名為IntPtr
typedef void (*FuncPtr)(int); // 為函數(shù)指針類型創(chuàng)建一個新的類型別名為FuncPtr
在上述示例中,我們使用typedef關(guān)鍵字為不同的類型創(chuàng)建了新的類型別名。這些類型別名可以像普通類型一樣使用,提供了更具描述性的名稱,使得代碼更易于理解和維護。
例如,在第一個例子中,我們?yōu)閕nt類型創(chuàng)建了一個新的類型別名myInt。現(xiàn)在,我們可以使用myInt關(guān)鍵字來聲明變量,就像使用int一樣:
myInt num = 10;
同樣,其他的類型別名也可以按照這種方式使用。
需要注意的是,typedef只是為已存在的類型創(chuàng)建了一個新的名稱,它并沒有創(chuàng)建新的類型。因此,typedef并不會引入新的數(shù)據(jù)類型,只是給現(xiàn)有的類型起了一個別名。
示例 1:為結(jié)構(gòu)體創(chuàng)建類型別名
#include <iostream>
// 定義一個結(jié)構(gòu)體
struct Person {
std::string name;
int age;
};
// 為結(jié)構(gòu)體創(chuàng)建類型別名
typedef struct Person PersonStruct;
int main() {
// 使用類型別名創(chuàng)建結(jié)構(gòu)體變量
PersonStruct person;
person.name = "John";
person.age = 25;
// 輸出結(jié)構(gòu)體成員
std::cout << "Name: " << person.name << std::endl;
std::cout << "Age: " << person.age << std::endl;
return 0;
}
在上述示例中,我們定義了一個名為Person的結(jié)構(gòu)體。然后,使用typedef關(guān)鍵字為該結(jié)構(gòu)體創(chuàng)建了一個新的類型別名PersonStruct。接著,在main函數(shù)中,我們使用PersonStruct類型別名來聲明了一個結(jié)構(gòu)體變量person,并對其進行賦值和輸出。
示例 2:為函數(shù)指針創(chuàng)建類型別名
#include <iostream>
// 原始的函數(shù)原型
void myFunction(int x);
// 為函數(shù)指針創(chuàng)建類型別名
typedef void (*FuncPtr)(int);
int main() {
// 使用類型別名聲明函數(shù)指針變量
FuncPtr ptr = &myFunction;
// 調(diào)用函數(shù)通過指針
ptr(5);
return 0;
}
// 實現(xiàn)函數(shù)
void myFunction(int x) {
std::cout << "The value is: " << x << std::endl;
}
在上述示例中,我們首先定義了一個函數(shù)myFunction,它接受一個整數(shù)參數(shù)并沒有返回值。然后,使用typedef關(guān)鍵字為該函數(shù)指針類型創(chuàng)建了一個新的類型別名FuncPtr。在main函數(shù)中,我們使用FuncPtr類型別名來聲明了一個函數(shù)指針變量ptr,并將其指向myFunction函數(shù)。最后,通過函數(shù)指針調(diào)用了myFunction函數(shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-742894.html
這些示例展示了typedef的使用,以便為已存在的類型創(chuàng)建新的類型別名。文章來源地址http://www.zghlxwxcb.cn/news/detail-742894.html
到了這里,關(guān)于學(xué)習(xí)c++的第九天的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!