Javer 学 c++(九):结构体篇

总览

主要讲了 c++ 中结构体的定义、嵌套使用以及和函数、const 的结合使用

定义和使用

结构体属于用户自定义的数据类型,允许用户存储不同的数据类型

语法:struct 结构体名 { 结构体成员列表 };

通过结构体创建变量的方式有三种,见下代码:

c++ 复制代码
#include <iostream>
using namespace std;

struct Student {
    string name;
    int age;
    int score;
}s3;

int main() {

    // 创建方式一:创建空的然后赋值
    struct Student s1;
    s1.name = "John";
    s1.age = 18;
    s1.score = 10;
    cout << s1.name << " " << s1.age << " " << s1.score << endl;
    // 创建方式二
    struct  Student s2 = {"River", 18, 100 };
    // 创建方式三:定义结构体的时候顺手的事
    s3.name = "Jewel";
    s3.age = 18;
    s3.score = 10;

}

一种 Java 没有的数据类型,Java 里万物皆类

  • 创建结构体变量的时候,struct 关键字可以省略
  • 结构体通过 . 来访问成员

结构体指针

通过指针->来访问结构体的成员

c++ 复制代码
#include <iostream>
using namespace std;

struct Student {
    string name;
    int age;
    int score;
}s3;

int main() {

    Student s = {"River", 20, 100};
    Student * p = &s;
    // 使用 -> 箭头来访问
    cout << p->name << " " << p->age << " " << p->score << endl;

}

结构体嵌套结构体

结构体的成员可以是另一个结构体

c++ 复制代码
#include <iostream>
using namespace std;

struct Student {
    string name;
    int age;
    int score;
};

struct Teacher {
    int id;
    string name;
    int age;
    Student student;
};

int main() {

    Teacher t;
    t.id = 2;
    t.name = "John";
    t.age = 10;

    t.student = {"River", 10, 20};

    return 0;
}

结构体做函数参数

将结构体作为参数向函数中传递: 值传递 or 引用传递

c++ 复制代码
#include <iostream>
using namespace std;

struct Student {
    string name;
    int age;
    int score;
};

// 值传递
void printStudent1(Student student) {
    student.age = 10; // 值传递:原来的对象值不变
    cout << student.name << student.age << student.score << endl;
}

// 地址传递
void printStudent2(Student * p) {
    p->age = 10; // 地址传递:原来的对象值会变
    cout << p->name << p->age << p->score << endl;
}

int main() {

    Student student = {"River", 10, 20};

    printStudent1(student);

    Student * p = &student;
    printStudent2(p);

    return 0;
}

结构体中 const 的使用

作用:用 const 来防止误操作

c++ 复制代码
#include <iostream>
using namespace std;

struct Student {
    string name;
    int age;
    int score;
};

// 地址传递
void printStudent2(const Student * p) {
    p->age = 10; // 报错,因为是 const,解决了引用误操作的问题
    cout << p->name << p->age << p->score << endl;
}

int main() {

    Student student = {"River", 10, 20};

    Student * p = &student;
    printStudent2(p);

    return 0;
}

值传递每次都要复制一份,在结构体较大以及调用次数较多的时候,会非常占用空间;而引用传递每次只需要 8 字节,可以很好的解决这个问题

但是引用传递有一个隐患就是会修改实参,所以有时候需要加个 const 来防止误修改

相关推荐
ZZHow10245 分钟前
Ascend C算子开发(高级)笔记
c++·人工智能·笔记·深度学习·华为云
程序员梅雨15 分钟前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
蜗牛互联网36 分钟前
Java 17 调用视觉 Responses API:JSON 约束与人工复核路由
java·人工智能·后端
aqiu11111143 分钟前
【C++算法打怪专栏】LeetCode 217. 存在重复元素(解法总结)
c++·算法·leetcode
lojox1 小时前
深入理解 C++ STL:vector 底层实现、迭代器失效与 list 特性
开发语言·c++
高频因子挖掘机2 小时前
股票分红送转后价格“断层”:前复权、后复权和不复权该怎么选?
后端·github·api
一条泥憨鱼2 小时前
【Redis | 黑马点评】短信登录功能 源码深度分析
java·redis·后端·session·黑马点评
威哥爱编程2 小时前
【AI全栈12-12】Spring Boot 3.x → 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·spring boot·后端
微笑星河q2 小时前
C++类和对象(下)初始化列表、类型转换、static、友元、内部类、匿名对象
开发语言·c++
威哥爱编程2 小时前
【AI全栈12-11】Spring Boot 把 AI 接口真正上线扛量:限流 / 降级 / 可观测
java·spring boot·后端