【问题标题】:Need advice regarding references in C++ for classes需要有关 C++ 中类引用的建议
【发布时间】:2014-12-12 17:08:18
【问题描述】:

我正在使用 C++ How to Program 8th Edition,其中一部分代码说,

Employee::Employee( const string &first, const string &last, const Date &dateOfBirth, const     DateOfBirth, const Date &dateOfHire)
  : firstName(first), lastName(last), birthDate(dateOfBirth), hireDate(dateOfHire)
  {
  cout <<"Employee object constructor: " << firstName << ' '<< lastName <<endl;
  }

我很困惑。这个 Employee 类是通过复制还是通过引用来初始化 2 个 Date 类对象?这本书说它是由一个复制构造函数说的,但是我在每个名称前都看到了一个 & 符号。另外,如果您在函数参数名称之前声明 const,则该参数不会更改,但传入的原始参数不一定是常量,对吗?

另外,你可以对非常量类使用常量函数,对吧?声明函数常量的意义在于,该函数不能编辑在其所在类中声明的任何变量?

这是main()中的实现

int main() 
{
  Date birth(7, 24, 1949);
  Date hire (3, 12, 1988);
  Employee manager( "Bob", "Blue", birth, hire);
}

birth 和租用是 Date 类的对象

编辑2:这是头文件中定义的函数的屏幕截图。再次感谢。 http://tinypic.com/r/qznf6g/8 http://tinypic.com/r/2qdr3tz/8 非常感谢!!!! 编辑3:我想我想通了。所以它最初是使用引用来初始化 Date 对象,但随后它还使用复制构造函数将 dateOfBirth 分配给第 14 行中的birthDate 对吧?

【问题讨论】:

  • 这取决于成员的声明(在类体中),这里没有显示。
  • 这些类成员变量是如何声明的?作为参考?
  • 主要功能不是我们回答您的问题需要看到的。我们需要查看Employee 类。

标签: c++ class private public


【解决方案1】:
  1. 通过复制。 (编辑:不看“Date”构造函数无法确定) 涉及到两个接口,“Employee”通过引用获取参数,但实际工作是“Date”类型的构造函数,它的接口问题。

    • 另外,如果你在函数参数名之前声明了 const,那个参数不会改变,但传入的原始参数不一定是常量,对吧?

是的。

  • 另外,您可以对非常量类使用常量函数,对吗?声明一个函数常量的要点是该函数不能编辑在其所在的类中声明的任何变量?

是的。

【讨论】:

  • 除非您对Employee 类的了解比问题中显示的更多,否则没有足够的信息让您确定第一个问题的答案。如果birthDatehireDate 是引用,那么你的答案是错误的。
  • 所以我是对的? firsName(first), lastName(last),birthDate(dateOfBirth),hireDate(dateOfHire)
【解决方案2】:

是拷贝构造函数(参数是同类型的对象)。

您应该更加注意参数部分!通过地址(引用)传递参数比通过值传递更快。使用const &amp;不允许在函数外改变参数的值。

【讨论】:

    【解决方案3】:

    考虑一个函数:

    void foo(const Date& dt)
    {
       Date local = dt;
       // Use 'local'
       // Modify 'local'
       // But cannot modify the original/source 'dt'
    }
    
    int main()
    {
       Date abc;
       foo(abc);
    }
    

    foo 中的第一行正在执行复制,没有引用分配,尽管函数参数中存在&amp;。即使您在main 中将abc 声明为const,也会在foo 中执行复制

    【讨论】:

    • 即使原始对象不是常量,您也可以在参数中使用 const 吗?另外,你能确认我的edit3吗?谢谢
    • 是的。非 const 对象可以分配给 const-reference 或由 const-reference 引用。但反向是不可能的。
    • int &hello() { int a = 5;返回一个;调用函数是否收到对 a 的引用?我应该在调用函数中执行 int&b = hello() 吗?谢谢。很抱歉的问题
    • 此代码将发出警告,并且不起作用。请自己清楚地理解这些概念,而不是在这里问一切。如果卡住了,请提出一个新问题。
    • 除了提到的所有内容之外,还有一个错字:firsName is not firstName。
    【解决方案4】:

    让我们一次一点。将日期参数声明为:

    const Date& dateOfBirth
    

    表示日期是通过引用传递的(不是复制的),并且被引用的对象不能被函数修改。接下来会发生什么取决于 Employee 类的 Date 成员是如何声明的。

    它们将是以下之一:

    Date birthDate;        //the parameter is passed to the copy constructor of Date
    const Date birthDate;  //as above, and the birthDate object cannot then be changed
    const Date& birthDate; //birthDate is set to a reference to the object passed in, which then cannot be changed using this reference
    Date& birthDate;       //you would get a compiler error in the Employee constructor.
    

    如果Dates 被声明为在第一行 - 在堆栈上 - Date 复制构造函数(一个构造函数采用对相同类型的引用,最好是 const 引用)必须是将参数作为const Date$ 并怀疑它在内部将其属性设置为传入对象的属性。

    如果 Date 的复制构造函数采用非常量引用,那么在 Employee 构造函数中也会出现编译器错误,因为您将尝试将 const 传递给非常量参数。

    (如果它按值取参数,这也是一个错误,因为需要调用复制构造函数来调用复制构造函数,以此类推!)

    const 方法可以在非const 对象或非const 引用或指向对象的指针上调用是正确的。

    最后,我在这里声明引用等时使用了与您相同的样式,但是您应该阅读“从右到左”的顺序来声明这些类型,因为它是最一致和首选的方法。例如,我们更喜欢

    Date const$ dateOfBirth
    

    const Date& dateOfBirth
    

    即使它们实际上是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多