恭喜你学习完C语言与数据结构的有关内容,现在让我们开始进行对C++的学习吧~
💝💝💝如果你对C语言或数据结构还存在疑惑,欢迎观看我之前的作品
目录
一、引言
二、类的定义
在 C++ 中,类是一种用户自定义的数据类型,它将数据和对数据进行操作的函数封装在一起。类的定义通常包括以下部分:
class ClassName {
public:
// 成员函数声明
void function1();
int function2(int param);
private:
// 数据成员声明
int data1;
double data2;
};
1.访问限定符
public
:声明在public
部分的成员可以在类的外部被访问。通常,成员函数会被定义为public
,以便外部代码能够调用它们来操作类的数据。private
:声明在private
部分的成员只能在类的内部被访问。数据成员通常被定义为private
,以保护数据的完整性和安全性,防止外部代码直接修改数据。- 还有
protected
访问限定符,用于在继承中控制成员的访问权限,本文暂不深入讨论。
2.成员函数
- 成员函数是类中定义的函数,它们可以访问类的成员数据并对其进行操作。成员函数可以在类内定义,也可以在类外定义。在类外定义成员函数时,需要使用类名和作用域解析运算符
::
。 - 例如:
void ClassName::function1() {
// 函数体实现
}
int ClassName::function2(int param) {
// 函数体实现,可能会使用类的数据成员
data1 += param;
return data1;
}
3.数据成员
- 数据成员是类中用于存储数据的变量。它们可以是各种数据类型,如整数、浮点数、字符等,也可以是其他类的对象。数据成员的初始化可以在类的构造函数中进行,也可以在定义时进行默认初始化。
三、对象的创建和使用
类只是一种定义,要使用类中的数据和函数,需要创建类的对象。对象是类的实例,它具有类所定义的属性和行为。
1.对象的创建
- 可以通过以下方式创建类的对象:
ClassName obj; // 创建一个名为obj的ClassName类的对象
- 也可以使用动态内存分配来创建对象:
ClassName* ptr = new ClassName; // 创建一个指向ClassName类对象的指针
- 在使用动态分配的对象时,需要注意在不需要该对象时使用
delete
运算符释放内存,以避免内存泄漏。
2.访问对象的成员
- 通过对象可以访问类的公共成员函数和数据成员。使用点运算符
.
来访问对象的成员:
obj.function1(); // 调用对象obj的function1成员函数
int result = obj.function2(5); // 调用function2并传入参数5,获取返回值
cout << obj.data1; // 访问对象obj的数据成员data1(假设data1是public的,否则会编译错误)
- 如果是通过指针访问对象的成员,则使用箭头运算符->:
ptr->function1();
result = ptr->function2(3);
cout << ptr->data1;
四、构造函数和析构函数
1.构造函数
- 构造函数是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。构造函数的名称与类名相同,没有返回值类型。
- 可以定义多个构造函数,以实现不同方式的初始化。例如:
class ClassName {
public:
ClassName() {
// 默认构造函数,用于初始化数据成员为默认值
data1 = 0;
data2 = 0.0;
}
ClassName(int val1, double val2) {
// 带参数的构造函数,用于根据传入的参数初始化数据成员
data1 = val1;
data2 = val2;
}
private:
int data1;
double data2;
};
- 创建对象时,会自动调用相应的构造函数。例如:
ClassName obj1; // 调用默认构造函数
ClassName obj2(10, 3.14); // 调用带参数的构造函数
2.析构函数
- 析构函数是在对象被销毁时自动调用的特殊成员函数,用于释放对象所占用的资源。析构函数的名称是在类名前加上波浪线
~
,没有参数和返回值类型。 - 例如:
class ClassName {
public:
~ClassName() {
// 析构函数的实现,可能用于释放动态分配的内存等资源
// 这里假设没有动态分配的内存,只是简单的示例
}
private:
int* ptr; // 假设类中有一个指向整数的指针成员
};
- 当对象超出其作用域或使用
delete
运算符释放动态分配的对象时,析构函数会被自动调用。例如:
{
ClassName obj; // 在这个块内创建对象obj,当块结束时,obj会被销毁,析构函数会被调用
}
ClassName* ptr = new ClassName; // 创建动态分配的对象
//... 使用ptr指向的对象
delete ptr; // 释放对象,析构函数会被调用
五、this 指针
在类的成员函数中,经常会用到this
指针。this
指针是一个指向当前对象的指针,它可以用于区分成员函数中的局部变量和类的成员变量。
例如,在构造函数中:
Car::Car(std::string brand, std::string model, std::string color) {
this->brand = brand;
this->model = model;
this->color = color;
speed = 0;
}
这里的this->brand
、this->model
和this->color
分别表示当前对象的brand
、model
和color
成员变量。如果没有this
指针,编译器将无法确定这些变量是类的成员变量还是局部变量。
this
指针还可以用于在成员函数中返回当前对象的引用,这在一些需要连续调用成员函数的场景中很有用。例如:
class Car {
public:
// 其他成员函数和属性
Car& setBrand(std::string brand) {
this->brand = brand;
return *this;
}
Car& setModel(std::string model) {
this->model = model;
return *this;
}
Car& setColor(std::string color) {
this->color = color;
return *this;
}
};
现在,我们可以这样使用:
Car myCar;
myCar.setBrand("Toyota").setModel("Corolla").setColor("Blue");
通过这种方式,我们可以更加方便地对对象进行初始化和设置属性。
六、总结
⭐在后续的文章中,我们将深入探讨类的更多特性和高级用法!
💝💝💝感谢你看到最后,点个赞再走吧!💝💝💝
以下是一个投票,欢迎你参与,让我们一起了解大家对C++类与对象的认知和兴趣程度: