有人能帮我破译这些打字行的语法吗

Can somebody help me decipher the syntax in these typedef-ing lines?

本文关键字:语法      更新时间:2023-10-16

我的c++已经很生疏了。这是使用数组存储数据项的bag类的头文件中的类声明的开头。它的功能应该是,你猜对了,一个袋子。我接到了第一条电话,但之后我不太明白发生了什么。这似乎很常见,所以我认为这里有足够的信息来寻求帮助。

class bag
{
public:
// TYPEDEFS and MEMBER CONSTANTS
typedef int value_type;
typedef std::size_t size_type;
static const size_type DEFAULT_CAPACITY = 30;  
typedef int value_type;

这一行定义了类型包包含另一个名为"value_type"的类型,该类型与内部相同

typedef std::size_t size_type;

此行定义类型bag包含另一个名为"size_type"的类型,该类型与std::size_t相同。

static const size_type DEFAULT_CAPACITY = 30; 

这一行定义了一个类型为"size_type"的常量(查看上面的行以检查它是什么),称为DEFAULT_CAPACITY,值为30。

这是基本的C++,我真的不知道如何比拼写语法更好地解释它。

我发现typedefs的诀窍是首先忽略typedef关键字并查看其他位;所以

int value_type;

将声明一个称为CCD_ 3类型的CCD_。添加typedef关键字,它完全相同,但不是声明一个新的变量,而是声明一个int的新类型

我发现这在更复杂的情况下很有帮助,比如

typedef int (*Func)(float, double);

移除typedef,您将声明一个名为*Func的函数,该函数接受两个参数并返回一个int。将关键字添加回,您将使用该签名声明一个类型的函数。

编辑:

从对其他答案的评论来看,给你带来麻烦的似乎不是typedef本身,而是std::size_t

std::size_t本身就是标准库类型的名称,特别是内置sizeof运算符返回的数字的类型。它总是一个无符号整数,但确切的类型取决于编译器和您使用的系统(甚至特定的编译器选项)。

你怎么知道std::size_t是一个类型名,而不是一个变量名?简单的答案是,你通常不能,你只需要根据名称和上下文来判断(事实上,有时甚至编译器都不知道名称是指类型还是指变量,所以你必须告诉它)。在这种情况下,它以_t结尾的事实是一个很好的线索,表明它是一个类型(加上它在typedef中使用的事实!)。

std部分引用了std命名空间。名称空间是一种C++工具(也存在于其他语言中,尽管不是C语言),用于避免名称冲突。您可以声明自己的,而std是为标准库保留的特殊项。

A::B被称为范围解析运算符,它告诉编译器"在A内部查找名为B的东西",其中A可以是类或名称空间。

value_type0的基本语法是:

"typedef" <name of type> <name of alias for type>

别名的名称是单个标识符。typedef关键字和最后一个标识符之间的所有内容都需要是为其创建别名的类型的名称。当然,对于指针和引用之类的东西,尤其是pointer to a function returning int and taking a string and a long as parameters的别名,别名将被隐藏在声明中间的某个位置,就像当/如果您声明该类型的变量时一样(事实上,从语法上讲,typedef最初是作为一个"存储类"添加到C中的,就像autoregister一样,所以它在声明中占据的位置与它们中的一个完全相同)。

因此,在typedef int value_type中,它将创建value_type作为int的别名。

然而,请注意,在这种情况下,value_type嵌套在int0内部,因此名称的完整名称为bag::value_type。如果使用其他容器,则每个容器可能都有一个value_type。例如:

std::vector<unsigned> x;

在这种情况下,value_type也将是unsigned。使用像std::map这样的关联容器,value_type变得更加有趣。例如,给定一个类似的地图

std::map<std::string, int> foo;

则CCD_ 37将是CCD_。

value_type这样的嵌套标识符在模板代码中使用得特别多,模板代码可能会使用不同类型的容器(或这些容器内容的迭代器),因此在编写代码时,特定容器的value_type是未知的。例如,如果要将容器中的所有项相加,则可以使用容器的value_type作为结果的类型,因此,当将vector<int>相加时,结果将是int,但如果将list<string>相加,结果将为string