类与对象
类的概念
- 一个东西满足这个类的特征 -> 这个东西是这个类的一个实例 -> 实例化
- 共同特点(变量)->构成数据结构
- 归纳行为(函数)->操作数据结构(抽象)
- 可理解为在结构体中加入函数
类的定义
- 看上去像“带函数的结构体”
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
模板类,并声明该模板类的一个对象、以及一个指针。 - 不同模板参数产生的模板类,不是同一个类
- 创建元素类型为