[数据结构与算法·C++] 笔记 1.5类与对象
类与对象
类的概念
- 一个东西满足这个类的特征 -> 这个东西是这个类的一个实例 -> 实例化
- 共同特点(变量)->构成数据结构
- 归纳行为(函数)->操作数据结构(抽象)
- 可理解为在结构体中加入函数
类的定义
- 看上去像“带函数的结构体”
class Rectangle {
public:int w, h;int Area() {return w * h;}int Perimeter() {return 2 * (w + h);}void Init(int w_, int h_) {w = w_;h = h_;}
};
使用类
int main( ){int w,h;Rectangle r; // r 是一个对象cin >> w >> h;r.Init( w,h);cout << r.Area() << endl << r.Perimeter();return 0;
}
声明 定义分离
class Rectangle {public:int w, h;int Area(); // 成员函数声明int Perimeter();void Init(int w_, int h_);
};int Rectangle::Area() { return w * h; }
int Rectangle::Perimeter() { return 2 * (w + h); }
void Rectangle::Init(int w_, int h_) {this->w = w_;this->h = h_;
}
- 两个 ’ : ’ 的意思: 定义成员函数
访问权限
class className {//私有属性和函数private://公有属性和函数public://保护属性和函数protected:}
- 在类的成员函数内部,能够访问:
- 当前对象的全部属性、函数;
- 同类其它对象的全部属性、函数
默认函数–构造、析构、复制构造、赋值与取址
- 每个物体都有诞生和消亡–构造函数与析构函数
public:cellphone();~cellphone();
- 可以被复制
cellphone(const cellphone&);cellphone & operator = (const cellphone & );
- 可以取地址
cellphone *operator&();const cellphone*operator&()const;`
private:int electricity;
特殊成员–this指针
- 并非对象的成员,是常量指针
- 每个对象可以使用 this 指针访问自己的地址
- 非 static 成员函数调用时,this 指针为隐式参数
- 用途: 防止自赋值、返回以连续调用
class Complex {float real, imag;
public:Complex* ReturnAddress() {return this;}float ReturnReal() {return this->real; // 等效于 return real}
};
模板类
- 函数模板
- 实际问题中的需要: 对不同类型数据可用的排序函数 sort
- 语法:
template<class T>//T 是任意类型return-type sort(...T...)
- 一个实际的输出函数:
#include <iostream> // 包含必要的头文件template<class T>
void print(const T array[], int size) {for (int i = 0; i < size; i++) {std::cout << array[i] << " "; // 输出每个元素后加一个空格}std::cout << std::endl; // 在打印完所有元素后换行
}int main() {int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; // 初始化数组print(a, 10); // 调用 print 函数打印数组return 0;
}
- 类模板
- 为了多快好省地定义出一批相似的类, 可以定义类模板, 然后由类模板生成不同的类
- 数组是一种常见的数据类型,元素可以是
- 整数
- 字符串
- …
- 类模板的定义
#include <stdexcept> // 用于抛出异常template <class T>
class Carray {T *ptrElement;int size;public:Carray(int length) : size(length), ptrElement(nullptr) {if (length > 0) {ptrElement = new T[length];}}~Carray() {delete[] ptrElement;}int len() const {return size;}void setElement(T arg, int index) {if (index >= 0 && index < size) {ptrElement[index] = arg;} else {throw std::out_of_range("Index out of range");}}T getElement(int index) const {if (index >= 0 && index < size) {return ptrElement[index];} else {throw std::out_of_range("Index out of range");}}
};// 在这里提供成员函数的定义(如果它们在类模板外部)
// 注意:由于是模板,成员函数的定义通常放在头文件中
- 使用类模板时必须声明对象
Carray<int> arrayInt(50),*ptrArrayInt;
- 创建元素类型为
int
的Carray
模板类,并声明该模板类的一个对象、以及一个指针。 - 不同模板参数产生的模板类,不是同一个类
- 创建元素类型为