1.细节一,隐藏的this指针,如果我们创建一个日期类,俩个日期类变量经行相应的运算符 *** 作时,不改变变量本身可以在对应的运算符重载函数后面加上const:
这句话的意思等价于
bool operator(const Date * const this,const Date & d2);
为什么要这样能,防止嵌套调用而出错:
void Printf()//这里隐藏了this指针(Date *this)
{
cout << year<< "—" << month << "—" << day << endl;//实际上是this->day;
}
void fun(const Date & x)
{
x.printf();
}
Date d1;
fun(d1);
编译器会报错,为什呢?因为第一次d1传给fun函数时x是const类型不能被修改,但是x,this指针是 Date* const this,接受了x的地址,对其解引用就会出错。
为什么要在参数前面加上const呢?
来看下面一段代码
//赋值运算符
Date & operator = ( Date & d2)
{
if (this != &d2)
{
day = d2.day;
month = d2.month;
year = d2.year;
return *this;
}
else
return *this;
}
Date d1;
Date d2;
d2 = d1 + 1;
如果d2不加const机会出错为什么呢?因为d1+1返回的是一个临时变量,临时变量具有常属性,所以d2不能接收,这样写就是权限的放大。
默认在类里面定义的函数就是内联函数所以短小函数建议在类里面定义。
那些需要经常使用的变量就可以设为静态变量:
例如:
可以省去很多次拷贝;
复用优化:
//加上天数(加等)
Date & operator += (int x)
{
if (x < 0)
{
return *this -= (-x);
}
day = day + x;
while (day > Getmonthday(year, month))
{
day = day - Getmonthday(year, month);
month++;
if (month > 12)
{
year++;
month = 1;
}
}
return *this;
}
//加上天数(不是加等)
Date operator + (int x) const
{
Date d(*this);
d += x;
return d;
}
这样加就只拷贝了俩次。比直接写加要少调用一次拷贝构造。
如果是俩个自定义类型相互赋值什么时候编译器会调用拷贝构造什么时候会调用函数符号重载呢?
Date d1;
Date d2 = d1;
在定义变量的时候同时给拿一个已经存在的变量去给另外一个不存在的变量去赋值,这时就会调用拷贝构造,
如果是这样写:
Date d1;
Date d2;
d1 = d2;
俩个已经存在 的变量直接赋值就会调用函数符号重载
哪4个运算符号不能经行运算符号重载呢?分别是“?:" "." "::" ".*"
总结,如果不改变变量本身,而且有this指针时在函数后面加上const,再需要函数的参数需要引用时在引用前加上const;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)