学习c++的第九天

这篇具有很好参考价值的文章主要介绍了学习c++的第九天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

结构体

定义与访问结构

结构作为函数参数

指向结构的指针

typedef 关键字

示例 1:为结构体创建类型别名

示例 2:为函数指针创建类型别名


结构体

定义与访问结构

在C++中,结构体(structure)是一种用户自定义的数据类型,用于组合不同类型的数据成员。结构体可以包含变量、函数和其他数据类型。

要定义一个结构体,在C++中使用struct关键字,然后指定结构体的名称和成员变量。结构体的定义位于大括号{}内部,每个成员变量都由其类型和名称组成,并用分号;分隔。

struct 语句的格式如下:

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结构体变量:

#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++中,可以将结构作为函数的参数传递。这意味着我们可以将结构体变量作为参数传递给函数,以便在函数中访问和操作结构体成员变量。

结构体可以作为函数参数传递,有两种传递方式:

  • 传值方式:将整个结构体作为参数传递给函数,这将复制整个结构体,并将副本传递给函数。在函数中对结构体成员变量的更改不会影响原始结构体。
  • 引用方式:将结构体作为引用参数传递给函数,这将允许函数直接访问原始结构体。在函数中对结构体成员变量的更改将直接反映在原始结构体上。

下面是一个示例程序,演示如何将结构体作为函数参数传递:

#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++中,可以使用指针来引用和操作结构体。指向结构的指针指向结构体变量的内存地址,允许我们通过解引用操作符(*)来访问和修改结构体成员变量。

以下是一个示例演示如何声明和使用指向结构的指针:

#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的语法如下:

typedef existing_type new_type;

其中,existing_type是已存在的类型,而new_type是您为该类型定义的新的类型别名。

下面是一些使用typedef的例子:

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一样:

myInt num = 10;

同样,其他的类型别名也可以按照这种方式使用。

需要注意的是,typedef只是为已存在的类型创建了一个新的名称,它并没有创建新的类型。因此,typedef并不会引入新的数据类型,只是给现有的类型起了一个别名。

示例 1:为结构体创建类型别名
#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:为函数指针创建类型别名
#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的使用,以便为已存在的类型创建新的类型别名。文章来源地址https://www.toymoban.com/news/detail-742894.html

到了这里,关于学习c++的第九天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学习c++的第四天

    目录 运算符 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 运算符优先级 算术运算符是 C++ 中用于执行基本算术操作的运算符。 加法运算符 (+):将两个操作数相加。例如,A + B 将得到 30,因为 10 + 20 等于 30。 减法运算符 (-):从第一个操作数中减去第

    2024年02月06日
    浏览(46)
  • 学习c++的第二天

    目录 数据类型 基本数据类型 typedef 声明 枚举类型 类型转换 变量类型 变量定义 变量声明 左值(Lvalues)和右值(Rvalues) 变量作用域 C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型: 类型 布尔型 bool 字符型

    2024年02月06日
    浏览(48)
  • 学习C语言的第一天

    使用工具:visual studio 2010 搭建过程:新建项目、配置设置(主要是解决运行后一闪而过的问题)   如何输出各种数据类型?  学习字节以及一些常用基本单位:  搞懂十进制和二进制如何计算?  从以上内容,我们可以得出:如果我使用的是int类型,那么将有32个bit,也就是

    2023年04月18日
    浏览(60)
  • 小白学习c++的的第一节课

    经过了很长时间对C语言和c的数据结构学习,终于开始学C++了。前面基础不牢,后面地动山摇,给自己加油。 该如何去学习c++? 多写博客。写博客,主要是总结自己学习的知识,更系统更全面对所学的知识进行概况,也能起到复习的作用。 有时间的话多看看课外书 c++的学习不

    2024年02月08日
    浏览(46)
  • c++类开发的第三篇(讲明白友元函数和this指针)

    c++实现了 封装 , 数据 和 处理数据的操作(函数) 是分开存储的。 c++中的 非静态数据成员 直接内含在类对象中,就像c语言的struct一样。 成员函数并不会出现在对象中,而是作为类的一部分存储在代码段中,需要通过对象或对象指针进行调用。成员函数可以访问类的所有成员

    2024年02月21日
    浏览(47)
  • NRCE 二级C语言开发环境:Microsoft Visual C++ 2010 学习版下载

    Microsoft Visual C++ 2010 学习版 2022版考纲 网盘链接:点击下载 提取码:siyy 网盘地址下载太慢可以到:官网下载 下载完成后,是一个iso镜像文件,点击上方装载。 装载完成后,可以看到计算机处有个无穷图标的DVD驱动器 现在就可以去到你安装磁盘目录下的IDE目录(星号中间的

    2024年02月11日
    浏览(57)
  • C++类开发的第六篇(虚拟继承实现原理和cl命令的使用的bug修复)

    接上一篇末尾虚拟继承的简单介绍之后,这篇来详细讲一下这个内存大小是怎么分配的。 cl 是 Microsoft Visual Studio 中的 C/C++ 编译器命令。通过在命令行中键入 cl 命令,可以调用 Visual Studio 的编译器进行编译操作。 cl 命令提供了各种选项和参数,用于指定源文件、编译选项、

    2024年03月09日
    浏览(46)
  • 秒懂百科,C++如此简单丨第十九天:动态规划

    目录 动态规划的初步理解 求最短路径数 洛谷 P1002 过河卒  题目描述 输入样例 输出样例  思路 AC Code The greatest glory in living lies not in never falling, but in rising every time we fall. 生命中最大的荣耀不在于从未跌倒,而在于每次跌倒后都能重新站起来。 什么是动态规划?最直白的理解

    2024年02月19日
    浏览(45)
  • Go学习第九天

    使用sqlite3

    2024年02月12日
    浏览(30)
  • 学习JAVA打卡第四十九天

    Random类 尽管可以使用math类调用static方法random()返回一个0~1之间的随机数。(包括0.0但不包括0.1),即随机数的取值范围是[0.0,1.0]的左闭右开区间。 例如,下列代码得到1~100之间的随机数(包括1和100)  使用Random类的如下构造方法:  创建random对象,其中第一个构造方法

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包