关于复制构造函数和 NRVO
Regarding copy constructor and NRVO
class Date
{
private:
int day,month,year;
public:
Date (int d,int m,int y)
{
day=d;
month=m;
year=y;
}
Date (Date &d)
{
day=d.day;
month=d.month;
year=d.year;
}
int monthDays(int month,int year)
{
if((year%4)==0){
if(month==4 || month==6 || month==9 || month==11){
return 30;
}
else
if(month==2){
return 29;
}
else
return 31;
}
else{
if(month==4 || month==6 || month==9 || month==11){
return 30;
}
else
if(month==2){
return 28;
}
else
return 31;
}
}
Date operator+ (const int k)
{
Date copy(day,month,year);
int inc_days=k;
if(inc_days<=(monthDays(copy.month,copy.year)-copy.day)){
copy.day+=inc_days;
return copy;
}
else{
inc_days-=(monthDays(copy.month,copy.year)-copy.day);
copy.day=monthDays(copy.month,copy.year);
while(inc_days>0){
copy.year+=(copy.month/12);
copy.month+=1-12*(copy.month/12);
if(inc_days>monthDays(copy.month,copy.year)){
copy.day=monthDays(copy.month,copy.year);
inc_days-=monthDays(copy.month,copy.year);
}
else{
copy.day=inc_days;
inc_days=0;
}
}
return copy;
}
}
};
int main()
{
Date d1(2,3,2004); //uses another constructor //line 1
Date d3(d1); //line 2
Date d2=d1+2; //uses overloaded + operator //line 3
}
即使第 2 行没有将临时对象作为参数,如果我不在复制构造函数参数中添加 const,我仍然会遇到编译器错误。
在第 3 行的情况下,重载运算符 returns 使用 NRVO 的对象。因此它不应使用复制构造函数。但它仍然给出编译器错误。如果我在复制构造函数中添加一个常量,这两个错误都会消失 argument.But 为什么它会报错?
即使复制构造函数被编译器优化掉,代码仍必须像理论上调用复制构造函数一样正确编译。您需要使复制构造函数的参数成为常量引用才能获取临时对象。
class Date
{
private:
int day,month,year;
public:
Date (int d,int m,int y)
{
day=d;
month=m;
year=y;
}
Date (Date &d)
{
day=d.day;
month=d.month;
year=d.year;
}
int monthDays(int month,int year)
{
if((year%4)==0){
if(month==4 || month==6 || month==9 || month==11){
return 30;
}
else
if(month==2){
return 29;
}
else
return 31;
}
else{
if(month==4 || month==6 || month==9 || month==11){
return 30;
}
else
if(month==2){
return 28;
}
else
return 31;
}
}
Date operator+ (const int k)
{
Date copy(day,month,year);
int inc_days=k;
if(inc_days<=(monthDays(copy.month,copy.year)-copy.day)){
copy.day+=inc_days;
return copy;
}
else{
inc_days-=(monthDays(copy.month,copy.year)-copy.day);
copy.day=monthDays(copy.month,copy.year);
while(inc_days>0){
copy.year+=(copy.month/12);
copy.month+=1-12*(copy.month/12);
if(inc_days>monthDays(copy.month,copy.year)){
copy.day=monthDays(copy.month,copy.year);
inc_days-=monthDays(copy.month,copy.year);
}
else{
copy.day=inc_days;
inc_days=0;
}
}
return copy;
}
}
};
int main()
{
Date d1(2,3,2004); //uses another constructor //line 1
Date d3(d1); //line 2
Date d2=d1+2; //uses overloaded + operator //line 3
}
即使第 2 行没有将临时对象作为参数,如果我不在复制构造函数参数中添加 const,我仍然会遇到编译器错误。 在第 3 行的情况下,重载运算符 returns 使用 NRVO 的对象。因此它不应使用复制构造函数。但它仍然给出编译器错误。如果我在复制构造函数中添加一个常量,这两个错误都会消失 argument.But 为什么它会报错?
即使复制构造函数被编译器优化掉,代码仍必须像理论上调用复制构造函数一样正确编译。您需要使复制构造函数的参数成为常量引用才能获取临时对象。