我使用C ++如何编程第8版,代码的一部分说,
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类对象?这本书通过复制构造函数说明了它,但我在每个名称之前看到了&amp;&符号。另外,如果在函数参数名称之前声明const,那么该参数不变,但传入的原始参数可能不一定是常量吗?
另外,你可以对常量类使用常量函数吗?声明函数常量的要点是该函数可能不会编辑在类中声明的任何变量吗?
这是main()
中的实现int main()
{
Date birth(7, 24, 1949);
Date hire (3, 12, 1988);
Employee manager( "Bob", "Blue", birth, hire);
}
出生和雇用是类Date的对象
编辑2:这是头文件中定义的功能的屏幕截图。再次感谢。 http://tinypic.com/r/qznf6g/8 http://tinypic.com/r/2qdr3tz/8 非常感谢你!!!! 编辑3:我想我弄明白了。所以它最初使用引用初始化Date对象,但是它还使用复制构造函数将dateOfBirth分配给第14行的birthDate吗?
答案 0 :(得分:1)
通过复制。 (编辑:如果没有查看“Date”构造函数就无法确定)涉及两个接口,“Employee”通过引用获取参数,但实际工作做“Date”类型的构造函数,它的接口做物质
是
是
答案 1 :(得分:1)
考虑一个函数:
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中的第一行是执行复制,尽管函数参数中存在&
,但没有引用赋值。即使您在abc
中将const
声明为main
,也会在foo
答案 2 :(得分:0)
它是一个复制构造函数(参数是相同类型的对象)。
你应该更多地关注参数部分!通过地址(引用)传递参数比通过值传递更快。使用const &
不允许在函数外部更改参数的值。
答案 3 :(得分:0)
让我们一点一点。将日期参数声明为:
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.
如果Date
被声明为第一行 - 在堆栈上 - Date
复制构造函数(构造函数将引用,最好是const引用)引用到同一行type)必须将参数作为const Date$
,并且怀疑它在内部将其属性设置为传入的对象的属性。
如果Date
的复制构造函数采用非const引用,那么在Employee构造函数中会出现编译器错误,因为您尝试将const传递给非const参数。
(如果它的参数值也是一个错误,因为需要调用复制构造函数来调用复制构造函数,依此类推!)
您是正确的,可以在非const
对象或非const
引用或指向对象的指针上调用const
方法。
最后,我在声明引用等方面使用了与你相同的样式,但你应该阅读“从右到左”的顺序来声明这些类型,因为它是最一致和首选的方法。例如,我们更喜欢
Date const$ dateOfBirth
到
const Date& dateOfBirth
即使它们实际上是相同的。