在 C++ 中 using 与 typedef
本文试图区分 typedef 和 using。 在 C++ 函数式编程中,这些关键字具有相同的目的和语义,它们之间的差异非常小。
本文将解释不同上下文中的关键字,以确保读者理解这些关键字的作用以及 typedef 和 using 之间的区别。
C++ 中的 using 关键字
了解 using 关键字与 typedef 的对比对于了解 typedef 和 using 之间的差异非常重要。
它用于将对象带到程序的当前范围。 这意味着它可以用作从 C++ 引入说明符的访问工具。
让我们看一个例子。
#include <iostream>
int main() {
using std::cout;
using std::string;
int a = 56;
cout << a;
return 0;
}
输出:
56
在这里,关键字 using 用于从命名空间访问 cout 和 string 等说明符,并将它们带入程序的范围内。
类似地,using 也可以用于访问其他说明符,或者通过 using - using namespace as std
来引入整个命名空间。 这将整个命名空间置于程序的作用域内,并且每个说明符都可以使用 std 进行访问。
using 关键字的示例
下面的代码片段创建了一个 Parent 类,其公共方法 add 有两个整数变量 a 和 b 作为参数。 add 方法打印两个变量的总和。
子类以保护模式派生父类,这意味着父类的所有成员都将作为受保护成员继承。
在 main 函数内部,使用 Child 类创建对象的实例,并使用该对象派生方法 add。
#include <iostream>
using namespace std;
class Parent {
public:
void add(int a,int b) {
cout << "Result = " << a+b << endl;
}
};
class Child : protected Parent {
public:
using Parent::add;
};
int main() {
Child obj;
obj.add(15,30);
return 0;
}
输出:
Result = 45
这里,关键字using用于通过子类访问父类的add方法。
在 C++ 中使用 using 关键字实现循环
这里的语法通过using来实现for循环。
for (using i = int; i{} != 0;) {
i++;
}
在基于范围的循环的情况下,使用如下:
std::vector<int> v{1, 2, 3};
for (using Foo = int; Foo f : v) {
(void)f;
}
在 C++ 中使用 using 关键字 switch Case 语句
在 switch case 语句中,using 的实现如下:
if (using Foo = int; true) {
(void)Foo{};
}
switch (using Foo = int; 0) {
case 0: (void)Foo{};
}
C++ 中的 typedef 关键字
关键字 typedef
具有使用自定义名称命名类型的功能。 这意味着可以为现有数据类型引入别名。
在本节中可以观察到 typedef
和 using 之间的主要区别。
下面的程序清楚地解释了这个概念。
#include <stdio.h>
#include <string.h>
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
引入了一个结构体类Book,它有四个变量。 使用 typedef 将这四个变量构造为新的数据类型,并且该类型的名称为 Book。
在主类内部,必须创建一个新对象来访问 Book 类型并获取其变量(根据要求)。
可以看出,各个变量是使用语法 object_name.variable_name,"input" 来调用的。 一旦给这些变量提供了数据,就会使用与调用它相同的方法来打印它。
int main( ) {
Book book;
strcpy( book.title, "Typedef vs using");
strcpy( book.author, "JS");
strcpy( book.subject, "C Programming");
book.book_id = 6495407;
printf( "Book title : %s\n", book.title);
printf( "Book author : %s\n", book.author);
printf( "Book subject : %s\n", book.subject);
printf( "Book book_id : %d\n", book.book_id);
return 0;
}
输出:
Book title : Typedef vs using
Book author : JS
Book subject : C Programming
Book book_id : 6495407
在 C++ 中使用 typedef 关键字进行循环
在循环迭代期间,使用 (typedef (datatype)Function; Function{} != 0;) 语法定义 typedef。
for (typedef int i; i{} != 0;) {
i++;
}
在基于范围的循环迭代期间,typedef
用作:
std::vector<int> v{1, 2, 3};
for (typedef int Foo; Foo f : v)
// ^^^^^^^^^^^^^^^ init-statement
{
(void)f;
}
二维矩阵内基于范围的循环的另一个示例:
for (typedef struct { int x; int y;} P; auto [x, y] : {P{1, 1}, {1, 2}, {3, 5}})
{
(void)x;
(void)y;
}
在 C++ 中使用 typedef 关键字 Switch Case 语句
typedef
关键字用于 switch case 语句中,如下所示。
if (typedef int Foo; true)
{
(void)Foo{};
}
switch (typedef int Foo; 0)
{
case 0: (void)Foo{};
}
typedef 的使用以及在定义模板中的使用
我们从函数式编程的上下文中观察到了 typedef 和 using 之间的差异。 需要理解的另一个重要部分是如何定义模板。
在C++中,typedef具有为模板定义别名的功能。 它已经使用了很长时间,但据观察,typedef 的语义与模板不太匹配。
为了解决这个问题,typedef 已被弃用,并已开始使用。
在下面的示例中,在定义模板的上下文中讨论了 typedef 和 using 之间的差异。
C++ 中使用 typedef 的别名模板
示例1:
这里,矩形被定义为具有 x 长度和静态宽度,需要使用模板为其指定别名。
<size_t N>
是存储矩形长度的模板。 相反,Dimension 是一个使用 typedef 为其指定别名 Rectangle 的对象。
这里,代码将 Rectangle 指定为 Dimension<N,1>
的别名,这意味着 Dimension 对象将具有长度和宽度。 这里,对象 Dimension 的长度 <size_t N>
和宽度为 1。
template <size_t N>
struct Rectangle
{
typedef Dimension<N, 1> type;
};
这意味着程序员需要将单个值参数 size_t N 传递给 Rectangle。 编译器会将传递的数据作为长度,而宽度设置为 1。
语法 Rectangle<5>::int
将整数值 5 传递给对象 Dimension,它与编写 Dimension<5,1>
相同。
由于 typedef 已被弃用,上述示例在最近的 C++ 版本中不再使用。 使用 using 为模板指定别名比上面的示例更简单。
示例2:
模板类 Match 在下面的代码片段中定义。 这个 Match 类被赋予一个别名模板 MatchBox。
Match 类将来也可以被替换。
template <typename U> struct Match {};
template <typename U> struct MatchBox
{
typedef Match<U> type;
};
MatchBox<int>::type variable;
template <typename V> struct bar { typename MatchBox<V>::type_var_member; }
如果需要类型抽象,但还需要保留模板参数以便将来提供,那么就应该编写这种代码。
在 C++ 中使用关键字给模板起别名
示例1:
本节介绍了 typedef 和在模板上下文中使用之间的区别。 这里,模板 <size_t N>
与typedef示例1中使用的相同,它存储矩形的长度。
不使用 struct,而是通过关键字 using 将别名 Rectangle 分配给对象 Dimension。 这与分配操作员的方式相同。
分配别名后的别名矩形的长度和宽度分别为 N 和 1。
template <size_t N>
using Rectangle = Dimension<N, 1>;
可以看出,using 提供了更精致的别名版本,更容易编写和实现。 这里使用的语法的可读性似乎有所提高,因为它现在更像是变量和运算符的常规赋值。
示例2:
此示例使模板参数保持打开状态,以便仍然可以指定它。 在 typedef 示例中,此过程需要多行代码。 但是 using 语法减少了代码和复杂性。
template <typename U> using MatchBox = Match<U
MatchBox<int> variable;
template <typename V> struct bar { MatchBox<V> _var_member; }
使用 using
关键字为模板定义别名比 typedef
容易得多,因为该过程类似于变量的复制赋值。
总结
本文介绍了 C++ 中关键字 typedef
和 using
之间的区别。 读者将了解这些关键字的基本差异以及在不同编程环境中的实现。
希望本文对您的学习之旅有所帮助。
相关文章
C++ 中函数指针的 Typedef
发布时间:2023/08/20 浏览次数:54 分类:C++
-
本文将解释 C/C++ 中 typedef 的用途。 我们将进一步讨论如何将 typedef 与函数指针一起使用以及使用它的好处是什么。我们首先讨论 typedef 及其常见用途。typedef 关键字
使用 C++ 检测 Windows 中的按键
发布时间:2023/08/19 浏览次数:127 分类:C++
-
本文将讨论如何使用 C++ 处理 Windows 应用程序中的按键。 在进一步讨论之前,我们将简要介绍一下使用 C++ 的 Windows 应用程序。使用 C++ 的 Windows 应用程序类型
使用 C++ 在 While 循环中输入字符
发布时间:2023/08/19 浏览次数:62 分类:C++
-
这个简单的文章将讨论在 C++ 中处理输入。 此外,我们将研究处理用户无效输入的问题。 最后,我们将讨论如何使用 while 循环从用户处获取输入。
C++ 中的 STL 容器中的 value_type
发布时间:2023/08/19 浏览次数:115 分类:C++
-
STL 是标准模板库的缩写。 它是一组数据结构和算法,用于实现 C++ 编程语言的通用容器和函数。在 C++ 中,容器将数据存储在特定类型的对象中。 有两种容器:序列容器(按顺序保存对象)和
C++ 中的常量参数
发布时间:2023/08/19 浏览次数:96 分类:C++
-
const 关键字在 C++ 中用于将变量定义为常量。 该关键字可以应用于任何数据类型,但最常应用于指针和引用。常量参数是可以由同一范围内的任何函数设置和使用的值。 该参数应在使用该参数
在 C++ 中创建表
发布时间:2023/08/19 浏览次数:68 分类:C++
-
在C++中,可以使用 iomanip 库以表格的形式显示数据。 我们还将了解 iomanip 库有助于打印表中数据的各种方法。在本文中,我们将讨论如何在 C++ 中以表格的形式打印数据。
C++ 中的 POD 类型
发布时间:2023/08/19 浏览次数:188 分类:C++
-
C++ 中的 POD 代表普通旧数据。 它是一个用关键字 struct 或 class 定义的类,只有 int、char、double、bool、signed/unsigned、long/short、float 等数据成员。C++ 中的 POD 类型
在 C++ 中查找对象类型
发布时间:2023/08/19 浏览次数:192 分类:C++
-
本文讨论在 C++ 中查找对象类型的不同方法。在 C++ 中查找类对象的类型 与简单变量的数据类型(如 int、bool 等)类似,类对象也有一个类型,即它们所属的类:
在 C++ 中定义和使用负无穷大
发布时间:2023/08/19 浏览次数:83 分类:C++
-
本文讨论了在 C++ 中表示负无穷大的问题并列出了一些可能的解决方案。C++ 使用 IEEE-754 标准来表示浮点数。 浮点数据类型共有三种:float、double 和 long double。