C++是一门极其复杂的语言,掌握C++。我认为是不可能在一个章节中详细论述的,这一篇仅仅讨论几个喜闻乐见的C++问题。
1. 结构体与类
C语言与C++的结构体有所不同:C语言中结构体只能包含数据成员,不能包含函数;C++可以包含变量与函数。
C++中结构体与类本质上是一样的,结构体是利用struct声明的类。类和结构体的区别:(1)关键字不同,class、struct;(2)默认成员访问权限不同,类是私有、结构体是公有。
2. this指针
this指针是一个隐含的指针,指向对象本身。假设定义一个类,代码如下:
class point
{
public:
int x;
int y;
point(int a,int b)
{
x=a;
y=b;
}
void input(int x,int y)
{
x=x;
y=y;
}
}
input函数,想通过形参x和y给成员变量x和y赋值,但是由于变量的可见性,成员变量x和y是不能访问到的。在这里,就可以通过this->x和this->y来对成员变量进行赋值。
3.类的继承及类中成员访问特性
类中的成员有三种访问权限:(1)public定义的成员可以在任何地方被访问;(2)protected定义的成员只能在该类及其子类中访问;(3)private定义的成员只能在该类自身中访问。
对于继承,同样有三种访问权限去继承基类中的成员。对于子类的成员访问权限,高等级的权限被降级继承。
4.多态性、纯虚函数、抽象类
在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。
纯虚函数是指被标明为不具体实现的虚成员函数。纯虚函数可以让类先具有一个操作名称,而没有操作内容,派生类在继承时给出具体定义。
凡是含有纯虚函数的类叫做抽象类,抽象类不能声明对象,只能作为基类为派生类服务。
4.重载、覆盖与隐藏
重载构成条件:函数的类型不同、参数个数不同,简而言之,就是参数列表不同。只有函数的返回值不同是不能构成函数的重载的。
函数覆盖的条件为:基类必须是虚函数(使用virtual关键字进行声明),发生覆盖的两个函数要分别位于派生类和基类中,函数名称与参数列表必须完全相同。覆盖与多态总是联系在一起。
隐藏发生的情况:(1)派生类的函数与基类的函数完全相同(函数名字和参数列表都相同),只是基类的函数没有使用virtual关键字;(2)派生类的函数与基类的函数同名,但参数列表不同,这种情况下,不管基类是否使用了virtual关键字,基类的函数都将被隐藏。
#include <iostream>
using namespace std;
class Base
{
public:
virtual void xfn(int i)
{
cout << "Base::xfn(int i)" << endl;
}
void yfn(float f)
{
cout << "Base::yfn(flaot f)" << endl;
}
void zfn()
{
cout << "Base::zfn()" << endl;
}
};
class Derived :public Base
{
public:
void xfn(int i) //覆盖了基类的xfn函数
{
cout << "Drived::xfn(int i)" << endl;
}
void yfn(int c) //隐藏了基类的yfn函数
{
cout << "Drived::yfn(int c)" << endl;
}
void zfn() //隐藏了基类的zfn函数
{
cout << "Drived::zfn()" << endl;
}
};
void main()
{
Derived d;
Base *pB = &d;
Derived *pD = &d;
pB->xfn(5);
pD->xfn(5);
pB->yfn(3.14f);
pD->yfn(3.14f);
pB->zfn();
pD->zfn();
system("pause");
}
运行结果: