常见错误总结
const-1
如下代码会报错
原因如下:
man是一个const修饰的对象,即man不能修改任何内容,但是man所调用的play函数只是一个普通的函数,所以出现了报错。我们需要在play函数中加上const修饰,或者删除man对象的const修饰,报错即可解除。
修改后的代码如下:
class Man {
public:
Man() {}
void play() const{
cout << "I am playing ...." << std::endl;
}
};
int main(void) {
const Man man;
man.play();
}
这里给出一种修改方式,另一种大家可以自行尝试修改。
总结:
报错:
error C2662: “void Man::play(void)”: 不能将“this”指针从“const Man”转换为“Man &”
原因:
man是const对象, 但是却调用了非const方法.
解决方案:
方案1:
把 const Man man; 修改为: Man man;
方案2:
把play方法, 修改为 const方法.
const-2
如下代码会报错
报错原因:
man对象被const修饰,而test函数所需要传入的对象是普通对象,而不是const修饰的对象
下面我们将test函数所需对象修改成用const修饰的对象
如图所示,如果test所需的对象变成const修饰的对象,但是test函数中调用的函数是普通函数,也会报错,我们需要将play函数也用const修饰即可解除报错。
如果我们将man对象前面的const修饰删掉,则也不会报错
说明const修饰的对象可以传入普通对象,并且普通对象也可以调用用const修饰的函数
总结:
原因: 非const引用, 不能对const变量进行引用
注意: const引用, 可以对非const变量进行引用
解决方案:
修改引用变量, 或者被引用的变量
static
错误代码如下
原因:
类的静态方法(static方法) 内, 不能访问实例方法(非static方法)和实例数据成员(非static数据成员).
由上面两段代码可以看出 getCount函数是一个静态方法,如果在这个方法中调用了非静态的函数或者是非静态的变量,就会报错。
因此可知,类的静态方法(static方法) 内, 不能访问实例方法(非static方法)和实例数据成员(非static数据成员).
vector
代码如下
class Man {
public:
Man() {}
void play() {
count += 10;
cout << "I am playing ...." << std::endl;
}
int getDrinkCount() const {
return count;
}
private:
int count = 0; //一共喝了多少杯酒
};
int main(void) {
Man zhangFei, guanYu, liuBei;
vector<Man> men;
// push_back是把参数的值,拷贝给vector
// men[0]的值和liubBei是相同的,但是,是两个不同的对象
men.push_back(liuBei);
men.push_back(guanYu);
men.push_back(zhangFei);
men[0].play();
cout << men[0].getDrinkCount() << endl; //10
cout << liuBei.getDrinkCount() << endl; //0
system("pause");
return 0;
}
上段代码的运行结果如下图所示
根据上面的运行结果我们可以看出,liubei对象和men[0]对象的count变量值是不同的,因此可以知道,这是两个对象。
因此,vector加入的成员是拷贝新成员,只是刚开始的时候两个对象的值相同,但终究是两个对象,后续对其中一个对象的值进行修改,另一个对象的值不会改变。