类的多态
class A{
public:
virtual void test(){ cout << "this is A"<<endl; };
};
class B :public A{
public:
void test(){ cout << "this is B"<<endl; };
};
void test(){
A a;
a.test();// A
B b;
b.test(); //B
A& ref = b;
ref.test();// Run B test(); 实现了多态
}
将基类引用指向派生类可以达到多态的效果。
如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。
引用还可以实现函数引用
以下是对函数的引用返回的测试代码:
int testData = 7;
int testArray[10] = { 0 };
int& data(){
return testData;
}
int& no(int i){
return testArray[i];
}
void test(){
// testData = 7
data() -= 2;
//对返回的引用值进行更改可以直接改变原数值,当然这个实际上用处不大,只是对引用的一些测试
// testData = 5
cout << "testData: " << testData << endl;
int i = 5;
//now testArray[i] = 0;
no(i) = 5;
cout << "testArray[i] : " << testArray[i] << endl;
// testArray[i] = 5 ;
}
[ ]运算符的重载
const int length = 10;
class myList {
private:
int ary[10];
public:
int & operator [](const int & i) {
return ary[i];
}
};
void TestReference() {//通过[]运算符的重载,直接修改myList内部的值,当然这样就让类失去了封装性。
//不过,只是拿来测试
myList lis;
for (int i = 0; i < length; i++) {
lis[i] = i;
cout << lis[i] << " ";
}
// 0,1,2,3,4,5,6,7,8,9
cout << endl;
}
以下是一些注意事项:
(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,
引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。
(2)用引用传递函数的参数,能保证参数传递中不产生副本,
提高传递的效率,且通过const的使用,保证了引用传递的安全性。
(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,
对它所指向的变量间接操作。程序中使用指针,程序的可读性差;
而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
(4)使用引用的时机。流操作符 << 和 >> 、赋值操作符 = 的返回值、
拷贝构造函数的参数、赋值操作符 = 的参数、其它情况都推荐使用引用。