C++常用特性

在 C++11 中,引入了一些新的特性,使得类的设计更加灵活和优雅。这些特性可以让你写出更简洁、更易读的代码,同时也可以减少潜在的错误。以下是你提到的三个非常实用的特性:

  1. 委托构造函数(Delegating Constructor)
  2. 成员变量初始化(In-class Member Initializer)
  3. 类型别名(Type Alias)

我将逐一讲解这些特性的原理、使用场景,并给出简单易懂的示例。


1. 委托构造函数(Delegating Constructor)

原理:

委托构造函数允许一个构造函数调用另一个构造函数。通过这种方式,你可以将相似的初始化逻辑集中到一个构造函数中,而不是重复写多个构造函数的代码。

在没有 C++11 之前,如果你有多个构造函数,它们可能会有很多重复的代码,而委托构造函数可以避免这种重复。

使用场景:
  • 当你有多个构造函数,并且它们有共同的初始化逻辑时,可以用委托构造函数避免代码重复。
  • 增加代码的可维护性,减少错误。
示例:
cpp 复制代码
#include <iostream>
using namespace std;

class Rectangle {
private:
    int width, height;

public:
    // 委托构造函数1:默认构造函数
    Rectangle() : Rectangle(0, 0) {
        cout << "Default constructor" << endl;
    }

    // 委托构造函数2:接受两个参数的构造函数
    Rectangle(int w, int h) : width(w), height(h) {
        cout << "Parameterized constructor" << endl;
    }

    void print() {
        cout << "Width: " << width << ", Height: " << height << endl;
    }
};

int main() {
    Rectangle r1;  // 调用默认构造函数,委托给参数化构造函数
    r1.print();

    Rectangle r2(5, 10);  // 直接调用参数化构造函数
    r2.print();
}
理解:
  • Rectangle() 是默认构造函数,它委托给了 Rectangle(int w, int h) 构造函数,这样就避免了重复的初始化代码。
  • r1 被创建时,默认构造函数会将默认值(0, 0)传递给参数化构造函数,达到代码复用的目的。

2. 成员变量初始化(In-class Member Initializer)

原理:

C++11 允许你在类定义中直接为成员变量提供初始值。这意味着你可以为成员变量设置默认值,而不需要在构造函数中显式地赋值。

这样,类的初始化变得更加清晰和简单,减少了代码中"遗漏初始化"的风险。

使用场景:
  • 在类中,成员变量有常见的默认值,或者你希望确保即使没有显式初始化,它们也能有一个有效的初始值。
  • 提高代码的简洁性,减少构造函数中的重复初始化。
示例:
cpp 复制代码
#include <iostream>
using namespace std;

class Rectangle {
private:
    int width = 0;  // 在类定义中初始化
    int height = 0; // 在类定义中初始化

public:
    // 构造函数
    Rectangle(int w, int h) : width(w), height(h) {
        cout << "Parameterized constructor" << endl;
    }

    void print() {
        cout << "Width: " << width << ", Height: " << height << endl;
    }
};

int main() {
    Rectangle r1(5, 10);  // 使用构造函数初始化
    r1.print();

    Rectangle r2(3, 4);  // 另一个构造函数初始化
    r2.print();
}
理解:
  • 在类定义中直接为 widthheight 赋值为 0,这意味着即使在构造函数中没有对这两个变量进行显式初始化,它们也会有一个默认值(0)。
  • 这有助于确保成员变量总是被初始化,而不依赖于构造函数中的赋值。

3. 类型别名(Type Alias)

原理:

类型别名是用来给现有类型起一个新名字的功能。通过 typedefusing 关键字,你可以为复杂类型、模板类型等起一个更易理解的别名。C++11 引入的 using 关键字,使得类型别名的定义更加简洁和易读。

使用场景:
  • 当你使用复杂的模板类型时,使用类型别名可以让代码更简洁,提升可读性。
  • 为常用类型创建别名,减少代码的重复,并使得类型名称更加直观。
示例:
cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

// 定义一个类型别名
using IntVector = vector<int>;

int main() {
    // 使用类型别名定义一个变量
    IntVector numbers = {1, 2, 3, 4, 5};

    for (int num : numbers) {
        cout << num << " ";
    }
    cout << endl;
}
理解:
  • 在这里,我们使用 using IntVector = vector<int>;vector<int> 类型创建了一个别名 IntVector
  • 这样,在代码中我们就可以使用 IntVector 来代替 vector<int>,使代码更加简洁和易读。
使用 typedef(与 using 的对比)
cpp 复制代码
typedef vector<int> IntVector;  // 传统的类型别名方式

usingtypedef 都可以定义类型别名,但是 using 的语法更加简洁,且在模板中使用时更强大。


总结:

  1. 委托构造函数(Delegating Constructor):让构造函数之间可以相互调用,避免重复的初始化逻辑。

    • 使用场景:有多个构造函数,且它们的初始化逻辑相似。
  2. 成员变量初始化(In-class Member Initializer):在类定义中直接为成员变量设置默认值,简化代码并确保变量有默认值。

    • 使用场景:想要为成员变量提供默认值,而不依赖于构造函数。
  3. 类型别名(Type Alias) :使用 usingtypedef 为类型创建别名,增加代码的可读性。

    • 使用场景:需要使用复杂类型、模板类型时,或希望简化类型名称以提升代码的可维护性。

这些 C++11 的新特性,能够让你的代码更简洁、易懂,同时减少错误的发生,特别适合新手理解和使用。

相关推荐
思成不止于此1 分钟前
【C++ 数据结构】二叉搜索树:原理、实现与核心操作全解析
开发语言·数据结构·c++·笔记·学习·搜索二叉树·c++40周年
蜉蝣之翼❉7 分钟前
opencv c++ 修改加载图像大小限制
c++·opencv·webpack
爪哇部落算法小助手39 分钟前
每日两题day50
数据结构·c++·算法
curry____3031 小时前
基本算法(2025.11.21)
c++·算法
tan180°2 小时前
Linux网络TCP(上)(11)
linux·网络·c++·后端·tcp/ip
WWZZ20252 小时前
快速上手大模型:深度学习5(实践:过、欠拟合)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
司铭鸿2 小时前
图论中的协同寻径:如何找到最小带权子图实现双源共达?
linux·前端·数据结构·数据库·算法·图论
橘子真甜~3 小时前
C/C++ Linux网络编程6 - poll解决客户端并发连接问题
服务器·c语言·开发语言·网络·c++·poll
铭哥的编程日记3 小时前
【标准项目】C++基于正倒排索引的Boost搜索引擎
c++·搜索引擎
码力码力我爱你3 小时前
C++性能基准测试
开发语言·c++