目录
一、基本介绍
结构体在C++中存在的唯一意义就是为了希望与C保持向后兼容性,因为C没有class(类)但是有结构体,如果突然的去除结构体会失去两者的兼容性,C++的编译器无法识别struct。因此类中有的函数和操作同样是可以用于struct,但是两者还是有一些不同的。
class和struct
相同点
1.成员变量和成员函数:struct 和 class 都可以包含成员变量和成员函数。
2.构造函数和析构函数:两者都可以有构造函数和析构函数。
3.继承:struct 和 class 都可以被继承,也可以作为基类。
4.实例化:无论是 struct 还是 class,都可以被用来创建对象。
5.访问控制:struct 和 class 都支持三种访问控制级别:public、protected 和 private。
6.成员函数的特性:两者的成员函数都可以是虚函数,从而支持多态。
7.模板使用:struct 和 class 都可以被用作模板参数。
但是我们一般是不会使用struct去进行继承或者其他比较复杂的操作。基本就是C中的使用方法,但是在初始化的时候会使用class的方法。
不同点
默认访问权限:
在 class 中,默认的成员访问权限和继承类型是 private。
在 struct 中,默认的成员访问权限和继承类型是 public。
二、基本操作
1.定义struct
struct MyStruct {
int myInt;
double myDouble;
std::string myString;
};
2.创建struct实例
MyStruct s;
3.访问成员
s.myInt = 10;
s.myDouble = 3.14;
s.myString = "Hello";
4.使用构造函数(C++11 及更高版本)
在 C++11 及更高版本中,可以在 struct 内部定义构造函数来初始化成员:
struct MyStruct {
MyStruct(int x, double y, std::string z) : myInt(x), myDouble(y), myString(z) {}
int myInt;
double myDouble;
std::string myString;
};
MyStruct s(10, 3.14, "Hello");
5.结构体数组
MyStruct arrayOfStructs[5];
6.结构体作为函数参数
void printStruct(const MyStruct& s) {
std::cout << s.myInt << ", " << s.myDouble << ", " << s.myString << std::endl;
}
printStruct(s);
7.结构体作为函数返回值
MyStruct createStruct() {
MyStruct s;
s.myInt = 1;
s.myDouble = 2.2;
s.myString = "Struct";
return s;
}
MyStruct newStruct = createStruct();
8.指向结构体的指针
MyStruct* ptr = &s;
ptr->myInt = 20;
三、项目实例
让我们通过一个具体的项目示例来展示如何在实践中使用 struct。假设我们要创建一个简单的图书管理系统,其中涉及图书的信息记录和处理。这个系统将使用 struct 来存储和操作图书信息。
#include <iostream>
#include <string>
// 定义图书信息的结构体
struct Book {
std::string title; // 书名
std::string author; // 作者
int yearPublished; // 出版年份
// 构造函数
Book(const std::string& t, const std::string& a, int y) : title(t), author(a), yearPublished(y) {}
};
// 函数:打印一本书的信息
void printBookInfo(const Book& book) {
std::cout << "Title: " << book.title
<< ", Author: " << book.author
<< ", Year: " << book.yearPublished << std::endl;
}
int main() {
// 使用构造函数创建书籍实例
Book book1("The Great Gatsby", "F. Scott Fitzgerald", 1925);
Book book2("1984", "George Orwell", 1949);
Book book3("To Kill a Mockingbird", "Harper Lee", 1960);
// 使用数组来存储多本书籍
Book library[3] = {book1, book2, book3};
// 打印书籍信息
printBookInfo(book1);
printBookInfo(book2);
printBookInfo(book3);
return 0;
}