代码之家  ›  专栏  ›  技术社区  ›  Pavan

何时使用C++中的*、、或const为正确的时间?

  •  11
  • Pavan  · 技术社区  · 15 年前

    我在研究指针引用,发现了输入参数的不同方法。有人能解释一下每个词的真正含义吗?

    我觉得第一个很简单,就是 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;
    

    问题1:如何使用这些方法?什么时候最合适?

    问题2:我什么时候用这种方式声明变量?

    举个例子就好了。

    这是我没有学习C++的主要原因,因为java只是垃圾收集。但是现在我必须进入C++。

    7 回复  |  直到 11 年前
        1
  •  10
  •   Community Mohan Dere    9 年前
    //example 1
    int y = 100;
    
    //example 2
    int *y = 100;
    
    //Example 3: epic confusion!
    int *y = &z;
    

    我认为大多数学生的问题是C++中的两个问题。 & 和 * 有不同的含义,这取决于使用它们的上下文。
    在对象声明中的类型之后 ( T* 或 T& ),它们是 类型修饰符 并将类型从普通更改为 T 到 提及 T型 ( T& )或者 指向 T型 ( ) .
    如果他们出现 在一个物体前面 ( &obj 或 *obj ),它们是 一元前缀运算符 在对象上调用。前缀 & 返回 对象的地址 它被调用, * 取消引用 一种指针、迭代器等,产生它所引用的值。

    类型修饰符应用于被声明的对象,而不是类型,这无助于避免混淆。也就是说, T* a, b; 定义 T型* 命名的 a 一片平原 T型 命名的 b ,这就是为什么很多人喜欢写作 T *a, b; 相反(注意修改类型的位置 * 与正在定义的对象相邻,而不是与已修改的类型相邻)。

    同样无用的是“引用”这个词被重载了。首先,它意味着一个句法结构,如 T& . 但也有更广泛的含义,“参考”是指其他的东西。从这个意义上说,两者都是一个指针 T型* 以及一个参考(其他含义 T& )是引用,因为它们引用了某个对象。当有人说“一个指针引用了某个对象”或者一个指针被“取消引用”时,这种情况就会发生。

    所以在你的具体案例中,#1定义了一个 int ,#2定义指向 内景 并用地址初始化它 100 (不管存在什么,最好不要碰它)和#3定义另一个指针并用对象的地址初始化它 z (必须是 内景 也一样)。


    如何将对象传递给C++中的函数, here 是我的老回答。

        2
  •  4
  •   DumbCoder    15 年前

    从Scott Myers -更有效的C++ +GT;1

    首先,认识到不存在空引用。引用必须总是引用某些反对。因为引用必须引用对象,C++要求引用被初始化。

    指针不受此类限制。没有空引用这一事实意味着使用引用比使用指针更有效。这是因为在使用之前不需要测试引用的有效性。

    指针和引用之间的另一个重要区别是指针可以被重新分配以引用不同的对象。然而,引用总是引用初始化它的对象

    一般来说,当需要考虑到没有可引用的内容(在这种情况下,可以将指针设置为空)的可能性时,或者当需要在不同时间引用不同的内容(在这种情况下,可以更改指针指向的位置)时,应该使用指针。当你知道总会有一个对象要引用时,你应该使用一个引用,而且你也知道一旦你引用了那个对象,你就永远不想引用其他任何东西了。

    因此,当您知道有要引用的内容时,当您永远不想引用任何其他内容时,当您实现的运算符的语法要求使指针的使用变得不受欢迎时,引用是您选择的特性。在所有其他情况下,坚持使用指针。

        3
  •  2
  •   Armen Tsirunyan    15 年前

    阅读S.Lippmann的C++总理或其他优秀的C++书籍。 至于传递参数,通常当复制成本较低时,我们会传递值。对于强制输出参数,我们使用引用,对于可选输出参数指针,对于复制成本高昂的输入参数,我们传递常量引用

        4
  •  1
  •   Adesit    15 年前

    这真是个复杂的话题。请在这里阅读: http://www.goingware.com/tips/parameters/ . 此外,Scott Meiers“有效C++”是一本关于此类事情的顶级书籍。

        5
  •  1
  •   Ahmad Farid    15 年前

    空隙剂量1(int x){ //代码 } 这个函数按值传递变量,不管函数内部发生什么,原始变量都不会改变

    空隙剂量2(int*x){ //代码 } 在这里,您将一个指针类型的变量传递给integer。所以在访问数字时,应该使用x作为值,或者使用x作为地址

    空隙剂量3(内部和x){ //代码 } 这里和第一个一样,但是不管函数内部发生什么,原始变量也会改变

    积分y=100; 标准整数

    //例2 int*y=100; 指向地址100的指针

    //例3:史诗般的混乱! int*y=&z; 指向z地址的指针

        6
  •  1
  •   Steven Keith    15 年前
    void doSomething1(int x){
    //code
    }
    void doSomething2(int *x){
    //code
    }
    
    void doSomething3(int &x){
    //code
    }
    

    我真的被他们搞糊涂了?

    第一种是使用按值传递,函数的参数在调用后将保留其原始值。

    后面两个使用按引用传递。本质上,它们是实现同一目标的两种方法。不保证参数在调用后保留其原始值。

    大多数程序员喜欢通过常量引用传递大型对象,以提高代码的性能,并提供一个值不会更改的约束。这确保不会调用复制构造函数。

    您的困惑可能是因为“&运算符有两种含义。你似乎熟悉的那个是“参考运算符”。它还用作“地址运算符”。在您给出的示例中,您采用的是z的地址。

    一本很好的书,详细地介绍了这一切,是Andrew Koening的“加速C++”。

        7
  •  0
  •   SubSevn    15 年前

    使用这些方法的最佳时机是当传递引用比传递整个对象更有效时。有时,某些数据结构操作使用引用(例如插入到链接列表中)也更快。理解指针的最好方法是阅读它们,然后编写程序来使用它们(并将它们与传递值对应的指针进行比较)。

    而且,记录在案的是,指针的知识会让你在工作中更有价值。(经常,C++程序员是办公室的“神秘主义者”,知道桌子下面那些神奇的盒子是如何处理代码的/半讽刺的)