【C++14保姆级教程】带默认成员初始化器的聚合类

举报
人才程序员 发表于 2023/08/29 12:19:33 2023/08/29
【摘要】 @TOC 前言C++是一种强大的编程语言,它为程序员提供了许多灵活的功能和特性。其中之一是在C++11及以后的版本中引入的带默认成员初始化器的聚合类的概念。本教程将详细介绍带默认成员初始化器的聚合类是什么以及如何使用它们。 一、默认成员初始化器的聚合类 1.1 什么是带默认成员初始化器的聚合类?在C++中,聚合类是指一种特殊类型的类,其成员变量都是公有的,没有定义任何构造函数,并且没有基类或...

@TOC


前言

C++是一种强大的编程语言,它为程序员提供了许多灵活的功能和特性。其中之一是在C++11及以后的版本中引入的带默认成员初始化器的聚合类的概念。本教程将详细介绍带默认成员初始化器的聚合类是什么以及如何使用它们。


一、默认成员初始化器的聚合类

1.1 什么是带默认成员初始化器的聚合类?

在C++中,聚合类是指一种特殊类型的类,其成员变量都是公有的,没有定义任何构造函数,并且没有基类或虚函数。在C++11之前的版本中,对于聚合类型的成员变量,只能通过构造函数或成员初始化列表进行初始化,无法直接提供默认值。然而,在C++11及以后的版本中,我们可以为聚合类的成员变量提供默认值,这就是带默认成员初始化器的聚合类的概念。

1.2 如何使用带默认成员初始化器的聚合类?

使用带默认成员初始化器的聚合类非常简单和直观。我们可以通过在成员变量的声明中使用=并提供一个默认值来进行初始化。当创建一个对象时,如果没有显式提供该成员变量的值,那么将自动初始化为默认值。

下面通过几个示例代码来演示如何使用带默认成员初始化器的聚合类。

1.3 示例1:使用默认成员初始化器的简单聚合类

#include <iostream>

struct Point {
    int x = 0;  // 默认成员初始化器
    int y = 0;  // 默认成员初始化器
};

int main() {
    Point p; // 声明一个Point对象p
    std::cout << "x: " << p.x << ", y: " << p.y << std::endl;
    return 0;
}

在这里插入图片描述

在这个示例中,我们定义了一个简单的聚合类Point,其中包含x和y两个成员变量,并使用默认成员初始化器将它们的默认值设置为0。当我们声明一个Point对象p时,它的成员变量x和y将自动初始化为默认值0。在此我们输出了x和y的值,结果为x: 0, y: 0。

1.4 示例2:带默认成员初始化器的聚合类与数位分割符

#include <iostream>
#include <iomanip>

struct Book {
    std::string title = "Untitled";    // 默认成员初始化器
    int year = 0;                      // 默认成员初始化器
    double price = 0.0;                // 默认成员初始化器
};

int main() {
    Book book1; // 声明一个Book对象book1
    book1.title = "The Catcher in the Rye";
    book1.year = 1951;
    book1.price = 12.5;

    Book book2; // 声明一个Book对象book2
    book2.title = "To Kill a Mockingbird";
    book2.year = 1960;
    book2.price = 10.99;

    std::cout << std::fixed << std::setprecision(2);
    std::cout << "Book 1: " << book1.title << " (" << book1.year << "), Price: $" << book1.price << std::endl;
    std::cout << "Book 2: " << book2.title << " (" << book2.year << "), Price: $" << book2.price << std::endl;

    return 0;
}

在这里插入图片描述
在这个示例中,我们定义了一个更复杂的聚合类Book,其中包含了书名、出版年份和价格三个成员变量,并使用默认成员初始化器为它们提供了默认值。我们声明了两个Book对象book1和book2,并分别对它们的成员变量进行了赋值。通过使用std::fixed和std::setprecision设置了输出浮点数的精度,我们打印了两本书的信息。

1.5 示例3:带默认成员初始化器的聚合类与函数返回值推导

#include <iostream>

struct Rectangle {
    double width = 0.0;   // 默认成员初始化器
    double height = 0.0;  // 默认成员初始化器
};

Rectangle createRectangle(double w, double h) {
    return {w, h};
}

int main() {
    Rectangle r = createRectangle(3.5, 4.5);
    std::cout << "Width: " << r.width << ", Height: " << r.height << std::endl;
    return 0;
}

在这里插入图片描述

在这个示例中,我们定义了一个Rectangle聚合类,它包含了矩形的宽度和高度两个成员变量,并使用默认成员初始化器为它们提供了默认值。我们编写了一个名为createRectangle的函数,它接受两个参数并返回一个Rectangle对象。由于Rectangle是聚合类,我们可以使用花括号初始化语法{w, h}直接创建并返回一个Rectangle对象,宽度和高度由传入的参数确定。在main函数中,我们调用createRectangle函数创建一个Rectangle对象并输出其宽度和高度。

1.6 示例4:带默认成员初始化器的聚合类与复制构造函数

#include <iostream>

struct Person {
    std::string name = "Unknown";  // 默认成员初始化器
    int age = 0;                   // 默认成员初始化器
};

void printPerson(const Person& p) {
    std::cout << "Name: " << p.name << ", Age: " << p.age << std::endl;
}

int main() {
    Person p1; // 声明一个Person对象p1
    printPerson(p1);  // 输出默认值

    Person p2 = p1;  // 使用复制构造函数创建一个新的Person对象p2
    p2.name = "John";
    p2.age = 25;
    printPerson(p2);  // 输出更新后的值

    return 0;
}

在这里插入图片描述

在这个示例中,我们定义了一个Person聚合类,它包含了姓名和年龄两个成员变量,并使用默认成员初始化器为它们提供了默认值。我们创建了一个printPerson函数来打印Person对象的信息。首先,我们声明了一个Person对象p1,并将其传递给printPerson函数,打印了默认的姓名和年龄。然后,我们使用p1的值创建了一个新的Person对象p2,通过赋值操作将p1的值复制给p2。我们更新了p2的姓名和年龄,并再次调用printPerson函数,打印了更新后的姓名和年龄。


总结

本教程介绍了带默认成员初始化器的聚合类的概念和用法。带默认成员初始化器的聚合类允许我们为成员变量提供默认值,从而简化了对象初始化的过程。通过使用默认成员初始化器,我们可以在声明聚合类对象时自动初始化成员变量的默认值,而无需编写显式的构造函数或成员初始化列表。这提供了一种简洁、直观的方式来初始化聚合类对象,使代码更加清晰易读。

需要注意的是,默认成员初始化器只适用于聚合类型的成员变量。对于非聚合类型的成员变量,仍然需要通过构造函数或成员初始化列表进行初始化。

带默认成员初始化器的聚合类是C++11及以后版本中引入的特性,它为我们提供了更灵活的对象初始化方式,同时也提高了代码的可读性和效率。在实际的程序开发中,我们可以根据需要灵活地使用带默认成员初始化器的聚合类来简化对象的创建和初始化过程。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。