注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

snoopyxdy的博客

https://github.com/DoubleSpout

 
 
 

日志

 
 

C++笔记(四)  

2012-11-21 14:29:19|  分类: C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
继续C++的类

1、友元函数
如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为本类的友元函数。友元函数可以访问这个类中的私有成员。

class Time
{public:
Time(int,int,int);
friend void display(Time &); //声明display函数为Time类的友元函数
private: //以下数据是私有数据成员
int hour;
int minute;
int sec;
};

Time∷Time(int h,int m,int s) //构造函数,给hour,minute,sec赋初值
{
hour=h;

minute=m;
sec=s;
}
void display(Time &t) //这是友元函数,形参t是Time类对象的引用
{
cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}
int main( )

Time t1(10,13,56);
display(t1);
return 0; //调用display函数,实参t1是Time类对象
}


由于声明了display是Time类的friend函数,所以display函数可以引用Time中的私有成员hour,minute,sec.


2、类模板

template<class numtype> //声明一个模板,虚拟类型名为numtype
class Compare //类模板名为Compare
{public:
Compare(numtype a,numtype b)
{x=a;y=b;}
numtype max()
{return (x>y)?x:y;}
numtype min()
{return (x<y)?x:y;}
private:
numtype x,y;
};

(1)声明类模板时要增加一行template <class 类型参数名>
(2)原有的类型名int换成虚拟类型参数名numtype。在建立类对象时,如果将实际类型指定为int型,编译系统就会用int取代所有的numtype,如果指定为float型,就用float取代所有的numtype。这样就能实现“一类多用”。


3、重载运算符
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。
重载运算符的函数一般格式如下:
函数类型 operator 运算符名称 (形参表列)
{
对运算符的重载处理 }

例如,想将“+”用于Complex类(复数)的加法运算,函数的原型可以是这样的:

Complex operator+ (Complex& c1,Complex& c2);

在定义了重载运算符的函数后,可以说:
函数operator+重载了运算符+

int operator + (int a,int b)
{return (a+b);}

不能重载的运算符只有5个:
.                  (成员访问运算符)
.*                 (成员指针访问运算符)
∷                (域运算符)
sizeof          (长度运算符)
?:                (条件运算符)


4、派生类
一个类中包含了若干数据成员和成员函数。在不同的类中,数据成员和成员函数是不相同的。但有时两个类的内容基本相同或有一部分相同。利用原来声明的类Student作为基础,再加上新的内容即可,以减少重复的工作量。C++提供的继承机制就是为了解决这个问题。
从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生。类的继承是用已有的类来建立专用类的编程技术。派生类继承了基类的有数据成员和成员函数,并可以对成员作必要的增加或调整。一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。

一个派生类只从一个基类派生,这称为单继承(single inheritance),这种继承关系所形成的层次是一个树形结构。

class Student1: public Student//
声明基类是Student
{public:
void display_1( ) //新增加的成员函数
{
cout<<″age:″<<age<<endl;
cout<<″address:″<<addr<<endl;}
private:
int age; //新增加的数据成员
string addr; //新增加的数据成员
};

class 派生类名:[继承方式]基类名
{
派生类新增加的成员
} ;
继承方式包括:public(公用的),private(私有的)和protected(受保护的),此项是可选的,如果不写此项,则默认为private(私有的)。

5、关于继承
(1
公用继承(
public inheritance)
基类的公用成员和保护成员在派生类中保持原有访
问属性,其私有成员仍为基类私有。
(2)私有继承(private inheritance)基类的公用成员和保护成员在派生类中成了私有成员。其私有成员仍为基类私有。
(3)受保护的继承(protected inheritance)基类的公用成员和保护成员在派生类中成了保护成员,其私有成员仍为基类私有。保护成员的意思是:不能被外界引用,但可以被派生类的成员引用。
class 派生类名:[继承方式]基类名
{
派生类新增加的成员
} ;

6、子对象或内嵌对象 派生类的构造函数
派生类构造函数的任务应该包括3个部分:
(1)对基类数据成员初始化;
(2)对子对象数据成员初始化;
(3)对派生类数据成员初始化。

#include <string>
using namespace std;
class Student//声明基类
{
public: //公用部分
Student(int n, string nam) //基类构造函数
{
num=n;
name=nam;
}
void display( ) //成员函数,输出基类数据成员
{
cout<<"num:"<<num<<endl<<"name:"<<name<<endl;}
protected: //保护部分
int num;
string name;
};
class Student1: public Student //声明公用派生类Student1

{public:
Student1(int n, string nam,int n1, string nam1, int a, string ad):Student(n,nam),monitor(n1,nam1) //派生类构造函数
{
age=a;
addr =ad;
}
void show( )
{
cout<<"This student is:"<<endl;
display(); //输出num和name
cout<<"age:"<<age<<endl; //输出age
cout<<"address:"<<addr<<endl<<endl; //输出addr
}
void show_monitor( ) //成员函数,输出子对象
{
cout<<endl<<"Class monitor is:"<<endl;
monitor.display( ); //调用基类成员函数
}
private: //派生类的私有数据
Student monitor; //定义子对象(班长)

int age;
string addr;

};

int
main( )
{Student1 stud1(10010,"Wang-li",10001,"Li-sun",19,"115 Beijing Road,Shanghai");
stud1.show( ); //输出学生的数据
stud1.show_monitor(); //输出子对象的数据
return 0;
}


运行后输出:
This student is:
num: 10010
name: Wang-li

age: 19
address:115 Beijing Road,Shanghai
Class monitor is:
num:10001
name:Li-sun

程序中派生类构造函数首部如下:

Student1(int n, string nam,int n1, string nam1,int a, string ad):Student(n,nam),monitor(n1,nam1)

在上面的构造函数中有6个形参,前两个作为基类构造函数的参数,第3、第4个作为子对象构造函数的参数,第5、第6个是用作派生类数据成初始化的。

  评论这张
 
阅读(720)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016