- 浏览: 501496 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
<!-- [if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:UseFELayout/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!-- [if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--><!-- [if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]-->
C++友元friend --c++ 利用friend 修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
分类: C++ 知识点回顾 2008-10-06 11:24 7642 人阅读 评论 (0) 收藏 举报
通常对于普通函数来说,
要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(
共用的)
,然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++
利用friend
修饰符,可以让一些你设定的函数能够对这些保护数据进行操作
,
避免把类成员全部设置成public
,最大限度的保护数据成员的安全
。
友元能够使得普通函数直接访问类的保护数据
,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,这即是友元的缺点
,在现在cpu
速度越来越快的今天我们并不推荐使用它,但它作为c++
一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。
1.
在类里声明一个普通函数,在前面加上friend
修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。
下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的。
#include <iostream
>
using
namespace
std;
class
Internet
{
public
:
Internet(char
*name,char
*address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend
void
ShowN(Internet &obj);//
友元函数的声明
public
:
char
name[20];
char
address[20];
};
void
ShowN(Internet &obj)//
函数定义,
不能写成,void Internet::ShowN(Internet &obj)
{
cout
<<obj.name<<endl;
}
void
main
()
{
Internet a("
中国软件开发实验室","www.cndev-lab.com");
ShowN(a);
cin
.get();
}
上面的代码通过友元函数的定义,我们成功的访问到了a 对象的保护成员name, 友元函数并不能看做是类的成员函数,它只是个被声明为类友元的普 通函数,所以在类外部函数的定义部分不能够写成void Internet::ShowN(Internet &obj) ,这一点要注意。
2. 一个普通函数可以是多个类的友元函数 ,对上面的代码我们进行修改,注意观察变化:
#include <iostream
>
using
namespace
std;
class
Country;
class
Internet
{
public
:
Internet(char
*name,char
*address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend
void
ShowN(Internet &obj,Country &cn);//
注意这里
public
:
char
name[20];
char
address[20];
};
class
Country
{
public
:
Country()
{
strcpy(cname,"
中国");
}
friend
void
ShowN(Internet &obj,Country &cn);//
注意这里
protected
:
char
cname[30];
};
void
ShowN(Internet &obj,Country &cn)
{
cout
<<cn.cname<<"|"<<obj.name<<endl;
}
void
main
()
{
Internet a("
中国软件开发实验室","www.cndev-lab.com");
Country b;
ShowN(a,b);
cin
.get();
}
3 一个类的成员函数函数也可以是另一个类的友元 , 从而可以使得一个类的成员函数可以操作另一个类的数据成员,我们在下面的代码中增加一类Country ,注意观察:
#include <iostream
>
using
namespace
std;
class
Internet;
class
Country
{
public
:
Country()
{
strcpy(cname,"
中国");
}
void
Editurl(Internet &temp);//
成员函数的声明
protected
:
char
cname[30];
};
class
Internet
{
public
:
Internet(char
*name,char
*address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend
void
Country::Editurl(Internet &temp);//
友元函数的声明
protected
:
char
name[20];
char
address[20];
};
void
Country::Editurl(Internet &temp)//
成员函数的外部定义
{
strcpy(temp.address,"edu.cndev-lab.com");
cout
<<temp.name<<"|"<<temp.address<<endl;
}
void
main
()
{
Internet a("
中国软件开发实验室","www.cndev-lab.com");
Country b;
b.Editurl(a);
cin
.get();
}
4.
整个类也可以是另一个类的友元
,该友元也可以称做为友类
。友类的每个成员函数都可以访问另一个类的所有成员。
示例代码如下:
#include <iostream
>
using
namespace
std;
class
Internet;
class
Country
{
public
:
Country()
{
strcpy(cname,"
中国");
}
friend
class
Internet;//
友类的声明
protected
:
char
cname[30];
};
class
Internet
{
public
:
Internet(char
*name,char
*address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
void
Editcname(Country &temp);
protected
:
char
name[20];
char
address[20];
};
void
Internet::Editcname(Country &temp)
{
strcpy(temp.cname,"
中华人民共和国");
}
void
main
()
{
Internet a("
中国软件开发实验室","www.cndev-lab.com");
Country b;
a.Editcname(b);
cin
.get();
}
在上面的代码中我们成功的通过Internet
类Editcname
成员函数操作了Country
类的保护成员cname
。
在编程中,我们使用友元的另外一个重要原因是为了方便重载操作符的使用
,这些内容我们将在后面的教程着重讨论!
发表评论
-
Android display架构分析
2011-11-08 14:43 2463Android display架构分析 高通7系列硬件架 ... -
android usb流程(转载加整理)
2011-11-08 14:42 3072android usb流程(转载加整理) ... -
Jni函数调用大全
2011-09-08 16:34 9665Jni函数调用 ... -
android linux 基础知识总结
2011-09-08 16:23 2808android linux 基础知识总结 ===== ... -
pthread_create用法 c线程
2011-09-08 09:34 3574今天开始学习linux下用C开发多线程程序,Linux系统下的 ... -
C++多线程入门(一)
2011-09-05 14:32 1204第1节 背景 为了更好的理解多线程的概念,先对进程,线程 ... -
C++中的虚函数(virtual function)多态
2011-09-05 13:41 8911.简介 虚函数是 ... -
添加一个系统服务sytem service
2011-09-02 15:51 2451方法一: 1.在应用中 com.xxx.spi.SPLLi ... -
android.mk文件
2011-09-02 13:51 1199<!-- [if gte mso 9]><x ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1149android 中使用socket使native和frame ... -
让你自己写的Android的Launcher成为系统中第一个启动的,也是唯一的Launcher
2011-09-01 09:49 868[转]让你自己写的Android的Launcher成为系统中第 ... -
No implementation found for native Landroid/
2011-08-31 17:30 2332No implementation ... -
Java 线程中的Join、wait、notify,sleep【转】
2011-05-30 09:37 1043Java 线程中的Join、wait、notify ... -
android回调函数总结
2011-02-14 13:26 4339回调函数就是那些自己写的,但是不是自己来调,而是给别人来掉的函 ... -
IPC框架分析 Binder,Service,Service manager
2011-01-22 13:10 1268IPC框架分析 Binder,Servic ... -
Android中几种图像特效处理的小技巧,比如圆角,倒影,还有就是图片缩放,Drawable转化为Bitmap,Bitmap转化为Drawable等等
2011-01-22 11:41 2169Android中几种图像特效处理的小技巧,比如圆角,倒影,还有 ... -
Android中SurfaceView的使用示例
2011-01-19 20:54 836SurfaceView在游戏开发中有着举足轻重的地位,它对于画 ... -
Android 的 SurfaceView 双缓冲应用
2011-01-19 20:46 1760双缓冲是为了防止动画闪烁而实现的一种多线程应用,基于Surfa ... -
Android Content Provider[转]
2010-10-21 14:42 1149Android应用程序可以使用 ... -
我的数据你来用—ContentProvider介绍
2010-08-25 09:09 21191.第一步 在Eclipse中, ...
相关推荐
本文档详细介绍了C++友元函数及友元类,方便大家对比学习
C++友元函数的使用,这个友元函数是另一个类的成员函数
实例讲解C++友元,利用实例讲解C++友元的知识
各种友元应用举例。欢迎大家下载使用。 各种友元应用举例。欢迎大家下载使用。
c++ demo,重载运算符,友元函数的实现
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术 **友元的目的** 就是让一个函数或者类 访问另一个类中的私有成员 **友元的关键字为** ==friend== **友元的三种实现** ...
关于c+模板之友元类友元函数的实例化,图形界面之矩形。
C++友元习题.pdf
友元函数,类外普通函数声明为类的友元,之后即可与类共享数据
这是关于C++中、如何将普通函数声明友元函数的、求间隔日期的例子。适用于C++初学者学习用。
让你很好的理解C++友元接口问题。加油,让我们一起冲刺C++。
介绍c++ 友元函数的定义使用,初步入门教程
友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效
主要讲解c++种的友元类友元函数 可以更好地学习其中的内容 友元在类中担任着十分关键的角色 所以更应该认真学习
在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员。 语法 friend class-name; friend function-declarator; 友元声明 如果声明以前未声明的友元函数,则该函数将...
一个实例,实现运算符重载(成员函数和非成员函数两种方式),友元函数的使用,注意事项等,自己学习时编写的,
全面讲解C++友元知识,更加详细的讲述C++中友元机制,还配有代码讲解,十分详细!
本资源为C++实验1-13,包含完整程序、注释、报告非常适合初学者学习、研究,具体如下: 实验1-熟悉Visual C++编程环境 实验2-利用函数编程 实验3-指针与引用的编程 实验4-类与对象的编程 实验5-构造函数与析构函数的...
c++ 基本知识--友元(曹阳).pptx
C++大学教程(目录) 第1章 计算机与C++编程简介-------------------------------------------------1 1.1 简介--------------------------------------------------------------1 1.2 什么是计算机--------...