我不明白以下构造函数(src \ corelib \ tools \ qstringbuilder.h中的Qt库的一部分),它是什么意思以及它是如何工作的?
class QLatin1Literal
{
public:
int size() const { return m_size; }
const char *data() const { return m_data; }
template <int N>
QLatin1Literal(const char (&str)[N])
: m_size(N - 1), m_data(str) {}
private:
const int m_size;
const char * const m_data;
};
答案 0 :(得分:11)
构造函数将字符串文字作为参数。你看到的只是为此声明模板的语法。
使用这样的构造函数,m_size可以在O(1)中找到,与O(strlen(str)相反),否则需要使用char const*
作为参数的非模板构造函数。
要记住的是,对于每个字符串长度,将有一个由编译器生成的模板实例,因此您最终可能会在库/二进制文件/目标文件中对此模板进行相当多的实例化。
答案 1 :(得分:8)
构造函数参数是对N
个字符数组的引用。它初始化m_data
指向第一个字符,m_size
初始化为小于数组的大小。
字符串文字,如"hello"
,是一个字符数组,包含字符串中的字符,后跟零值终结符。因此,如果使用其中一个调用构造函数:
QLatin1Literal lit("hello");
assert(lit.size() == strlen("hello")); // SUCCESS: m_size is inferred as 5
它会为N
推断出值为6(因为数组包含“hello”的五个字符加上终结符),并将m_size
初始化为5(实际的字符串长度)。
请注意,如果数组实际上不是字符串文字,则可能会出错;例如:
char buffer[1000] = "hello"; // array size is larger than string+terminator
QLatin1Literal lit(buffer);
assert(lit.size() == strlen("hello")); // FAIL: m_size is inferred as 999
答案 2 :(得分:3)
这意味着str
是对N
个常量字符数组的引用。它只是意味着构造函数将一个字符数组作为参数,例如字符串文字。