友元函数的几点注意事项和实例

来源:互联网 发布:卓讯数据库打开 编辑:程序博客网 时间:2024/04/30 19:04

友元函数说明如下
: 
1)必须在类的说明中说明友元函数,说明时以关键字friend开头,后跟友元函数的函数原型,友元函数的说明可以出现在类的任何地方,包括在private和public部分; 
2)注意友元函数不是类的成员函数,所以友元函数的实现和普通函数一样,在实现时不用"::"指示属于哪个类,只有成员函数才使用"::"作用域符号; 
3)友元函数不能直接访问类的成员,只能访问对象成员,
4)友元函数可以访问对象的私有成员,但普通函数不行; 
5)调用友元函数时,在实际参数中需要指出要访问的对象,
6)类与类之间的友元关系不能继承。


1、由于函数的实现与调用和普通函数一样,如下实例

classm

{
public:
m(char* name,char* address)
{
strcpy(m::name,name);
strcpy(m::address,address);
}
friend void Show(m &obj);

private:
char name[20];
char address[20];
};

void Show(m&obj)//和普通函数一样的定义
{
cout<<obj.address<<endl;
cout<<obj.name<<endl;

}

int main()
{

m  a("中国","www.cn.com");
Show(a); //调用和普通函数一样
return 0;
}

2、友元函数无论有没有实参均可以在类内实现 

(1)有参数可以在类内实现

class m
{
public:
m(char* name,char* address)
{
strcpy(m::name,name);
strcpy(m::address,address);
}
friend void ShowN(m &obj)
{
cout<<obj.address<<endl;
cout<<obj.name<<endl;

}

private:
char name[20];
char address[20];
};


int main()
{

m a("中国","www.cn.com");
ShowN(a);
return 0;
}

(2)无参数也可以在类内实现

#include<iostream>
using namespace std;


class m
{
public:
m(char* name,char* address)
{
strcpy(m::name,name);
strcpy(m::address,address);
}
friend void ShowN()//没有参数还是有参数 在类内实现均可以
{
cout<<9<<endl;

}

private:
char name[20];
char address[20];
};
int main()
{

m a("中国","www.cn.com");
ShowN();
return 0;
}

3、友元函数不能直接访问类的非static的成员,只能访问对象成员函数

//error C2352: 'm::p' : illegal call of non-static member function
#include<iostream>
using namespace std;


class m
{
public:
m(char* name,char* address)
{
strcpy(m::name,name);
strcpy(m::address,address);
}
void p()
{
cout<<"可调用"<<endl;

}


friend void ShowN()
{
cout<<9<<endl;
p();

}

private:
char name[20];
char address[20];
};


int main()
{

m a("中国","www.cn.com");
ShowN();
return 0;
}


0 0
原创粉丝点击