- 浏览: 514741 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (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 2621Android display架构分析 高通7系列硬件架 ... -
android usb流程(转载加整理)
2011-11-08 14:42 3142android usb流程(转载加整理) ... -
Jni函数调用大全
2011-09-08 16:34 9799Jni函数调用 ... -
android linux 基础知识总结
2011-09-08 16:23 2855android linux 基础知识总结 ===== ... -
pthread_create用法 c线程
2011-09-08 09:34 3642今天开始学习linux下用C开发多线程程序,Linux系统下的 ... -
C++多线程入门(一)
2011-09-05 14:32 1249第1节 背景 为了更好的理解多线程的概念,先对进程,线程 ... -
C++中的虚函数(virtual function)多态
2011-09-05 13:41 9351.简介 虚函数是 ... -
添加一个系统服务sytem service
2011-09-02 15:51 2516方法一: 1.在应用中 com.xxx.spi.SPLLi ... -
android.mk文件
2011-09-02 13:51 1255<!-- [if gte mso 9]><x ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1207android 中使用socket使native和frame ... -
让你自己写的Android的Launcher成为系统中第一个启动的,也是唯一的Launcher
2011-09-01 09:49 921[转]让你自己写的Android的Launcher成为系统中第 ... -
No implementation found for native Landroid/
2011-08-31 17:30 2446No implementation ... -
Java 线程中的Join、wait、notify,sleep【转】
2011-05-30 09:37 1096Java 线程中的Join、wait、notify ... -
android回调函数总结
2011-02-14 13:26 4390回调函数就是那些自己写的,但是不是自己来调,而是给别人来掉的函 ... -
IPC框架分析 Binder,Service,Service manager
2011-01-22 13:10 1322IPC框架分析 Binder,Servic ... -
Android中几种图像特效处理的小技巧,比如圆角,倒影,还有就是图片缩放,Drawable转化为Bitmap,Bitmap转化为Drawable等等
2011-01-22 11:41 2218Android中几种图像特效处理的小技巧,比如圆角,倒影,还有 ... -
Android中SurfaceView的使用示例
2011-01-19 20:54 884SurfaceView在游戏开发中有着举足轻重的地位,它对于画 ... -
Android 的 SurfaceView 双缓冲应用
2011-01-19 20:46 1806双缓冲是为了防止动画闪烁而实现的一种多线程应用,基于Surfa ... -
Android Content Provider[转]
2010-10-21 14:42 1199Android应用程序可以使用 ... -
我的数据你来用—ContentProvider介绍
2010-08-25 09:09 21941.第一步 在Eclipse中, ...
相关推荐
C++友元类调用实例详解 在 C++ 编程语言中,友元类(Friend Class)是一种特殊的类关系,允许一个类访问另一个类的私有成员和保护成员。本文将详细解释友元类的调用实例,包括友元类的定义、继承关系、成员访问控制...
在类声明中,使用 friend 关键字和非成员函数名称或其他类,以允许其访问你的类的专用和受保护成员。 语法 friend class-name; friend function-declarator; 友元声明 如果声明以前未声明的友元函数,则该函数将...
8. **友元(friend)**:`friend`关键字让函数成为类的友元,可以访问类的私有和受保护成员。 9. **常量表达式(constexpr)**:C++11引入,指示函数返回的结果是一个常量表达式,即编译时常量。 ### 函数名后的...
友元(Friend)是C++中的一个特性,允许类的私有或受保护成员对其他类或函数开放。友元可以是类的成员函数或者非成员函数。友元函数可以访问声明它的类的私有和受保护成员,即使它不是该类的成员。 1. 友元类:一个...
29. **friend**:声明友元函数或类。 30. **goto**:无条件跳转到标记位置。 31. **if**:if语句的关键字。 32. **inline**:建议编译器内联函数。 33. **int**:整型。 34. **long**:长整型。 35. **...
以下是对C++基础的一些详细解释: 1. 类和对象: - 类是一种抽象的数据类型,它定义了一组数据成员(变量)和成员函数(方法),用于封装数据和操作。 - 对象是类的具体实例,它包含类中定义的成员变量和成员函数...
在这个"C++类的练习"主题中,我们将深入探讨类的基本构造、成员变量、成员函数、访问修饰符、构造函数、析构函数、对象的创建与销毁、友元函数、继承、多态等关键知识点。 1. **类的定义与声明**:类是用来定义对象...
《C++面向对象程序设计(第6版)》是由Walter Savitch...以上就是C++面向对象编程的一些核心概念,通过《C++面向对象程序设计(第6版)》的配套题库,你可以针对这些知识点进行深入的练习和理解,提升你的C++编程技能。
10. 友元(Friend):友元函数或友元类可以访问类的私有和保护成员,`test2`中可能涉及到友元的使用,以解决特定的访问控制问题。 这个实验代码`test2`提供了一个实践C++面向对象编程的平台,通过分析和运行这些...
在C++编程语言中,类(Class)是面向对象编程的核心元素,它定义了一组相关的数据和函数,这些数据和函数共同完成一个特定任务。理解类的基本概念对于编写高效的C++代码至关重要。以下是对C++类中一些易错点的详细...
- C++允许重载已有的运算符,使其能够对类对象进行操作,提高了代码的可读性。 8. **异常处理**: - 异常处理是C++中处理错误的一种方式,通过`try`、`catch`和`throw`关键字来捕获和处理运行时出现的错误。 9. ...
在C++编程语言中,"类"是面向对象编程的核心概念。它是一种用户自定义的数据类型,用于封装数据和操作这些数据的...通过不断的练习和实践,你可以更熟练地掌握类的各种操作,并利用它们构建出高效、可维护的C++程序。
- 友元(Friend):允许非成员函数或类访问另一个类的私有或受保护成员。 3. **Visual C++开发环境**: - IDE(Integrated Development Environment):集成了编辑器、编译器、调试器等工具,方便编写、编译和...
6. **友元(Friend)**:友元函数或友元类可以访问另一个类的私有和保护成员,打破封装原则但有时有助于实现特定功能。声明友元需在类定义内使用`friend`关键字。 7. **静态成员**:静态成员属于类而不是类的任何...
- 友元类(Friend classes)是整个类而不是类的某个成员成为另一个类的友元,这样类的所有成员函数都可以访问对方的私有和保护成员。 继承时访问权限的变化: - `private`继承:这种方式通常用来表示“is-a”关系...
- **修饰符**:静态数据成员可以用 `public`、`private` 和 `protected` 修饰。 ### 5. 构造函数的调用时机 - **调用时机**:构造函数仅在创建对象时被自动调用。 - **目的**:初始化对象的成员变量,并进行必要的...
还有友元(Friend)函数和友元类,它们可以访问通常受保护的数据,虽然打破了封装性,但在某些情况下可以增加灵活性。 模板(Template)是C++中的一大特色,它允许创建泛型代码,可以在多种类型上工作,提高了代码...
C++通过访问修饰符(如`public`、`private`和`protected`)实现封装,保护数据的安全性。 3. **继承**:继承允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为,实现代码的复用。在C++中,使用`:`...
- **类(Class)**:类是C++中定义数据结构和操作数据的方法,是创建对象的模板。在这个项目中,会有一个名为`Student`的类来表示学生,包含姓名、性别和学号等属性以及对这些属性的操作方法。 2. **数据成员...
4. **友元(Friend)**:有时需要打破封装原则,让非成员函数访问类的私有或受保护成员,这时可以声明该函数为友元。友元不是类的成员,但拥有访问类私有和受保护成员的权限。 5. **静态成员**:静态成员属于类本身...