C++ 学习笔记(二)
第五章. 函数、函数与运算符的重载
C++程序允许两种函数说明语句的形式,分别称为函数原型(或函数声明)和函数定义。
属性说明:可缺省,一般可以是下面的关键字之一:inline、static、virtual、friend 等。
inline :表示该函数为内联函数。
static :表示该函数为静态函数。
virtual:表示该函数为虚函数。
friend :表示该函数为某类(class)的友元函数。
函数的调用重载与其他语言相同,但在C++中可以重载操作符而Java中不能。内联(inline)函数的设置是C++不同于C 的特征之一。虽然这些带参数的宏定义的功能与应的内联函数基本一致,但仍然是有差别的,宏定义中的参数和计算结果没有类型说明,编译时不可能进行类型检查,是不安全的,更无法区分赋值参数和引用参数,很容易出错。因此,在C++语言的编程中,当某段程序短小而又经常被重复使用时,建议采用内联函数,尽量少用宏定义实现。
操作符重载实例:
假设程序中定义了一个枚举类型的 Bool类型:
enum Bool {FALSE, TRUE};
Bool operator + (Bool a , Bool b)
{
if ( (a == FALSE) && (b == FALSE) ) return FALSE;
return TRUE;
}
第六章. 指针、引用与动态内存分配
指针(Pointer)类型的变量说明格式为:<类型名>*<指针变量名>=<初值>; 与C相同 ,NULL = 0。
new 和delete 的使用,也是C++语言优于C 语言的特征之一。
new 运算是程序中除了变量说明之外,又一种生成变量的方法,不过用new 生成的变量为无名动态变量,它回的是一个该类型的指针值,程序通过指针对这个变量进行操作,例如:
int *pi,a=5;
char *pc;
float *pf, f=3.0;
pi=new int; //生成一动态int 类型变量
pc=new char[4]; //生成动态char 类型数组
pf=new float (4.7); //生成动态float 类型变量且赋初值
都要指出变量的类型,类型名要放在 new 之后。
都可以赋初值,不是用“=<初值>”的方式而是用括号“(<初值>)”的方式。
都可以说明为数组,加数组运算符[ ]。
动态变量没有变量名,需用指针变量接收到它的地址后,通过指针运算符“*”进行操作。
delete 运算用来撤销或释放由new 生成的动态变量,例如:
delete pi; //释放pi 指向的动态int 变量
delete pf; //释放pf 指向的动态float 变量
delete [ ] pc; //释放pc 指向的动态数组
动态变量与一般变量的主要区别就是它可以在程序运行过程中任意被撤销。而一般变量则必须在其所说明的程序块结束时自动撤销。C++还保留了从C 语言中继承下来的用于动态存储分配的malloc( )、free( )等标准函数,它们已经可以被new 和delete 运算所取代。
在 C++ 中 new 的结果是指针与 Java C# 不同。
第七章. 类 与 对 象
类(class)的概念是面向对象程序设计的核心概念。把数据和对象的操作和处理封装在一个程序模块中的方法,可以说是人们积累几十年程序设计实践的经验总结。把程序以类的形式组织成若干模块,使其获得了最佳的结构特性,类的概念的引入使程序设计技术发生了革命性的转变。
通过类与对象而实现的面向对象程序设计的三大特征是:封装性、继承性、多态性。将逻辑上相关的数据与函数进行封装。封装所进行的“信息隐蔽”可以减少对象间的联系,提高软件的模块化程度,增强代码的重用性。
类的继承使派生类可从其基类那里继承已有的属性(数据)和行为特征(方法),从而简化人们对事物及其相关性的描述。
多态性是通过对函数和运算符进行重载以及通过在基类及其派生类间对虚函数进行使用来具体体现的。多态性可使程序更好地反映客观世界的多态特征。
C++中的类后面要加 “;”。
一个类说明的常用格式为:
class <自定义类类型名> {
private:
<各私有成员说明>;
public:
<各公有成员说明>;
}; // 注:C++将函数的公开度声明放在类中而不是每一个函数前面。
C++的函数可在声明后直接实现也可在其他地方实现,实现方法float point::gety({return ycoord;}。
(*p).f() 等价于 p->f()。
C++中 this 是指针。
C++的构造函数不是在 new 后使用 而是 只是在声明变量的时候使用。例: point p(2.0,1.5)。
关于友元,我很讨厌不看了。书上如是说:“例如一个家庭的财务,总是要通过防盗门、门锁、保险柜等措施不让外人接触,但在特殊情况下,例如全家出游,又需检查煤气,水,电情况,就不得不把钥匙交给可依赖的邻居,这位邻居就是友元。友元的概念有点类似于结构程序设计语言中的goto 语句,虽有必要设置,但不宜多用。”
C++语言为类和对象之间的联系提供了许多方式,主要有:
(1)一个类的对象作为另一个类的成员。
(2)一个类的成员函数作为另一个类的友元。
(3)一个类定义在另一个类的说明中,即类的嵌套。
(4)一个类作为另一个类的派生类。
第八章。继承与派生
C++可以多继承,没有接口的概念,有多种不同的继承方式。
class<类名>:<基类说明表> {
private:
<私有成员表>
protected:
<保护成员表>
public:
<公有成员表>
};
第九章。模 板
类似 C#中的泛型 Java 在 jdk 1.5 后出现。
在 C++程序中定义一个函数模板时,只是简单地在上述“综合”出的具有类型参数T 的函数之前增加“template<class T>”,以表示下面要定义一个模板,它具有的可变化类型参数名字叫做T(当然也可叫做别的,是一个标识符)。
下面是C++程序中函数模板定义的一个实例:
template<class T>T max (T a, T b) {
if(a>b) return a;
else return b;
}
下面是C++程序中类模板定义的一个实例:
template <class T, int i> class TestClass {
...
}
例如,对具有一个类型参数 T 和一个普通参数i 的类模板TestClass,在类体外定义其成员函数getData 的形式如下:
template <class T,int i> T TestClass<T,i>::getData(int j) {
... //成员函数的函数体
};
此次到此结束,洗洗睡了,剩下的日后再看吧。。。。。