面向对象之亡羊补牢
前言:由于期中考后的周测不甚理想,面向对象题几乎次次爆零。现临近期末,来对面向对象模块做一波总结,感谢杨老师、周老师的课件和指导。
报错信息总结
- 引用类型的返回值
intMyVector& operator+ (intMyVector &u, intMyVector &v)
{
intMyVector tmp(u.n);
for(int i =0; i < v.n - 1; ++i)
tmp.p[i] = u.p[i] + v.p[i];
return tmp;
}
报错:warning: reference to local variable ‘tmp’ returned [-Wreturn-local-addr]
解决方案:
1、将intMyVector& operator+ (intMyVector &u, intMyVector &v)
改为intMyVector operator+ (intMyVector &u, intMyVector &v)
就行,把&
删掉即可。
2、返回值为引用: 结合this指针使用,返回 *this
原因:在原来的代码里面,表示引用的符号&
暗示函数返回的是一个地址,但要注意tmp
是一个临时变量,当函数体执行结束时,tmp
的内存空间也随机消失了,而我们不能返回一个不存在的地址。
- 类的构造
class Counter
{
public:
// Counter(){value=0;}
……
};
Counter operator*(Counter c1,Counter c2)
{
Counter temp;
temp.value=c1.value*c2.value;
return temp;
}
解决方案: **Counter(){value=0;}**补上无参构造函数
原因:类类型 类名 的方式实例化类,需要无参构造函数
知识点总结
构造函数
-
作用:在定义对象时,实现初始化
每个类都应该有一个构造函数,若没提供,编译器自动生成(参数、方法都为空)。如果自己定义了,就不会再提供自动生成的了
-
特点:
- 构造函数名==当前类名
- 只执行一次 参数可有可无,但一定没有返回值
- 只能public
-
注意:
- 构造函数可以进行重载,以便用于不同形式的对象的定义。
- 构造函数还可以使用默认的缺省参数。如果构造函数既有重载,又有缺省参数时,注意不要产生二义性
-
参数初始化表:
除了构造函数,还有参数初始化表对数据初始化,在函数首部实现
BOX::BOX(int h,int w,int len):height(h),width(w),length(len){