【问题标题】:int vs const int&, And when I use it [duplicate]int vs const int&,当我使用它时[重复]
【发布时间】:2019-10-08 20:50:36
【问题描述】:

我正在学习 c++,并试图完全理解如果我接受这样的论点 (const type& var) 与 (type var) 之间的区别。我的理解是,通过“参考”(const type& var) 将花费更少,因为不需要有意义的“复制构造函数”或“销毁构造函数”。但是:

  1. 什么时候我应该使用它,因为在某些情况下(type var) 成本更低。 我什么时候应该使用它,因为在某些情况下(type var) 成本更低。
  2. 为什么我们不用指针来代替?
  3. (初学者问题)我们如何将“值”传递给“引用”?

    class Human{
        private:
        friend void DisplayAge (const Human& Person);
        string name;
        int age;
    
       public:
        Human (string personName, int personAge):
        name(personName), age(personAge) {}
    };
    
    void DisplayAge(const Human& Person)
    {
        cout << Person.age << endl;
    }
    
    int main() {
        Human FirstMan("Adam", 25);
    
        cout << "Accessing private member age via friend function: ";
        DisplayAge(FirstMan);
    
        return 0;
    }
    

【问题讨论】:

  • 这类问题已经回答了:here,或者here。
  • 通常除非您需要进行复制并且类型不是原始类型,否则最好传递引用;引用比指针更安全,更容易使用;将值传递给引用是什么意思?

标签: c++ reference constants


【解决方案1】:

如果您打算在函数完成后继续使用传递给函数的值,则通常应该使用引用。正如您所强调的,有时通过参考的成本更高。如果您的数据非常小(您通常不会费心将整数作为参数传递),或者您有机会 move 变量的内容(尽管这可能是一个更复杂的主题),则可能会发生这种情况。

使用引用可以避免复制数据,同时仍然保证参数有效,因为与指针不同,没有空引用。引用使您有机会允许函数改变变量的内容,或者使用 const 引用可以防止函数修改您传入的变量。通常,当您不需要时,您应该更喜欢使用引用而不是指针只有指针才能使用的功能,并且在不需要突变时更喜欢 const 引用而不是引用。

【讨论】:

  • 另外,了解到在某些情况下,当您不小心将子类传递给基类时,使用引用参数可以保护对象不被“切片”。
【解决方案2】:

使用 (const type& var) 您将确保对象不应被修改,并且只保留对常量方法的访问权限。 使用指针并不能保证传递了一个对象(或一个对象数组)。 第三个问题你能解释一下吗?

【讨论】:

    【解决方案3】:

    问题 3 答案:
    如果我对您的理解正确,传递值(不是引用或指向引用的函数的指针)将使该函数直接访问该变量,或者您传递给该函数的实际值的字段。 示例:

    void foo(int& ref)
    {
        ref = 5;
    }
    
    void bar(int non_ref)
    {
        non_ref = 0;
    }
    int main()
    {
        int integer_value = 1;
        foo(integer_value);
        bar(integer_value);
    
        return 0;
    }
    

    第一个函数会影响传递的值,但第二个不会,导致该函数的操作应用于传递值的副本。

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多