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

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

前言


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;
}


88b892c4c45c41a3a9a373e390425f81.png

在这个示例中,我们定义了一个简单的聚合类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;
}


9c8f65b1dc55418aa6603be457996c68.png

在这个示例中,我们定义了一个更复杂的聚合类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;
}


953127bb066a4ff786f11ede333cc287.png

在这个示例中,我们定义了一个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;
}


55cf04c0a55f4fc1ba14380bce8ea7de.png

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


总结


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

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

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

相关文章
|
3天前
|
设计模式 安全 算法
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
14 0
|
1天前
|
存储 程序员 编译器
C++11:声明 & 初始化
C++11:声明 & 初始化
6 0
|
2天前
|
编译器 C++
【C++】继续学习 string类 吧
首先不得不说的是由于历史原因,string的接口多达130多个,简直冗杂… 所以学习过程中,我们只需要选取常用的,好用的来进行使用即可(有种垃圾堆里翻美食的感觉)
7 1
|
2天前
|
算法 安全 程序员
【C++】STL学习之旅——初识STL,认识string类
现在我正式开始学习STL,这让我期待好久了,一想到不用手撕链表,手搓堆栈,心里非常爽
9 0
|
2天前
|
存储 安全 测试技术
【C++】string学习 — 手搓string类项目
C++ 的 string 类是 C++ 标准库中提供的一个用于处理字符串的类。它在 C++ 的历史中扮演了重要的角色,为字符串处理提供了更加方便、高效的方法。
7 0
|
3天前
|
Java C++ Python
【C++从练气到飞升】06---重识类和对象(二)
【C++从练气到飞升】06---重识类和对象(二)
|
3天前
|
编译器 C++
【C++从练气到飞升】06---重识类和对象(一)
【C++从练气到飞升】06---重识类和对象(一)
|
3天前
|
存储 编译器 C语言
【C++从练气到飞升】02---初识类与对象
【C++从练气到飞升】02---初识类与对象
|
5天前
|
C语言 C++
【C++】string类(常用接口)
【C++】string类(常用接口)
13 1
|
3天前
|
设计模式 算法 编译器
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]
8 0