我在研究指针引用时遇到了输入参数的不同方法。谁能解释一下每一个的实际含义?
我认为第一个很简单,x
是传入参数的拷贝,因此在堆栈上创建了另一个变量。
至于其他的我一无所知。
void doSomething1(int x){
//code
}
void doSomething2(int *x){
//code
}
void doSomething3(int &x){
//code
}
void doSomething3(int const &x){
//code
}
我在声明变量时也看到了类似的东西。我不明白他们之间的区别。我知道第一个会将 100
放入堆栈上的变量 y
中。它不会创建新地址或任何东西。
//example 1
int y = 100;
//example 2
int *y = 100;
//Example 3: epic confusion!
int *y = &z;
问题一:如何使用这些方法?什么时候最合适?
问题2:什么时候用那种方式声明变量?
例子会很棒。
附言这是我没有学习 C++ 的主要原因之一,因为 Java 只有垃圾收集功能。但现在我必须进入 C++。
最佳答案
//example 1 int y = 100; //example 2 int *y = 100; //Example 3: epic confusion! int *y = &z;
我认为大多数学生的问题是在C++中&
和 *
具有不同的含义,具体取决于使用它们的上下文。
如果它们中的任何一个出现在对象声明中的类型之后(T*
或 T&
),它们就是类型修饰符 并将类型从普通 T
更改为对 T
的引用 ( T&
) 或 指向 T
的指针( T*
)。
如果它们出现在对象前面(&obj
或 *obj
),则它们是一元前缀运算符 在对象上调用。前缀 &
返回调用对象的地址,*
取消引用指针、迭代器等,产生它引用的值。
类型修饰符应用于被声明的对象,而不是类型,这无助于避免混淆。即 T* a, b;
定义一个 T*
名为 a
和一个普通的 T
名为 b
,这就是为什么很多人喜欢写 T *a, b;
相反(注意类型修饰 *
与被定义的对象相邻的位置,而不是修改的类型)。
同样无益的是术语“引用”重载。一方面,它意味着句法结构,如 T&
.但“引用”也有更广泛的含义,指的是其他东西。从这个意义上说,两者都是一个指针 T*
和引用(其他含义 T&
)是引用,因为它们引用了某个对象。当有人说“指针引用某个对象”或指针被“取消引用”时,它就会发挥作用。
所以在你的具体情况下,#1 定义了一个普通的 int
, #2 定义了一个指向 int
的指针并用地址 100
初始化它(无论住在哪里,最好不要动),#3 定义了另一个指针并用对象的地址初始化它 z
(也必须是 int
)。
有关如何在 C++ 中将对象传递给函数的说明, here 是我对此的旧回答。
关于c++ - 在 C++ 中什么时候使用 *、& 或 const 是正确的时机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3923573/