c++ - 在 C++ 中什么时候使用 *、& 或 const 是正确的时机?

标签 c++ pointers reference

我在研究指针引用时遇到了输入参数的不同方法。谁能解释一下每一个的实际含义?

我认为第一个很简单,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/

相关文章:

c++ - 在 C++ 中使用 const 引用参数访问函数成员的最佳实践

c++ - 在 C++ 中,多个线程对数组的各个单元格的修改是安全的(boost)

c++ - 使用常量变量声明对象数组

pointers - clojure中的指针循环

c - 在结构中分配内存时类型不兼容

c++:我可以禁止引用 MyClass 的对象吗?

C# 按引用传递(ref 关键字)问题

c++ - winsock2重新定义合并问题

c++ - 将 Windows Dll 转换为 C++ Visual Studio 2008 的 .lib

C++ 使用指针进行选择排序函数