类与对象
类的概念

 
- 一个东西满足这个类的特征 -> 这个东西是这个类的一个实例 -> 实例化
- 共同特点(变量)->构成数据结构
- 归纳行为(函数)->操作数据结构(抽象)
- 可理解为在结构体中加入函数
类的定义

- 看上去像“带函数的结构体”
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模板类,并声明该模板类的一个对象、以及一个指针。
- 不同模板参数产生的模板类,不是同一个类
 
- 创建元素类型为


















