结构体的语法知识

在实际问题中,一组数据往往具有不同的数据类型。例如,人口大普查时,我们需要记录每一位公民的姓名,年龄,性别,住址,身份证号码。这些信息分别要用整型,字符型,字符串型来记录。为了解决问题,C++语言给出了另一种构造数据类型——“结构体”,它在数据存储方面相当于其他高级语言中的记录,但它有着面向对象的优势。

一、结构体定义和操作

1. 定义结构体及结构体变量

结构体变量的定义有两种方式:

定义结构体的同时定义结构体变量

struct 结构体名 {  //其中 struct 是关键字
	成员表   //可以有多个成员
	成员函数  //可以有多个成员函数,也可以没有
} 结构体变量表; //可以同时定义多个结构体变量

Copy

结构体变量名列表的各个变量用“,”隔开。例如:

struct DATA{
	int a[2];     //成员为一个数组
	int c;      
}data_a,data_b;

Copy

当然,我们也可以先定义结构体再定义结构体变量

struct 结构体名{
	成员表
	成员函数
};

结构体名  结构体变量表;//同样可以同时定义多个结构体变量

Copy

例如:

struct DATA{
	int a[2];                      
	int c;      
};
DATA data_a,data_b;//这种定义方式与上一种方式的效果是相同的

Copy

在定义结构体变量时注意,结构体变量名和结构体名不能相同。在定义结构体时,系统对之不分配实际内存。只有定义结构体变量时,系统才为其分配内存。

2.成员调用

结构体变量与各个成员之间引用的一般形式为:

结构体变量名. 成员名

Copy

对于上面定义的结构体变量,我们可以这样操作:

cin>>data_a.a[0]>>data_a.a[1];  //一般情况下不能写 cin>>data_a;

int a=data_a.a[0]+data_a.a[1];    //就像用整形变量一样用a[0]、a[1]

data_b=data_a;       //结构体之间的相互赋值是合法的

data_a.c=0;       //就如同给整形变量赋值

Copy

实际上结构体成员的操作与该成员类型所具有的操作是一致的。

成员运算符“.”在存取成员数值时使用,其优先级最高,并具有左结合性。在处理包含结构体的结构体时,可记作:

strua. strub. membb

Copy

这说明结构体变量 strua 有结构体成员 strub;结构体变量 strub 有成员 membb。

3.成员函数调用

结构体成员函数调用的一般形式为:

结构体变量名. 成员函数  

Copy

结构体成员函数默认将结构体变量作为引用参数。

二、结构体操作实例

现在,我们先定义一个简单的结构体,这个结构体将用来记录一个学生的大致情况,所以它的成员应该有学号、姓名、性别、年龄、成绩、家庭住址等。

#include<iostream>
using namespace std;
struct student{
	int num; //学号
	char name[21]; //姓名
	char sex; //性别
	int age; //年龄
	float score; //成绩
	char address[51]; //家庭住址
}; //此处不可忽略分号
struct student a,b;
int main()
{
	cin>>a.num>>a.name>>a.sex>>a.age>>a.score>>a.address;
	cin>>b.num>>b.name>>b.sex>>b.age>>b.score>>b.address;
	cout<<a.num<<' '<<a.name<<' '<<a.sex<<' '<<a.age<<' '<<a.score<<' '<<a.address<<endl;
	cout<<b.num<<' '<<b.name<<' '<<b.sex<<' '<<b.age<<' '<<b.score<<' '<<b.address<<endl;
	return 0;
在 C++ 中,结构体(`struct`)是一种用户自定义的数据类型,允许将不同类型的数据组合在一起。与类(`class`)类似,结构体也可以包含成员变量和成员函数。以下是关于 C++ 结构体的定义和用法的详细说明: ### 定义结构体 使用 `struct` 关键字来定义一个结构体。基本语法如下: ```cpp struct 结构体名称 { // 成员变量或成员函数 }; ``` 例如,定义一个表示商品的结构体: ```cpp struct Product { std::string name; int quantity; double price; void display() { std::cout << "Name: " << name << ", Quantity: " << quantity << ", Price: $" << price << std::endl; } }; ``` 该结构体包含三个成员变量:`name`、`quantity` 和 `price`,以及一个成员函数 `display()` 用于打印这些信息。 ### 声明结构体变量 在定义结构体后,可以声明其变量并访问其成员。成员通过点号运算符(`.`)进行访问。 ```cpp Product p1; p1.name = "Laptop"; p1.quantity = 5; p1.price = 999.99; p1.display(); // 输出: Name: Laptop, Quantity: 5, Price: $999.99 ``` ### 结构体的初始化 可以在声明结构体变量时对其进行初始化。C++ 支持多种初始化方式,包括直接赋值和列表初始化。 ```cpp Product p2 = {"Phone", 10, 699.99}; p2.display(); // 输出: Name: Phone, Quantity: 10, Price: $699.99 ``` ### 结构体嵌套 结构体可以嵌套其他结构体,从而创建更复杂的数据结构。例如: ```cpp struct Address { std::string street; std::string city; std::string state; }; struct Employee { std::string name; int id; Address address; // 嵌套结构体 }; Employee emp; emp.name = "John Doe"; emp.id = 12345; emp.address.street = "123 Main St"; emp.address.city = "New York"; emp.address.state = "NY"; ``` ### 使用 `typedef` 简化声明 通过 `typedef` 可以简化结构体类型的声明: ```cpp typedef struct { int x; int y; } Point; Point p; p.x = 10; p.y = 20; ``` ### 结构体作为函数参数 结构体可以作为函数的参数传递,通常推荐使用引用以避免不必要的拷贝。 ```cpp void printProduct(const Product& product) { std::cout << "Name: " << product.name << ", Price: $" << product.price << std::endl; } printProduct(p1); // 输出: Name: Laptop, Price: $999.99 ``` ### 结构体指针 可以通过指针访问结构体的成员,使用箭头操作符(`->`)。 ```cpp Product* pPtr = &p1; pPtr->price = 899.99; // 修改价格 pPtr->display(); // 输出: Name: Laptop, Quantity: 5, Price: $899.99 ``` ### 示例代码总结 以下是一个完整的示例代码,展示了结构体的定义、初始化和基本用法: ```cpp #include <iostream> #include <string> struct Product { std::string name; int quantity; double price; void display() { std::cout << "Name: " << name << ", Quantity: " << quantity << ", Price: $" << price << std::endl; } }; int main() { Product p1; p1.name = "Laptop"; p1.quantity = 5; p1.price = 999.99; p1.display(); Product p2 = {"Phone", 10, 699.99}; p2.display(); return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值