第四课——友元
- 友元函数
- 友元类
(1)友元函数:一个类的友元函数可以访问该类的私有成员;
class CCar
{
private:
int price;
friend int MostExpensiveCar( CCar cars[], int total); //声明友元
};
除了可以将普通函数定义为一个类的友元函数外,还可以将一个类的成员函数(包括构造、析构函数)定义为另一个类的友元函数。
class B
{
public:
void function();
};
class A
{
friend void B::function();
};
(2)友元类:A是B的友元类,则A的成员函数可以访问B的私有成员。
class CCar
{
private:
int price;
friend class CDriver; //声明CDriver为友元类
};
注意:友元类的关系不能传递,也不能继承;
第五课——this指针
非静态成员函数中,直接用this代表指向该函数作用的对象的指针。
class Complex
{
public:
double real, imag;
void Print()
{
cout<<real<<","<<imag<<endl;
}
Complex(double r, double i):real(r),imag(i){}
Complex AddOne()
{
this->real++; //等价于real++
this->Print(); //等价于Print
return *this;
}
};
注意:静态成员函数中不能使用this指针!(因为静态成员函数并不具体作用于某个对象)
第六课——常量对象、常量成员函数和常引用
常量对象:不希望该对象的值被改变,则定义为常量对象。
class Demo
{
private:
int value;
public:
void SetValue(){}
};
const Demo Obj; //常量对象
常量成员函数:执行期间不应修改其所作用的对象。在常量成员函数中不能修改成员变量的值(静态成员变量除外),也不能调用同类的非常量成员函数(静态成员函数除外)。
class Sample
{
public:
int value;
void GetValue() const;
void func() {};
Sample(){};
};
void Sample::GEtValue()
{
value = 0; //wrong
func(); //wrong
}
常量成员函数的重载:两个成员函数,名字和参数表都一样,但是一个是const,一个不是,属于重载。
class CTest
{
private:
int n;
public:
CTest() { n = 1;}
int GetValue() const { return n;}
int GetValue() {return 2*n;}
};
int main()
{
const CTest objTest1;
CTest objTest2;
cout<<objTest1.GetValue()<<","<<objTest2.GetValue(); //objTest1调用常量成员函数,objTest2调用普通成员函数
retutn 0;
}
常引用:引用前加关键字const成为常引用。不能通过常引用改变引用的变量。
用法:对象作为函数的参数时,生成该参数需要调用复制构造函数,效率低下。用指针作为参数,代码不好看。可以用对象的引用作为参数。但是这样可能爱函数中改变对象的值,则可以用常引用。