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

相关推荐
Aurorar0rua16 分钟前
C Primer Plus Notes 09
java·c语言·算法
史迪奇_xxx2 小时前
10、一个简易 vector:C++ 模板与 STL
java·开发语言·c++
我不是QI3 小时前
DES 加密算法:核心组件、加解密流程与安全特性
经验分享·算法·安全·网络安全·密码学
前端小刘哥3 小时前
新版视频直播点播EasyDSS平台,让跨团队沟通高效又顺畅
算法
我是华为OD~HR~栗栗呀4 小时前
华为od-21届考研-C++面经
java·c语言·c++·python·华为od·华为·面试
oioihoii4 小时前
C++ 中的类型转换:深入理解 static_cast 与 C风格转换的本质区别
java·c语言·c++
明月(Alioo)4 小时前
机器学习入门,无监督学习之K-Means聚类算法完全指南:面向Java开发者的Python实现详解
python·算法·机器学习
叶梅树4 小时前
从零构建A股量化交易工具:基于Qlib的全栈系统指南
前端·后端·算法
小妖6664 小时前
vscode 怎么运行 c++ 文件
开发语言·c++
lingran__4 小时前
算法沉淀第三天(统计二进制中1的个数 两个整数二进制位不同个数)
c++·算法