目录
[typedef 关键字](#typedef 关键字)
[示例 1:为结构体创建类型别名](#示例 1:为结构体创建类型别名)
[示例 2:为函数指针创建类型别名](#示例 2:为函数指针创建类型别名)
结构体
定义与访问结构
在C++中,结构体(structure)是一种用户自定义的数据类型,用于组合不同类型的数据成员。结构体可以包含变量、函数和其他数据类型。
要定义一个结构体,在C++中使用struct关键字,然后指定结构体的名称和成员变量。结构体的定义位于大括号{}内部,每个成员变量都由其类型和名称组成,并用分号;分隔。
struct 语句的格式如下:
cpp
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
- type_name是为结构体定义的名称,它可以自定义,但建议遵循C++命名约定,例如使用驼峰式命名法。类似于变量名或函数名,结构体名称也需要唯一。
- 在结构体定义的末尾,可以选择性地指定一个或多个结构体变量。这些变量将使用结构体类型中定义的成员变量分配内存空间。结构体变量的定义方式与其他变量的定义方式相同。
- 结构体成员变量可以是任何有效的数据类型,包括基本类型(如int、float等)、自定义类型(如字符串、数组等)和其他结构体类型。结构体成员变量之间用逗号分隔。
- 结构体成员变量的访问方式是使用点运算符 ".",例如:object.member_name。其中,object是结构体变量的名称,member_name是结构体成员变量的名称。
- 结构体变量的初始化方式与其他变量的初始化方式相同,可以使用赋值运算符或花括号语法。
下面是一个示例,演示如何定义一个名为Person的结构体,并创建两个Person结构体变量:
cpp
#include <iostream>
#include <string>
// 定义结构体
struct Person {
std::string name;
int age;
double height;
} person1, person2; // 创建两个Person结构体变量
int main() {
// 初始化person1结构体变量
person1.name = "Alice";
person1.age = 25;
person1.height = 1.65;
// 初始化person2结构体变量
person2.name = "Bob";
person2.age = 30;
person2.height = 1.8;
// 访问结构体成员
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关键字定义了一个名为Person的结构体,并在大括号内部定义了三个成员变量:name、age和height。然后,在结构体定义的末尾,我们定义了两个Person结构体变量:person1和person2。
在main函数中,我们初始化了这两个结构体变量,并使用点运算符.访问它们的成员变量。最后,我们使用std::cout语句打印结构体中的成员变量值。
结构作为函数参数
在C++中,可以将结构作为函数的参数传递。这意味着我们可以将结构体变量作为参数传递给函数,以便在函数中访问和操作结构体成员变量。
结构体可以作为函数参数传递,有两种传递方式:
- 传值方式:将整个结构体作为参数传递给函数,这将复制整个结构体,并将副本传递给函数。在函数中对结构体成员变量的更改不会影响原始结构体。
- 引用方式:将结构体作为引用参数传递给函数,这将允许函数直接访问原始结构体。在函数中对结构体成员变量的更改将直接反映在原始结构体上。
下面是一个示例程序,演示如何将结构体作为函数参数传递:
cpp
#include <iostream>
#include <string>
// 定义结构体
struct Person {
std::string name;
int age;
double height;
};
// 函数声明
void printPerson(Person p); // 传值方式
void updatePerson(Person& p, std::string newName, int newAge, double newHeight); // 引用方式
int main() {
// 创建一个Person结构体变量
Person person;
person.name = "Alice";
person.age = 25;
person.height = 1.65;
// 传值方式调用函数
printPerson(person);
// 引用方式调用函数
updatePerson(person, "Bob", 30, 1.8);
printPerson(person);
return 0;
}
// 函数定义 - 传值方式
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;
}
// 函数定义 - 引用方式
void updatePerson(Person& p, std::string newName, int newAge, double newHeight) {
p.name = newName;
p.age = newAge;
p.height = newHeight;
}
在上面的示例程序中,我们定义了一个名为Person的结构体,并创建了一个名为person的结构体变量。然后,我们调用了两个函数printPerson和updatePerson,并将person作为参数传递给这些函数。
printPerson函数采用传值方式将结构体作为参数传递,而updatePerson函数采用引用方式将结构体作为参数传递。
在printPerson函数中,我们使用点运算符"."访问结构体成员变量,并打印它们的值。
在updatePerson函数中,我们使用引用参数修改了结构体成员变量的值。由于p是指向person结构体的引用,因此对p的更改将直接反映在person结构体上。
最后,我们再次调用printPerson函数,并打印已更新的结构体成员变量的值。
指向结构的指针
在C++中,可以使用指针来引用和操作结构体。指向结构的指针指向结构体变量的内存地址,允许我们通过解引用操作符(*)来访问和修改结构体成员变量。
以下是一个示例演示如何声明和使用指向结构的指针:
cpp
#include <iostream>
#include <string>
// 定义结构体
struct Person {
std::string name;
int age;
double height;
};
int main() {
// 创建一个Person结构体变量
Person person;
person.name = "Alice";
person.age = 25;
person.height = 1.65;
// 创建指向Person结构体的指针,并将其指向person变量
Person* ptr = &person;
// 通过指针访问结构体成员变量
std::cout << "Name: " << ptr->name << std::endl;
std::cout << "Age: " << ptr->age << std::endl;
std::cout << "Height: " << ptr->height << " meters" << std::endl;
// 修改结构体成员变量
ptr->name = "Bob";
ptr->age = 30;
ptr->height = 1.8;
// 通过原始结构体变量访问已修改的成员变量
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的结构体,并创建了一个名为person的结构体变量。
然后,我们声明了一个指向Person结构体的指针ptr,并使用取地址运算符(&)将其指向person变量的内存地址。
通过指针访问结构体成员变量时,我们使用箭头运算符(->),它结合了解引用操作符(*)和点运算符(.)。例如,ptr->name等效于(*ptr).name,允许我们访问ptr所指向的结构体的成员变量。
我们还可以通过指针对结构体成员变量进行修改。例如,ptr->name = "Bob"将修改person的name成员变量的值。
最后,我们通过原始结构体变量访问已修改的成员变量,并打印它们的值。
请注意,当使用指向结构的指针时,需要确保指针指向有效的结构体对象。否则,解引用指针可能会导致未定义的行为或错误。
typedef 关键字
typedef是C和C++中的关键字,用于为已存在的类型创建一个新的类型别名。通过typedef,您可以为已有类型指定一个新的名称,从而增强代码的可读性和可维护性。
typedef的语法如下:
cpp
typedef existing_type new_type;
其中,existing_type是已存在的类型,而new_type是您为该类型定义的新的类型别名。
下面是一些使用typedef的例子:
cpp
typedef int myInt; // 为int类型创建一个新的类型别名为myInt
typedef unsigned int uint; // 为unsigned int类型创建一个新的类型别名为uint
typedef float distance; // 为float类型创建一个新的类型别名为distance
typedef int* IntPtr; // 为int*类型(指向int的指针)创建一个新的类型别名为IntPtr
typedef void (*FuncPtr)(int); // 为函数指针类型创建一个新的类型别名为FuncPtr
在上述示例中,我们使用typedef关键字为不同的类型创建了新的类型别名。这些类型别名可以像普通类型一样使用,提供了更具描述性的名称,使得代码更易于理解和维护。
例如,在第一个例子中,我们为int类型创建了一个新的类型别名myInt。现在,我们可以使用myInt关键字来声明变量,就像使用int一样:
cpp
myInt num = 10;
同样,其他的类型别名也可以按照这种方式使用。
需要注意的是,typedef只是为已存在的类型创建了一个新的名称,它并没有创建新的类型。因此,typedef并不会引入新的数据类型,只是给现有的类型起了一个别名。
示例 1:为结构体创建类型别名
cpp
#include <iostream>
// 定义一个结构体
struct Person {
std::string name;
int age;
};
// 为结构体创建类型别名
typedef struct Person PersonStruct;
int main() {
// 使用类型别名创建结构体变量
PersonStruct person;
person.name = "John";
person.age = 25;
// 输出结构体成员
std::cout << "Name: " << person.name << std::endl;
std::cout << "Age: " << person.age << std::endl;
return 0;
}
在上述示例中,我们定义了一个名为Person的结构体。然后,使用typedef关键字为该结构体创建了一个新的类型别名PersonStruct。接着,在main函数中,我们使用PersonStruct类型别名来声明了一个结构体变量person,并对其进行赋值和输出。
示例 2:为函数指针创建类型别名
cpp
#include <iostream>
// 原始的函数原型
void myFunction(int x);
// 为函数指针创建类型别名
typedef void (*FuncPtr)(int);
int main() {
// 使用类型别名声明函数指针变量
FuncPtr ptr = &myFunction;
// 调用函数通过指针
ptr(5);
return 0;
}
// 实现函数
void myFunction(int x) {
std::cout << "The value is: " << x << std::endl;
}
在上述示例中,我们首先定义了一个函数myFunction,它接受一个整数参数并没有返回值。然后,使用typedef关键字为该函数指针类型创建了一个新的类型别名FuncPtr。在main函数中,我们使用FuncPtr类型别名来声明了一个函数指针变量ptr,并将其指向myFunction函数。最后,通过函数指针调用了myFunction函数。
这些示例展示了typedef的使用,以便为已存在的类型创建新的类型别名。