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 的新特性,能够让你的代码更简洁、易懂,同时减少错误的发生,特别适合新手理解和使用。

相关推荐
jf加菲猫5 分钟前
条款35:考虑虚函数以外的其它选择(Consider alternatives to virtual functions)
开发语言·c++
小王爱吃月亮糖44 分钟前
OpenCV-基本概念以及开发基础模块介绍
c++·人工智能·qt·opencv·计算机视觉·visual studio
程序员南飞1 小时前
算法-excel表头位置转成对应数字 26进制转10进制
java·javascript·算法
老大白菜1 小时前
python 插入排序(Insertion Sort)
python·算法·排序算法
苍墨穹天2 小时前
大模型算法题(2)
人工智能·算法
打不了嗝 ᥬ᭄2 小时前
位运算与操作符应用
数据结构·算法·leetcode·蓝桥杯
CodeClimb2 小时前
【华为OD-E卷-AI处理器组合100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
风染yeye2 小时前
区块链期末复习3:跨链原子交换&其他加密货币
算法·区块链·密码学·分布式账本
Coovally AI模型快速验证2 小时前
清华发布Hyper-YOLO:超图计算+目标检测!捕捉高阶视觉关联
人工智能·算法·yolo·机器学习·目标跟踪·超图计算
h0l10w2 小时前
LeetCode【剑指offer】系列(数组篇)
c++·算法·leetcode