定义类
定义一个类,本质上定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。
类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。
class Box{
public:
double length; // 盒子的长度
double breadth; // 盒子的宽度
double height; // 盒子的高度
};
关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。也可以指定类的成员为 private 或 protected。
定义对象
对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。
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
double volume = 0.0; // 用于存储体积
// box 1 详述
Box1.height = 5.0;
Box1.length = 6.0;
Box1.breadth = 7.0;
// box 1 的体积
volume = Box1.height * Box1.length * Box1.breadth;
cout << "Box1 的体积:" << volume <<endl; //210
return 0;
}
类访问修饰符
数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。
类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。
类成员类型 | 描述 |
---|---|
public 成员 | 公有成员在程序中类的外部是可访问的 |
private 成员 | 私有成员在类的外部是不可访问的。只有类和友元函数可以访问私有成员 |
protected 成员 | 保护成员与私有成员十分相似,但保护成员在派生类(子类)中是可访问的。 |
继承有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
继承类型 | 描述 |
---|---|
public继承 | 基类 public, protected, private 成员的访问属性在派生类中分别变成:public, protected, private |
protected继承 | 基类 public, protected, private 成员的访问属性在派生类中分别变成:protected, protected, private |
private 继承 | 基类 public, protected, private 成员的访问属性在派生类中分别变成:private, private, private |
但无论哪种继承方式,上面两点都没有改变:
1.private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
2.protected 成员可以被派生类访问。
构造函数 & 析构函数
类的构造函数是一种特殊的函数,在创建一个新的对象时调用。
类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。
构造函数
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。
默认的构造函数没有任何参数,但构造函数也可以带有参数。这样在创建对象时就会给对象赋初始值。
class Line{
public: Line(); // 这是构造函数
private: double length;
};
Line::Line(void){
cout << "Object is being created" << endl;
}
//带参构造函数
class Line{
public:Line(double len); // 这是构造函数
private:double length;
};
Line::Line( double len){
cout << "Object is being created, length = " << len << endl;
length = len;
}
构造函数的调用顺序
a.先调用基类构造函数
b.按声明顺序初始化数据成员
c.最后调用自己的构造函数。
使用初始化列表来初始化字段
可以将构造函数写成这样,与上面等效
Line::Line( double len): length(len){
cout << "Object is being created, length = " << len << endl;
}
假设有一个类 C,具有多个字段 X、Y、Z 等需要进行初始化