文章

关键字 Using

关键字 Using

[TOC]

using关键字在现代C++中非常有用,特别是在涉及模板编程和泛型编程时,它可以与别名模板结合来使代码更加清晰和容易维护。由于using让代码更加符合直觉,其在类型定义和命名空间管理方面比传统的typedef和单独的命名空间声明更受欢迎。1

1、声明命名空间

“using” 关键字最为人熟知的用途之一就是简化命名空间2的使用。

using声明可以将命名空间中的特定成员引入当前作用域,或者声明整个命名空间,使其下的所有成员都可以直接使用而不需要命名空间前缀。

1
2
3
4
// 这样可以直接使用cout而不是std::cout:
using std::cout; 
// 使std命名空间中的所有名字都可用:(并不推荐这么用,因为可能导致命名冲突)
using namespace std;

2、类型别名

“using”关键字还可以用于定义类型别名,让我们的代码更易读,更具可维护性。

(1) 复杂类型

当我们需要给某个复杂或冗长的类型名称定义一个更简短、易于理解的别名时,就可以使用using来定义这个别名,此时与typedef的用法其实是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
// 使用typedef定义std::vector<int>的别名:
typedef std::vector<int> vecInt;
// 使用using定义一个别名:
using vecInt = std::vector<int>;

// 使用using定义一个储存Base指针的智能指针的别名:
using ptrBase = std::unique_ptr<Base>;
// 使用该类型:
ptrBase myPtr = std::make_unique<Base>();

// 一个很长的类型名:
using fspath = std::filesystem::path;

(2) 函数指针

定义一个函数指针:

1
2
3
4
// 使用typedef定义一个函数指针:
typedef std::unique_ptr<Base> (*MyFunc)();
// 使用using定义一个函数指针:
using MyFunc = std::unique_ptr<Base>(*)();

上面分别通过typedefusing定义了一个类型别名FactoryFunction,它是一个指向函数的指针,这个函数没有参数,并返回std::unique_ptr<Base>类型的对象。

现在,FactoryFunction可以用来声明任何符合上述签名的函数指针。例如:1

std::unique_ptr<Base> CreateBaseInstance() {
    return std::make_unique<Derived>(); // 假设Derived是Base的一个派生类
}
MyFunc testFunc = CreateBaseInstance;

(3) 模板别名

在模板编程中,using关键字能够为模板定义一个新的别名,使得模板的实例化更加简洁。

1
2
3
4
5
template<typename T>
using Vec = std::vector<T>;

// 使用
Vec<int> intVector;

3. 修改基类函数的访问权限

在类继承中,using声明可以用来在派生类中改变基类成员的访问权限

1
2
3
4
5
6
7
8
9
class Base {
protected:
    void function() {}
};

class Derived : public Base {
public:
    using Base::function; // function在Derived中现在是public的
};

4. 继承基类的构造函数

派生类可以用using声明来直接继承基类的构造函数,而不需要自己重新定义:

1
2
3
4
class Derived : public Base {
public:
    using Base::Base; // 继承Base的所有构造函数
};

参考文章345

  1. C++-关键字:using ↩︎ ↩︎2

  2. 在C++中,命名空间是一种组织和隔离代码的方式。 ↩︎

  3. 来源:ChatGPT-4 ↩︎

  4. 一文弄懂using关键字的使用方法 ↩︎

  5. C++中的using关键字 ↩︎

本文由作者按照 CC BY 4.0 进行授权