[Reprint]C++友元函数与拷贝构造函数详解

 

这篇文章主要介绍了C++友元函数与拷贝构造函数,需要的朋友可以参考下
 

一、友元函数

1.友元函数概述:

(1)友元函数是定义在一个类外的普通函数。
友元函数和普通函数的定义一样;在类内必须将该普通函数声明为友元。

(2)友元函数不是成员函数。
不能通过对象来调用,而是直接调用;友元函数可以访问类的公有、受保护以及私有成员,但是必须通过对象、对象指针或者对象引用来访问。

2.友元函数的声明:

friend 返回值类型 函数名(参数表);
在类中只需要将这个声明放置在公有部分即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
class Point
{
double x, y;
public :
Point(){x = 0.0; y = 0.0;}
Point( double xx, double yy){x = xx; y = yy;}
friend double distance(Point, Point); //将distance函数声明为友元函数
};
double distance(Point my1, Point my2)
{
return sqrt ((my1.x-my2.x)*(my1.y-my2.y));
}

3.友元函数在定义时即普通函数的定义,前面不加friend,在类内声明时,必须加friend.
在友元函数生效的对象的作用范围内可以访问私有、公有以及受保护成员。
main函数不能声明为类的友元函数,main函数只能做主调不能做被调。

二、拷贝构造函数:

1.拷贝构造函数概述:

(1)拷贝构造函数是一个构造函数,它属于类的成员函数(普遍定义为public);和类名同名但是无返回值;创建对象时,若该对象的初始化值是另一个同类对象时(赋值不调用)调用。

(2)拷贝构造函数的声明

类名::类名(类名 &对象引用名); 或另一种声明方式
类名::类名(const 类名 &对象引用名)
注意:拷贝构造函数只有一个参数,而且参数必须是一个对象的引用;每个类其实都要有一个拷贝构造函数,若没有显式的定义,那么系统会自动定义并且设置其属性为公有。

2.示例程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Point
{
int x, y;
public :
Point(){x = 0; y = 0;}
Point( int xx, int yy){x = xx; y = yy;}
Point(Point &pf){x = pf.x; y = pf.y;} //拷贝构造函数的声明可以省略第一个类名和::
};
Point(Point &pf)
{
* this = pf; //完成拷贝构造
}
int main()
{
Point p1; //调用无参构造
Point p2(3, 4); //调用构造
Point p3(p2); //调用拷贝构造
}

注意:如果没有使用const修饰,那么出现pf.x=8这种语句是合法的,但是加了const之后是非法的。另外,引用完pf也会释放。

转载于:https://www.cnblogs.com/hualiu0/p/5661709.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
reprint 使用说明 本人长期使用delphi做数据库的开发,报表控件使用Quickrpt,在打印上经常遇到一些问题,于是自己经常编写一部分打印的程序,经过总结开发了这个控件。 本控件可打印 datasource,dbgrid,stringgrid. 一 、控件属性: 1、colstitle 设置报表的列标题属性 (1)alignment 列标题对齐方式。 (2)font 列标题字体 (3)print 设置是否打印列标题 (4)rowspace 列标题行的高度 2、datasource 选择要打印的datasource 3、dbgrid 选择要打印的dbgrid 4、stringgrid 选择要打印的stringgrid 5、detail 设置要打印的明细数据属性 (1)arrange 设置明细字段排列方向 Horizontal 横向打印(默认的一般打印) Vertical 竖向打印(字段竖向排列适合打印字段内容较长的报表如“会议纪录”) (2)aotureturn 打印明细字段时,如果字段超过列的宽度是否允许自动换行 (3)colsline 设置竖线属性引用tpen类 (4)footer 设置明细尾 (5)frame 设置明细边框属性引用tpen类 (6)head 设置明细头同footer (7)rowsline 设置横线属性引用tpen类 (8)rowspace 设置明细行的高度 (9)top 明细与标题的距离 6、page 设置纸张的上下左右边距 7、pagefooter 设置页脚同明细尾 8、pageheader 设置页眉同页脚 9、printobject 选择要打印的对象 (datasource 、dbgrid、 stringgrid ) 10、title 设置标题类页眉、页脚 二 、控件方法: (1) preview 预览 (2) print 打印 (3) SaveToFile() 保存为报表文件 (4) SaveToStream() 保存为流(然后就可把整个报表存到数据库了很方便哦! ~_~) (5) PrintFile() 打印报表文件 (6) PrintStream() 打印流(流的数据库存取就不用多说了吧) (7) PreviewFile() 预览文件 (8) PreviewStream() 预览流 (9) OptionToStream() 报表的属性保存为流 (10) OptionFromStream() 从流中得到报表属性 三、 控件事件: AfterPrint 打印后 BeforePrint 打印前 (本来很多事件,但没有预览,后来加上预览以及一些方法后实现很困难就去掉了!) 四、注意事项 (1) text 属性,输入“¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;”打印页码值,如果想打印页码可输入“第¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;#¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;页” 输入“¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RecordCount¦;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;”打印 记录数 (2) 不同的打印机,打印和预览效果可能有一点点不同(保证数据打印完全正确一致)。本人用一台针式和一台激光打印机做测试,开始差别较大后经过调试基本一致,不知其他打印机如何。 就这些个吧基本满足了我的软件开发需要,解决了很多问题,关键是做报表省了很大力气,当然了很复杂的报表还是要其它报表控件来解决。如果有其他问题或好的建议可与我联系。 程序设计:吴进昊 E-mail :jinhaowu@hotmail.com qq :54254770 2003.01.03

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值