有人能帮我破译这些打字行的语法吗
Can somebody help me decipher the syntax in these typedef-ing lines?
我的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_type
0的基本语法是:
"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中的,就像auto
或register
一样,所以它在声明中占据的位置与它们中的一个完全相同)。
因此,在typedef int value_type
中,它将创建value_type
作为int
的别名。
然而,请注意,在这种情况下,value_type
嵌套在int
0内部,因此名称的完整名称为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
。
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 使用基类指针调用基类的值构造函数的语法是什么?
- 很好的语法来获取对向量/数组数据的大小引用?
- C++语法运算符功能?
- C++使用 rand 定义函数语法
- 什么文件可以修改 atom 的C++语法?
- 创建模板嵌套类实例的语法?
- C++语法差异:二维和一维数组(指针算术)
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么