C++高级程序设计实验报告-类和对象,类的构建:1.类的定义;2.类对象的使用;3.类成员变量的定义和使用;4.类成员函数的定义和使用;5.理解类的作用域;6.理解类的声明;7.理解类中private和public权限的声明依据。 ### C++高级程序设计实验报告二 - 类和对象 #### 实验目的 本实验旨在深入理解和掌握C++中类和对象的基本概念与使用方法。主要包括以下几个方面: 1. **类的定义**:学习如何定义一个类,包括成员变量和成员函数。 2. **类对象的使用**:学会创建类的对象,并通过对象访问成员变量和成员函数。 3. **类成员变量的定义和使用**:了解如何在类中定义成员变量,并掌握如何在类外部通过对象访问这些成员变量。 4. **类成员函数的定义和使用**:掌握如何在类中定义成员函数以及如何通过对象调用这些成员函数。 5. **理解类的作用域**:了解类成员的作用域规则。 6. **理解类的声明**:学习类声明的方法及意义。 7. **理解类中private和public权限的声明依据**:掌握如何使用访问控制符`private`和`public`来控制成员的访问级别。 #### 实验内容解析 ##### 程序阅读 **案例1** ```cpp // 示例代码 class CDate { public: void Set(int m,int d,int y); int IsLeapYear(); void Print(); private: int month; int day; int year; }; int main() { CDate a; a.Set(1, 1, 2000); // 调用成员函数 a.Print(); // 输出日期 return 0; } ``` - **问题一**:程序能够编译通过。但是,类`CDate`中的前两个函数`Set`和`IsLeapYear`应声明为`public`,以便在类外部调用它们。如果不加`public`关键字,则默认为`private`,这会导致无法从类外部直接访问。 - **问题二**:类`CDate`中有三个成员函数:`Set`, `IsLeapYear`, `Print`,它们都属于`public`访问权限。此外,有三个成员变量:`month`, `day`, `year`,它们都属于`private`访问权限。 - **问题三**:`CDate a;`这行代码表示定义了一个名为`a`的`CDate`类的对象。 **案例2** ```cpp class CTest { public: void SetData(int data); void PrintData(); private: int data; }; int main() { CTest::data = 10; // 错误的写法 CTest test; test.data = 20; // 正确的写法 test.PrintData(); return 0; } CTest::SetData(int data) { CTest::data = data; } CTest::PrintData() { cout << "Data is: " << CTest::data << endl; } ``` - **问题一**:第1处的`CTest::data = 10;`是试图给全局变量赋值,但实际上应该是给类的成员变量赋值。去掉域作用符`::`后,程序可以正确运行,因为它会访问对象`test`的成员变量`data`。 - **问题二**:第2处的`CTest::PrintData()`调用了类`CTest`的成员函数`PrintData()`。去掉域作用符`::`后,程序将不能正确运行,因为这里需要指定对象来调用成员函数。 - **问题三**:该程序的输出结果是成员变量`data`的初始值。由于成员变量未显式初始化,其值通常是不确定的,但现代编译器可能会对其进行零初始化。 ##### 程序设计 下面是一个关于复数类的设计示例: ```cpp #include <iostream> using namespace std; class Complex { public: void Set(double r, double i) { real = r; imag = i; } void Print() { cout << real << "," << imag << endl; } private: double real; double imag; }; int main(int argc, char *argv[]) { Complex a, c; a.Set(2.3, 3.5); a.Print(); Complex *p = new Complex; p->Set(1.2, 2.3); p->Print(); Complex &cc = c; cc.Set(2.3, 3.5); cc.Print(); return 0; } ``` 此程序展示了如何使用对象、指针和引用来调用类的成员函数。通过这种方式,我们可以灵活地操作类的实例,并实现不同的功能。 ##### 思考题 考虑以下代码: ```cpp #include<iostream> class CCircle; class CPoint{ public: unsigned x; unsigned y; bool IsInCircle(CCircle *Circle); }; class CCircle{ public: unsigned Radius; CPoint Center; }; bool CPoint::IsInCircle(CCircle *Circle){ return ((x-Circle->Center.x)*(x-Circle->Center.x)+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius; } void main(){} ``` - **问题**:程序存在几个问题。`#include<iostream>`后面的括号中不需要加上`.h`。类`CCircle`和`CPoint`之间的相互引用导致了未定义对象的问题。可以通过在类`CPoint`中声明`CCircle`类来解决这一问题。 - **改正后的代码**: ```cpp #include<iostream> class CCircle; // 前向声明 class CPoint { public: unsigned x; unsigned y; bool IsInCircle(CCircle *Circle); }; class CCircle { public: unsigned Radius; CPoint Center; }; bool CPoint::IsInCircle(CCircle *Circle) { return ((x-Circle->Center.x)*(x-Circle->Center.x)+(y-Circle->Center.y)*(y-Circle->Center.y))<=Circle->Radius*Circle->Radius; } int main() { // 主函数可以添加一些测试代码 CCircle circle; CPoint point; circle.Radius = 5; circle.Center.x = 0; circle.Center.y = 0; point.x = 3; point.y = 4; cout << "Point in Circle? " << (point.IsInCircle(&circle) ? "Yes" : "No") << endl; return 0; } ``` 通过这样的修改,我们解决了类之间相互引用的问题,并且能够在主函数中进行测试,验证成员函数的正确性。
- 粉丝: 1
- 资源: 25
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SAC-Auto路径规划, Soft Actor-Critic算法, SAC-pytorch,激光雷达Lidar避障仿真模拟
- python基础之综合练习一-38.黑色星期五Friday the Thirteenth-13日.py
- 基于STM32F4进行图像处理,识别图像画面中较亮的三个光点,并且通过串口打印出三个光点的坐标
- python基础之综合练习一-37.贪婪的送礼者Greedy Gift Givers-这是你的,这是他的~.py
- python爱心代码高级粒子-36.分数线划定-这么直接ov0.py
- 安卓-报名助手.apk
- data_view.html
- c语言文件读写操作代码.txt
- c语言文件读写操作代码.txt
- c语言文件读写操作代码.txt