diff --git a/docs/home.md b/docs/home.md index 5bfbeb4d..7195abef 100644 --- a/docs/home.md +++ b/docs/home.md @@ -6,4 +6,5 @@ sidebar_position: 1 # Home -记录整理归纳平时学习笔记 ✍✍✍ \ No newline at end of file +记录整理归纳平时学习笔记 ✍✍✍ + diff --git a/docs/开发/C++/面对对象.md b/docs/开发/C++/面对对象.md new file mode 100644 index 00000000..4a95092b --- /dev/null +++ b/docs/开发/C++/面对对象.md @@ -0,0 +1,779 @@ +--- +id: 面对对象 +title: 面对对象 +sidebar_position: 5 +data: 2022年5月26日 +--- + +C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。 + +类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。 + +## 类 + +类定义是以关键字 **class** 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。 + +### 定义 + +```cpp +class Box +{ + public: + double length; // 盒子的长度 + double breadth; // 盒子的宽度 + double height; // 盒子的高度 +}; +``` + +### 创建 + +对象 Box1 和 Box2 拥有独立的数据成员。 + +```cpp +Box Box1; // 声明 Box1,类型为 Box +Box Box2; // 声明 Box2,类型为 Box +``` + +### 实例 + +类的对象的公共数据成员可以使用直接成员访问运算符 (.) 来访问。 + +```cpp +#include + +using namespace std; + +class Box +{ + public: + double length; // 长度 + double breadth; // 宽度 + double height; // 高度 +}; + +int main( ) +{ + Box Box1; // 声明 Box1,类型为 Box + Box Box2; // 声明 Box2,类型为 Box + double volume = 0.0; // 用于存储体积 + + // box 1 详述 + Box1.height = 5.0; + Box1.length = 6.0; + Box1.breadth = 7.0; + + // box 2 详述 + Box2.height = 10.0; + Box2.length = 12.0; + Box2.breadth = 13.0; + + // box 1 的体积 + volume = Box1.height * Box1.length * Box1.breadth; + cout << "Box1 的体积:" << volume < + +using namespace std; + +class Line +{ + public: + void setLength( double len ); + double getLength( void ); + Line(); // 这是构造函数 + + private: + double length; +}; + +// 成员函数定义,包括构造函数 +Line::Line(void) +{ + cout << "Object is being created" << endl; +} + +void Line::setLength( double len ) +{ + length = len; +} + +double Line::getLength( void ) +{ + return length; +} +// 程序的主函数 +int main( ) +{ + Line line; + + // 设置长度 + line.setLength(6.0); + cout << "Length of line : " << line.getLength() < + +using namespace std; + +class Line +{ + public: + int getLength( void ); + Line( int len ); // 简单的构造函数 + Line( const Line &obj); // 拷贝构造函数 + ~Line(); // 析构函数 + + private: + int *ptr; +}; + +// 成员函数定义,包括构造函数 +Line::Line(int len) +{ + cout << "调用构造函数" << endl; + // 为指针分配内存 + ptr = new int; + *ptr = len; +} + +Line::Line(const Line &obj) +{ + cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl; + ptr = new int; + *ptr = *obj.ptr; // 拷贝值 +} + +Line::~Line(void) +{ + cout << "释放内存" << endl; + delete ptr; +} +int Line::getLength( void ) +{ + return *ptr; +} + +void display(Line obj) +{ + cout << "line 大小 : " << obj.getLength() < + +using namespace std; + +class Line +{ + public: + void setLength( double len ); + double getLength( void ); + Line(); // 这是构造函数声明 + ~Line(); // 这是析构函数声明 + + private: + double length; +}; + +// 成员函数定义,包括构造函数 +Line::Line(void) +{ + cout << "Object is being created" << endl; +} +Line::~Line(void) +{ + cout << "Object is being deleted" << endl; +} + +void Line::setLength( double len ) +{ + length = len; +} + +double Line::getLength( void ) +{ + return length; +} +// 程序的主函数 +int main( ) +{ + Line line; + + // 设置长度 + line.setLength(6.0); + cout << "Length of line : " << line.getLength() < + +using namespace std; + +class Box +{ + public: + double length; // 长度 + double breadth; // 宽度 + double height; // 高度 + + double getVolume(void) + { + return length * breadth * height; + } + + // 成员函数声明 + void setLength( double len ); + void setBreadth( double bre ); + void setHeight( double hei ); +}; + +// 成员函数定义 +void Box::setLength( double len ) +{ + length = len; +} + +void Box::setBreadth( double bre ) +{ + breadth = bre; +} + +void Box::setHeight( double hei ) +{ + height = hei; +} + +// 程序的主函数 +int main( ) +{ + Box Box1; // 声明 Box1,类型为 Box + Box Box2; // 声明 Box2,类型为 Box + double volume = 0.0; // 用于存储体积 + + // box 1 详述 + Box1.setLength(6.0); + Box1.setBreadth(7.0); + Box1.setHeight(5.0); + + // box 2 详述 + Box2.setLength(12.0); + Box2.setBreadth(13.0); + Box2.setHeight(10.0); + + // box 1 的体积 + volume = Box1.getVolume(); + cout << "Box1 的体积:" << volume < + +using namespace std; + +class Box +{ + double width; +public: + friend void printWidth( Box box ); + void setWidth( double wid ); +}; + +// 成员函数定义 +void Box::setWidth( double wid ) +{ + width = wid; +} + +// 请注意:printWidth() 不是任何类的成员函数 +void printWidth( Box box ) +{ + /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */ + cout << "Width of box : " << box.width < + +using namespace std; + +inline int Max(int x, int y) +{ + return (x > y)? x : y; +} + +// 程序的主函数 +int main( ) +{ + + cout << "Max (20,10): " << Max(20,10) << endl; + cout << "Max (0,200): " << Max(0,200) << endl; + cout << "Max (100,1010): " << Max(100,1010) << endl; + return 0; +} +``` + +**输出:** + +```cpp +Max (20,10): 20 +Max (0,200): 200 +Max (100,1010): 1010 +``` + +### 静态成员 + +可以使用 **static** 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。 + +静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 **::** 来重新声明静态变量从而对它进行初始化,如下面的实例所示。 + +```cpp +#include + +using namespace std; + +class Box +{ + public: + static int objectCount; + // 构造函数定义 + Box(double l=2.0, double b=2.0, double h=2.0) + { + cout <<"Constructor called." << endl; + length = l; + breadth = b; + height = h; + // 每次创建对象时增加 1 + objectCount++; + } + double Volume() + { + return length * breadth * height; + } + private: + double length; // 长度 + double breadth; // 宽度 + double height; // 高度 +}; + +// 初始化类 Box 的静态成员 +int Box::objectCount = 0; + +int main(void) +{ + Box Box1(3.3, 1.2, 1.5); // 声明 box1 + Box Box2(8.5, 6.0, 2.0); // 声明 box2 + + // 输出对象的总数 + cout << "Total objects: " << Box::objectCount << endl; + + return 0; +} +``` + +**输出:** + +``` +Constructor called. +Constructor called. +Total objects: 2 +``` + +### 静态成员函数 + +如果把函数成员声明为静态的,就可以把函数与类的任何特定对象独立开来。静态成员函数即使在类对象不存在的情况下也能被调用,**静态函数**只要使用类名加范围解析运算符 **::** 就可以访问。 + +静态成员函数只能访问静态成员数据、其他静态成员函数和类外部的其他函数。 + +静态成员函数有一个类范围,他们不能访问类的 this 指针。您可以使用静态成员函数来判断类的某些对象是否已被创建。 + +**静态成员函数与普通成员函数的区别:** + +- 静态成员函数没有 this 指针,只能访问静态成员(包括静态成员变量和静态成员函数)。 + +- 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针。 + +```cpp +#include + +using namespace std; + +class Box +{ + public: + static int objectCount; + // 构造函数定义 + Box(double l=2.0, double b=2.0, double h=2.0) + { + cout <<"Constructor called." << endl; + length = l; + breadth = b; + height = h; + // 每次创建对象时增加 1 + objectCount++; + } + double Volume() + { + return length * breadth * height; + } + static int getCount() + { + return objectCount; + } + private: + double length; // 长度 + double breadth; // 宽度 + double height; // 高度 +}; + +// 初始化类 Box 的静态成员 +int Box::objectCount = 0; + +int main(void) +{ + + // 在创建对象之前输出对象的总数 + cout << "Inital Stage Count: " << Box::getCount() << endl; + + Box Box1(3.3, 1.2, 1.5); // 声明 box1 + Box Box2(8.5, 6.0, 2.0); // 声明 box2 + + // 在创建对象之后输出对象的总数 + cout << "Final Stage Count: " << Box::getCount() << endl; + + return 0; +} +``` + +**输出:** + +``` +Inital Stage Count: 0 +Constructor called. +Constructor called. +Final Stage Count: 2 +``` + +### this 指针 + +在 C++ 中,每一个对象都能通过 **this** 指针来访问自己的地址。**this** 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。 + +友元函数没有 **this** 指针,因为友元不是类的成员。只有成员函数才有 **this** 指针。 + +```cpp +#include + +using namespace std; + +class Box +{ + public: + // 构造函数定义 + Box(double l=2.0, double b=2.0, double h=2.0) + { + cout <<"Constructor called." << endl; + length = l; + breadth = b; + height = h; + } + double Volume() + { + return length * breadth * height; + } + int compare(Box box) + { + return this->Volume() > box.Volume(); + } + private: + double length; // Length of a box + double breadth; // Breadth of a box + double height; // Height of a box +}; + +int main(void) +{ + Box Box1(3.3, 1.2, 1.5); // Declare box1 + Box Box2(8.5, 6.0, 2.0); // Declare box2 + + if(Box1.compare(Box2)) + { + cout << "Box2 is smaller than Box1" < +
-欢迎访问 7wate 维基知识库 ~ +## Hi there 👋, 欢迎访问 7wate 维基知识库 ~ + + + +
-笔记存在时效性,发现错误请邮箱联系 ~ ![Alt](https://repobeats.axiom.co/api/embed/b6e6a199e422ce596ea7423372746b6debadaa7d.svg "Repobeats analytics image")