Appearance
C++ 类 & 对象
类(class)是 C++ 中面向对象编程的核心概念,它是一种用户自定义的数据类型,封装了数据(成员变量)和操作数据的方法(成员函数)。
1. 类的定义
1.1 基本语法
cpp
class 类名 {
private:
// 私有成员变量和成员函数
protected:
// 保护成员变量和成员函数
public:
// 公有成员变量和成员函数
};示例
cpp
#include <iostream>
class Student {
private:
std::string name;
int age;
float gpa;
public:
// 构造函数
Student() : name(""), age(0), gpa(0.0f) {}
// 带参数的构造函数
Student(std::string name, int age, float gpa) : name(name), age(age), gpa(gpa) {}
// 成员函数
void set_name(std::string name) {
this->name = name;
}
std::string get_name() {
return name;
}
void set_age(int age) {
this->age = age;
}
int get_age() {
return age;
}
void set_gpa(float gpa) {
this->gpa = gpa;
}
float get_gpa() {
return gpa;
}
void print() {
std::cout << "姓名: " << name << std::endl;
std::cout << "年龄: " << age << std::endl;
std::cout << "GPA: " << gpa << std::endl;
}
};
int main() {
// 创建对象
Student student1;
student1.set_name("张三");
student1.set_age(20);
student1.set_gpa(3.8f);
student1.print();
std::cout << std::endl;
// 使用带参数的构造函数创建对象
Student student2("李四", 21, 3.5f);
student2.print();
return 0;
}2. 访问修饰符
2.1 public
public成员可以在任何地方被访问。
cpp
#include <iostream>
class Point {
public:
int x;
int y;
void print() {
std::cout << "x = " << x << ", y = " << y << std::endl;
}
};
int main() {
Point point;
point.x = 10;
point.y = 20;
point.print();
return 0;
}2.2 private
private成员只能在类内部被访问。
cpp
#include <iostream>
class Point {
private:
int x;
int y;
public:
void set_x(int x) {
this->x = x;
}
void set_y(int y) {
this->y = y;
}
void print() {
std::cout << "x = " << x << ", y = " << y << std::endl;
}
};
int main() {
Point point;
point.set_x(10);
point.set_y(20);
point.print();
return 0;
}2.3 protected
protected成员可以在类内部和派生类中被访问。
cpp
#include <iostream>
class Base {
protected:
int x;
public:
Base() : x(0) {}
void set_x(int x) {
this->x = x;
}
int get_x() {
return x;
}
};
class Derived : public Base {
public:
void increment_x() {
x++; // 可以访问 protected 成员
}
};
int main() {
Derived derived;
derived.set_x(10);
derived.increment_x();
std::cout << "x = " << derived.get_x() << std::endl;
return 0;
}3. 构造函数和析构函数
3.1 构造函数
构造函数是一种特殊的成员函数,用于初始化对象。
cpp
#include <iostream>
class Student {
private:
std::string name;
int age;
public:
// 默认构造函数
Student() : name(""), age(0) {
std::cout << "默认构造函数被调用" << std::endl;
}
// 带参数的构造函数
Student(std::string name, int age) : name(name), age(age) {
std::cout << "带参数的构造函数被调用" << std::endl;
}
// 拷贝构造函数
Student(const Student& other) : name(other.name), age(other.age) {
std::cout << "拷贝构造函数被调用" << std::endl;
}
void print() {
std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
}
};
int main() {
Student student1;
Student student2("张三", 20);
Student student3 = student2;
student1.print();
student2.print();
student3.print();
return 0;
}3.2 析构函数
析构函数是一种特殊的成员函数,用于清理对象。
cpp
#include <iostream>
class Student {
private:
std::string name;
int age;
public:
Student(std::string name, int age) : name(name), age(age) {
std::cout << "构造函数被调用" << std::endl;
}
~Student() {
std::cout << "析构函数被调用" << std::endl;
}
void print() {
std::cout << "姓名: " << name << ", 年龄: " << age << std::endl;
}
};
int main() {
Student student("张三", 20);
student.print();
return 0;
}4. 成员函数
4.1 在类内部定义成员函数
cpp
#include <iostream>
class Point {
private:
int x;
int y;
public:
Point(int x, int y) : x(x), y(y) {}
void print() {
std::cout << "x = " << x << ", y = " << y << std::endl;
}
};
int main() {
Point point(10, 20);
point.print();
return 0;
}4.2 在类外部定义成员函数
cpp
#include <iostream>
class Point {
private:
int x;
int y;
public:
Point(int x, int y);
void print();
};
Point::Point(int x, int y) : x(x), y(y) {}
void Point::print() {
std::cout << "x = " << x << ", y = " << y << std::endl;
}
int main() {
Point point(10, 20);
point.print();
return 0;
}5. this 指针
this指针是指向当前对象的指针。
cpp
#include <iostream>
class Point {
private:
int x;
int y;
public:
Point(int x, int y) {
this->x = x;
this->y = y;
}
Point& set_x(int x) {
this->x = x;
return *this;
}
Point& set_y(int y) {
this->y = y;
return *this;
}
void print() {
std::cout << "x = " << x << ", y = " << y << std::endl;
}
};
int main() {
Point point(0, 0);
point.set_x(10).set_y(20);
point.print();
return 0;
}6. 静态成员
6.1 静态成员变量
静态成员变量是所有对象共享的变量。
cpp
#include <iostream>
class Counter {
private:
static int count;
public:
Counter() {
count++;
}
~Counter() {
count--;
}
static int get_count() {
return count;
}
};
int Counter::count = 0;
int main() {
std::cout << "count = " << Counter::get_count() << std::endl;
Counter c1;
std::cout << "count = " << Counter::get_count() << std::endl;
Counter c2;
std::cout << "count = " << Counter::get_count() << std::endl;
{
Counter c3;
std::cout << "count = " << Counter::get_count() << std::endl;
}
std::cout << "count = " << Counter::get_count() << std::endl;
return 0;
}6.2 静态成员函数
静态成员函数只能访问静态成员变量和静态成员函数。
cpp
#include <iostream>
class Math {
public:
static int add(int a, int b) {
return a + b;
}
static int subtract(int a, int b) {
return a - b;
}
static int multiply(int a, int b) {
return a * b;
}
static int divide(int a, int b) {
return a / b;
}
};
int main() {
std::cout << "10 + 20 = " << Math::add(10, 20) << std::endl;
std::cout << "10 - 20 = " << Math::subtract(10, 20) << std::endl;
std::cout << "10 * 20 = " << Math::multiply(10, 20) << std::endl;
std::cout << "20 / 10 = " << Math::divide(20, 10) << std::endl;
return 0;
}7. 友元函数
友元函数可以访问类的私有成员。
cpp
#include <iostream>
class Point {
private:
int x;
int y;
public:
Point(int x, int y) : x(x), y(y) {}
friend void print_point(const Point& point);
};
void print_point(const Point& point) {
std::cout << "x = " << point.x << ", y = " << point.y << std::endl;
}
int main() {
Point point(10, 20);
print_point(point);
return 0;
}8. 示例:综合运用
现在,让我们看一个综合运用各种类和对象特性的例子:
cpp
#include <iostream>
#include <string>
class Student {
private:
std::string name;
int age;
float gpa;
static int count;
public:
// 默认构造函数
Student() : name(""), age(0), gpa(0.0f) {
count++;
}
// 带参数的构造函数
Student(std::string name, int age, float gpa) : name(name), age(age), gpa(gpa) {
count++;
}
// 拷贝构造函数
Student(const Student& other) : name(other.name), age(other.age), gpa(other.gpa) {
count++;
}
// 析构函数
~Student() {
count--;
}
// Setter 方法
void set_name(std::string name) {
this->name = name;
}
void set_age(int age) {
this->age = age;
}
void set_gpa(float gpa) {
this->gpa = gpa;
}
// Getter 方法
std::string get_name() {
return name;
}
int get_age() {
return age;
}
float get_gpa() {
return gpa;
}
// 静态成员函数
static int get_count() {
return count;
}
// 成员函数
void print() {
std::cout << "姓名: " << name << std::endl;
std::cout << "年龄: " << age << std::endl;
std::cout << "GPA: " << gpa << std::endl;
}
// 友元函数
friend void print_student(const Student& student);
};
int Student::count = 0;
void print_student(const Student& student) {
std::cout << "姓名: " << student.name << std::endl;
std::cout << "年龄: " << student.age << std::endl;
std::cout << "GPA: " << student.gpa << std::endl;
}
int main() {
std::cout << "学生数量: " << Student::get_count() << std::endl;
std::cout << std::endl;
// 使用默认构造函数创建对象
Student student1;
student1.set_name("张三");
student1.set_age(20);
student1.set_gpa(3.8f);
std::cout << "学生1:" << std::endl;
student1.print();
std::cout << "学生数量: " << Student::get_count() << std::endl;
std::cout << std::endl;
// 使用带参数的构造函数创建对象
Student student2("李四", 21, 3.5f);
std::cout << "学生2:" << std::endl;
student2.print();
std::cout << "学生数量: " << Student::get_count() << std::endl;
std::cout << std::endl;
// 使用拷贝构造函数创建对象
Student student3 = student2;
std::cout << "学生3:" << std::endl;
student3.print();
std::cout << "学生数量: " << Student::get_count() << std::endl;
std::cout << std::endl;
// 使用友元函数
std::cout << "使用友元函数:" << std::endl;
print_student(student1);
return 0;
}小结
C++ 类和对象包括:
类的定义:
- 基本语法:
class 类名 { ... }; - 成员变量和成员函数
- 基本语法:
访问修饰符:
public:可以在任何地方被访问private:只能在类内部被访问protected:可以在类内部和派生类中被访问
构造函数和析构函数:
- 构造函数:用于初始化对象
- 析构函数:用于清理对象
成员函数:
- 在类内部定义成员函数
- 在类外部定义成员函数
this 指针:
- 指向当前对象的指针
静态成员:
- 静态成员变量:所有对象共享的变量
- 静态成员函数:只能访问静态成员变量和静态成员函数
友元函数:
- 可以访问类的私有成员
关键概念:
- 类:用户自定义的数据类型
- 对象:类的实例
- 构造函数:用于初始化对象
- 析构函数:用于清理对象
- this 指针:指向当前对象的指针
- 静态成员:所有对象共享的成员
- 友元函数:可以访问类的私有成员
掌握类和对象是 C++ 面向对象编程的基础,在后续章节中,我们将学习 C++ 的继承。