类中成员函数可以直接使用私有成员,实现类的某些功能。但有时为了更好地隐藏具体实现或使用方便,可定义不带全部参数参数的公有接口名,再由接口函数去调用带有参数的重载函数(也可以为非重载函数),此时前者常称为驱动,调用带参数的接口函数时若要修改类内的私有资源一定要传递引用。
这里举例说明函数参数传递(没有实现完整类):
二叉查找树的部分实现:类中三个公有函数都调用私有函数实现对应功能,当欲改变私有数据成员时私有函数的参数一定为引用,即使传递的是指针。
1.节点(节点内元素为int型).
struct node{
int item;
node *left;
node *right;};
2.二叉查找树类实现:
class binarysearchtree{
private:
node *root=nullptr;//二叉树基本的私有成员—根节点
//...其他成员可根据实现定义
public:
binarysearchtree(){};
//...这里还有很多成员如复制构造、打印等,可根据实际需要进行定义
void insert(const node &);
void remove(const node &);
int findmin();
private:
int findmin(const node *);//int findmin()函数的重载
void insert(node *&root,const node &nod);//void insert()成员的重载
void remove(node *&root, const node &nod);//void remove()成员的重载
};
int binarysearchtree::findmin()
{
return findmin(root);
}
int binarysearchtree::findmin(const node *root)
{
if(root==nullptr)//如果树为空则无最小值,返回INT_MIN作为标记
return INT_MIN;
if(root->left!=nullptr)
findmin(root->left);
else return root->item;
}
void binarysearchtree::insert(const node &nod)
{
insert(root ,nod);
}
void binarysearchtree:: remove(const node &nod)
{
remove(root, nod);
}
void binarysearchtree::insert(node * &root, const node &nod)
{
if(nullptr==root)
{
root=new node;
root.item=nod.item;
return ;
}
if(root->item>nod.item)//插入元素小于节点元素,向节点的左子树插入
insert(root->left,nod);
else if(root->item<nod.item)//插入元素大于节点元素
insert(root->right, nod);
else if(root->item==nod.item)//等于则不需插入
return;
}
void binarysearchtree::remove(node *&root,const node &nod )
{
if(nullptr==root)//对象中无元素
return ;
if(root->item>nod.item)
remove(item->left,nod);
else if(root->item<nod.item)
remove(item->right, nod);
else if(root->item==nod.item)
{
node *temp=root;
if(root->left!=nullptr&&root->right!=nullptr)
//欲删除节点有左右子节点时将节点删除,并将右子树中最小节点移过来再删除右子树最小点(也可以移动左子树最大节点)
{
root->item=findmin(root->right);
remove(root->right,*root);
}
else if(root->left!=nullptr)//只有一个节点则用子节点替换父节点
{
root->right=right->left->right;//此句与下局顺序不可变
root->left=root->left->left;
}
else if(root->right!=nullptr)
{
root->left=root->right->left;
root->right=root->right->right;
}
delete temp;
}
}