西嘎嘎学习 - C++ 类 对象 - Day 8
1 什么是类
类是一种用户自定义的数据类型,它将数据(属性)和操作数据的函数(方法)封装在一起。
类可以看作是对象的模板或蓝图,而对象是类的具体实例。
类的定义格式如下:
class ClassName {
private:// 私有成员(默认访问权限)// 通常用于封装数据
public:// 公有成员// 包括构造函数、方法等
};
2 什么是对象
对象是类的一个实例,通过类定义后,可以创建多个对象,每个对象都有自己的数据和行为。
创建对象的语法:
ClassName objectName;
3 类的成员
1.数据成员:用于描述对象的属性。
2.成员函数:用于描述对象的行为或操作。
4 访问权限
默认情况下,类的成员是 private 的
访问权限 | 说明 |
---|---|
public | 公有成员,可以被类的外部访问 |
private | 私有成员,只能在类内部访问 |
protected | 受保护成员,只能在类内部和派生类中访问 |
5 构造函数
构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。
构造函数的规则:
1.构造函数的名称必须与类名相同;
2.构造函数没有返回类型(包括 void);
3.构造函数可以重载(多个构造函数);
4.如果没有定义构造函数,编译器会自动生成一个默认构造函数。
class Student {
private:std::string name;int age;public:// 默认构造函数Student() {name = "UnKnown";age = 0;}// 带参数的构造函数Student(std::string n, int a) {name = n;age = a;}void display() {std::cout << "Name: " << name << ", Age: " << age << std::endl;}
};
6 析构函数
析构函数是另一种特殊的成员函数,用于在对象销毁时执行清理工作(如释放内存)。
析构函数的规则:
1.析构函数的名称是 ~ 加类名;
2.没有参数;
3.没有返回类型;
4.每个类只能有一个析构函数。
class Student {
public:Student() {std::cout << "Constructor called." << std::endl;}~Student() {std::cout << "Destructor called." << std::endl;}
};
7 成员函数的定义方式
成员函数可以在类内部定义(内联),也可以在类外部定义(外联)。
内联定义:
class Student {
public:void sayHello() {std::cout << "Hello! " << std::endl;}
};
外联定义:
class Student {
public:void sayHello();
};void Student::sayHello() {std::cout << "Hello!" << std::endl;
}
8 this 指针
this 是一个隐含的指针,指向调用该成员函数的对象,它在类的成员函数中自动传递。
class Student {
private:std::string name;public:void setName(std::string n) {this -> name = n; // this -> name 表示当前对象的 name 成员}
};
9 静态成员
静态成员属于整个类,而不是类的某个对象,所有对象共享同一个静态成员。
静态数据成员:
class Student {
private:static int count; // 静态数据成员public:Student() {count++;}static int getCount() {return count;}
};//静态成员必须在类外初始化
int Student::count = 0;
静态成员函数:
1.只能访问静态成员;
2.不能使用 this 指针;
3.可以通过类名直接调用。
10 对象数组与指针
对象数组:
Student student[3]; // 创造 3 个 Student 对象
对象指针:
Student* p = new Student(); // 动态创建对象
delete p; // 释放内存
11 类的封装
封装是将数据和操作数据的函数绑定在一起,并对外隐藏实现细节,通过将数据设为 private,并通过 public 的方法来访问和修改数据,可以实现封装。
class BankAccount {
private:double balance;public:void deposit(double amount) {if (amount > 0){balance += amount;}}void withdraw (double amount){if (amount > 0 && amount <= balance){balance -= amount;}}double getBalance() const{return balance;}
};
12 类的继承
继承是面向对象编程的另一个核心概念,它允许一个类(子类)继承另一个类(父类)的属性和方法。
class Animal {
public:void eat() {std::cout << "Eating..." << std::endl;}
};class Dog : public Animal {
public:void bark(){std::cout << "Barking..." << std::endl;}
};
13 类的多态
多态是指同一个接口可以有不同的实现方式,C++ 中通过虚函数(virtual)和继承实现多态。
class Shape {
public:virtual void draw() {std::cout << "Drawing a shape ..." << std::endl;}
};class Circle : public Shape {
public:void draw() override{std::cout << "Drawing a circle ..." << std::endl;}
};
14 类的友元
友元函数或类可以访问另一个类的私有和保护成员。
class MyClass {
private:int secret;public:friend void showSecret (MyClass obj); // 声明友元函数
};void showSecret (MyClass obj)
{std::cout << "Secret: " << obj.secret << std::endl;
}
15 类的运算符重载
可以重载运算符,使其适用于自定义类型。
class Complex {
private:double real, imag;public:Complex (double r = 0, double i = 0) : real(r), imag(i) {}Complex operator+ (const Complex& other ) {return Complex (real + other.real, imag + other.imag);}void display(){std::cout << real << " + " << imag << " i " << std:: endl;}
};
16 类的常量成员
可以使用 const 修饰成员函数,表示该函数不会修改对象的状态。
class Student {
private:std::string name;public:std::string getName() const{return name;}
};
17 类的内联成员函数
在类中定义的成员函数默认是内联的,可以提高程序运行效率。
18 类的默认成员函数
C++ 编译器会自动为类生成以下默认成员函数:
1.默认构造函数。
2.拷贝构造函数。
3.拷贝赋值运算符。
4.移动构造函数。
5.移动赋值运算符
6.析构函数
19 类的拷贝构造函数
拷贝构造函数用于一个对象初始化另一个对象。
class Student {
public:Student (const Student& other){// 拷贝 other 的数据}
};
20 类的赋值运算符重载
用于将一个对象赋值给另一个对象。
class Student {
public:Student& operator=(const Student& other){if (this != &other){// 拷贝 other 的数据}return *this;}
};
21 总结
概念 | 说明 |
---|---|
类 | 用户自定义的数据类型,封装数据和方法 |
对象 | 类的实例 |
构造函数 | 初始化对象 |
析构函数 | 清理资源 |
封装 | 隐藏实现细节 |
继承 | 子类继承父类 |
多态 | 同一接口不同实现 |
友元 | 访问私有成员 |
运算符重载 | 自定义运算符行为 |
静态成员 | 属于类而非对象 |
this 指针 | 指向当前对象 |