我对C ++比较陌生,我首先阅读C++ Primer 4th edition。它有一节介绍了Pointers和Typedef,从下面的代码开始。
typedef string *pstring;
const pstring cstr;
我知道在定义 typedef string *pstring;
之后我可以使用*pstring
在我的代码中声明字符串变量。
*pstring value1; // both of these line are identical,
string value2; // value 1 and value2 are string
本书继续const pstring cstr1;
,*const string cstr2;
完全相同。我不明白为什么他们的声明相同?
答案 0 :(得分:4)
它们不完全相同。
pstring v1; // declares a pointer to string
string v2; // declares an object of type string
string* v3; // this is the same type as v1
答案 1 :(得分:2)
我真的希望你引用的那本书并不像你的报价所显示的那样不准确。我确信你没有准确地引用它。请返回并将书中的内容(我没有副本)与您撰写的内容进行比较。
假设:
typedef string *pstring;
你写的那个
const pstring cstr1;
和
*const string cstr2;
是完全相同的。事实上,两者都是无效的。
如果您声明某些内容const
,则需要为其提供初始值。 *const string cstr2;
的语法错误。
所以这是一个正确的方法:
typedef string *pstring;
const pstring cstr1 = 0; // initialize to 0, a null pointer
string *const cstr2 = 0; // the same
cstr1
和cstr2
都是指向字符串的const(即只读)指针。
请注意,const
关键字必须在 *
之后,因为我们需要一个指向字符串的const指针,而不是指向const字符串的指针。
但无论如何,为指针类型声明一个typedef通常是个坏主意。类型是指针类型的事实几乎影响了你用它做的所有事情;为它制作一个typedef隐藏了这个事实。
答案 2 :(得分:1)
你正在学习typedef是很棒的,但是当你在你的应用程序中看到数以万亿行的代码时,你个人看到了它们....然后.... typedef失去光彩。然后他们只是为了阻止真正的代码。我发誓一些开发人员,我维护的代码喝了typedef cool aid并将它们用于所有东西!
我看到的唯一好处是使用它们来缩短非常长的类型名称。例如与STL一起使用的长类型。