(C ++指针)var声明之间的区别

时间:2012-03-02 10:12:50

标签: objective-c pointers

变量声明之间有什么区别:

//version 1
MyClass* myVar = [[MyClass alloc] init];
//version 2
MyClass * myVar = [[MyClass alloc] init];
//version 3
MyClass *myVar = [[MyClass alloc] init];

每个版本的对象myVar会发生什么变化?

3 个答案:

答案 0 :(得分:2)

任何声明MyClass* myVarMyClass * myVarMyClass *myVar之间没有区别:它是程序员偏好。

许多程序员更喜欢MyClass *myVar,因为它可以防止出现以下简单错误(如果程序员想要声明两个指向MyClass的指针):

MyClass* myVar, myVar2;

其中myVar2不是MyClass*,而是MyClass

答案 1 :(得分:2)

纯粹的风格,没有区别。在C语言中,开发人员倾向于选择后一种风格,这可能是因为它使得多个指针的声明变得更加清晰:

int *ptr1, *ptr2;
...

当C出现像Kernighan和Ritchie的C编程语言时,这也是原始作者的风格。顺便说一句,Dennis Ritchie创造了C.

然而,许多现代C ++开发人员,包括Stroustrup本人(C ++的创建者),倾向于赞成第一个约定:

int* ptr = ...;

这种偏好的基本原理可能归结为以下几点:

  1. 在C ++中,我们有模板要求我们自己指定类型。关于将vector<int*>强调为单一类型而不是int*或其他变体,vector<int *>似乎更为直接。

  2. 当遵循旨在促进安全设计的C ++编码标准时,我们发现自己并不想一次定义多个变量,因为我们通常希望在它们被有意义地初始化时定义它们(避免通过限制范围并立即初始化它们的潜在错误)。 *

    • 这与C完全不同,其中每个变量都需要在范围的顶部声明,这导致许多C开发人员经常习惯一次声明多个。

答案 2 :(得分:1)

您的三个建议之间没有语义差异。

本质上,当解析代码文件时,预处理器会将所有内容拆分为标记,并且编译过程的所有后续过程都只对这些标记起作用。因此,间距 令牌之间完全被忽略了。

简单指针声明的语法(声明单个元素且没有初始化)由三个标记组成:类型说明符,星号(表示变量是指针),最后是标识符。因此,在这三者之间可以有任意数量的空格,而根本不会改变语义。

人们选择单向另一种方式的原因与风格及其对意图的表达有关。

MyClass* myVar表明myVar的类型为MyClassMyClass *myVar清楚地表明指针令牌属于myVar变量。

因此,如果您决定在单个语句中声明变量列表,则特别推荐第二种替代方法。例如MyClass myVar, *myPointerToVar

另一个好的选择是始终使用MyClass* myVar变体,并且永远不要声明列出几个变量,其中一些是指针。