类的定义
类是C++核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。
定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包含了什么,以及可以在这个对象上执行哪些操作。
类定义是以关键字class开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如我们使用关键字class定义Box数据类型。
class Box
{
public:
double length; // 盒子的长度
double breadth; // 盒子的宽度
double height; // 盒子的高度
};
C++对象
类提供了对象的蓝图,所以基本上,对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类Box的两个对象
Box Box1; // 声明 Box1,类型为 Box
Box Box2; // 声明 Box2,类型为 Box
对象Box1和Box2都有它们各自的数据成员。
访问数据成员
类的对象的公共数据成员可以使用直接成员访问运算符(.)来访问。
#include <iostream>
using namespace std;
class Box
{
public:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
int main( )
{
Box Box1; // 声明 Box1,类型为 Box
Box Box2; // 声明 Box2,类型为 Box
double volume = 0.0; // 用于存储体积
// box 1 详述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 2 详述
Box2.height = 10.0;
Box2.length = 12.0;
Box2.breadth = 13.0;
// box 1 的体积
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Box1 的体积:" << volume <<endl;
// box 2 的体积
volume = Box2.height * Box2.length * Box2.breadth;
cout << "Box2 的体积:" << volume <<endl;
return 0;
}
运行结果
Box1 的体积:210
Box2 的体积:1560
类的继承
面向对象程序设计中最重要的一个概念就是继承,继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易,这样做,也达到了重用代码功能和提高执行时间的效果。
当创建一个类时,你不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。
一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:
class derived-class: access-specifier base-class
其中,访问修饰符access-specifier是public,protected或private其中的一个,base-class是之前定义过的某个类的名称。如果未使用访问修饰符access-specifier,则默认为private.每个基类之间用逗号分隔。
#include <iostream>
using namespace std;
// 基类 Shape
class Shape
{
public:
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
// 基类 PaintCost
class PaintCost
{
public:
int getCost(int area)
{
return area * 70;
}
};
// 派生类
class Rectangle: public Shape, public PaintCost//派生类Rectangle同时继承了两个类Shape和PaintCost
{
public:
int getArea()
{
return (width * height);
}
};
int main(void)
{
Rectangle Rect;
int area;
Rect.setWidth(5);
Rect.setHeight(7);
area = Rect.getArea();
// 输出对象的面积
cout << "Total area: " << Rect.getArea() << endl;
// 输出总花费
cout << "Total paint cost: $" << Rect.getCost(area) << endl;
return 0;
}
一个指向C++类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符->,就像访问指向结构的指针一样。与所有的指针一样,必须在使用指针之前,对指针进行初始化。
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
//static int number;
int number;
string name;
//public:
Student()
{
}
void set(string str)
{
name=str;
number++;//调用静态数据成员
}
void print()//类成员函数print()
{
std::cout<<name<<":The number of the students is"<<number<<"numbers."<<endl;//调用静态数据成员
}
};
int main()
{
Student *s1;//对于类Student,定义了一个指针,是一个内存地址,指向内存中存放的的类对象(包括一些成员变量所赋的值,在定义s1的时候并没有分配内存,只有执行new后才会分配内存,且为内存堆。
//类的指针,用的是内存堆,是个永久变量,除非你释放它,需要用new运算符分配内存
s1=new Student();//注意,用new,一定要delete
s1->set("tom");//指针用->操作符引用成员
Student s2;//对于类Student,定义了一个对象,利用类的构造函数在内存中分配一块内存(包括一些成员变量所赋的值)
//类的对象,用的是内存栈,是个局部的临时变量
s2.set("wang");//对象引用成员,用.操作符
s1->print();
s2.print();
return 0;
}
C++的精髓之一就是多态性,只有指针或者引用可以达到多态,对象不行。
用指针,第一可以实现多态,第二,在函数调用时,传指针参数,不管你的对象或结构参数多么庞大,用指针,传过去的就是4个字节,如果用对象,参数传递占用的资源就大了。