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

相关推荐
IT猿手2 小时前
2025最新群智能优化算法:山羊优化算法(Goat Optimization Algorithm, GOA)求解23个经典函数测试集,MATLAB
人工智能·python·算法·数学建模·matlab·智能优化算法
Dream it possible!5 小时前
LeetCode 热题 100_字符串解码(71_394_中等_C++)(栈)
c++·算法·leetcode
My Li.6 小时前
c++的介绍
开发语言·c++
修己xj6 小时前
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
算法
开心比对错重要6 小时前
leetcode69.x 的平方根
数据结构·算法·leetcode
美狐美颜sdk7 小时前
什么是美颜SDK?从几何变换到深度学习驱动的美颜算法详解
人工智能·深度学习·算法·美颜sdk·第三方美颜sdk·视频美颜sdk·美颜api
m0_461502697 小时前
【贪心算法1】
算法·贪心算法
Doopny@7 小时前
数字组合(信息学奥赛一本通-1291)
数据结构·算法·动态规划
邪恶的贝利亚8 小时前
C++之序列容器(vector,list,dueqe)
开发语言·c++
原来是猿8 小时前
蓝桥备赛(13)- 链表和 list(上)
开发语言·数据结构·c++·算法·链表·list