前言
大家好吖,欢迎来到 YY 滴C++复习系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁
主要内容含:
一、简述题
1. 简述构造函数和析构函数分别有什么作用?
- 构造函数用于在创建对象时初始化对象的数据成员,为对象分配内存空间,并执行其他必要的初始化操作。它通常用于初始化对象的状态,设置初始值,分配资源等。
- 析构函数用于在对象被销毁时执行一些清理工作,比如释放对象占用的资源,关闭文件,断开连接等。它通常用于在对象生命周期结束时执行一些必要的清理操作,以确保对象的资源得到正确释放。
2. 公有成员和私有成员的区别是什么?
- 公有成员和私有成员是面向对象编程中的两种访问控制权限。
- 公有成员是指在类的外部和派生类中都可以被访问的成员。这意味着任何地方都可以访问和修改公有成员。公有成员通常用于提供接口和功能,以便外部代码可以与类进行交互。
- 私有成员是指只能在类的内部访问的成员,外部代码无法直接访问或修改私有成员。私有成员通常用于隐藏类的实现细节,以防止外部代码直接访问和修改内部数据,从而提高类的封装性和安全性。
- 总的来说,公有成员提供了对外部代码的接口,而私有成员隐藏了类的实现细节,使得类的内部状态和行为对外部代码不可见。
3. 什么是拷贝构造函数?它何时被调用?
- 拷贝构造函数是一种特殊的构造函数,用于创建一个新对象并将其初始化为另一个同类对象的副本。它的函数签名通常是类名(const 类名
&obj),其中参数是对同类对象的引用。
拷贝构造函数通常在以下情况下被调用:
- 当使用一个对象来初始化另一个对象时,会调用拷贝构造函数。
- 当把一个对象作为参数传递给函数,以值传递的方式传递对象时,也会调用拷贝构造函数。
- 当从函数返回一个对象时,也可能会调用拷贝构造函数。
- 拷贝构造函数的作用是创建一个新的对象,并将其初始化为另一个对象的副本,以确保在这些情况下对象的数据成员得到正确复制,而不是简单地复制对象的地址。
二、代码题
例题1:
- 声明一个名为Tree的类,它有数据成员age(树龄),有成员函数grow(int year),用于计算经过year这么多年的成长后树的最新年龄,以及GetAge(),用于提取树的年龄,并定义构造函数用于初始化tree对象的属性
class Tree { private: int age; // 树龄 public: // 构造函数,初始化树的年龄 Tree(int initialAge) : age(initialAge) {} // 成长函数,计算经过year年后的树的最新年龄 void grow(int years) { age += years; } // 获取树的年龄 int getAge() { return age; } };
例题2:
创建一个类,模仿基本数据类型的部分功能,将这个类命名为Integer(注意,这和表示整数类型的int大小写不同)。Integer类拥有整型数据成员value(数值),还有一些成员函数,比如显示一个Integer对象的值,以及将两个Integer对象相加。要求定义构造函数用于初始化Integer对象的值
#include <iostream> class Integer { private: int value; // 整型数值 public: // 构造函数,用于初始化整数值 Integer(int v) : value(v) {} // 显示Integer对象的值 void displayValue() { std::cout << "The value is: " << value << std::endl; } // 将两个Integer对象相加 Integer add(const Integer& other) { return Integer(value + other.value); } };
例题3:
创建一个类,模仿基本数据类型的部分功能,将这个类命名为Integer(注意,这和表示整数类型的int大小写不同)。Integer类拥有整型数据成员value(数值),还有一些成员函数,比如显示一个Integer对象的值,以及将两个Integer对象相加。要求定义构造函数用于初始化Integer对象的值
#include <iostream> class Integer { private: int value; // 整型数值 public: // 构造函数,用于初始化整数值 Integer(int v) : value(v) {} // 显示Integer对象的值 void displayValue() { std::cout << "The value is: " << value << std::endl; } // 将两个Integer对象相加 Integer add(const Integer& other) { return Integer(value + other.value); } };
例题4:
- 考虑几何图形圆,它有属性:半径,行为:获取半径值,计算周长,计算面积,输出圆的相关信息。根据上述分析,请声明并实现一个Circle类
#include <iostream> class Circle { private: double radius; // 半径 public: // 构造函数,用于初始化半径 Circle(double r) : radius(r) {} // 获取半径值 double getRadius() { return radius; } // 计算周长 double calculatePerimeter() { return 2 * 3.14159 * radius; } // 计算面积 double calculateArea() { return 3.14159 * radius * radius; } // 输出圆的相关信息 void printInfo() { std::cout << "Circle Information:" << std::endl; std::cout << "Radius: " << radius << std::endl; std::cout << "Perimeter: " << calculatePerimeter() << std::endl; std::cout << "Area: " << calculateArea() << std::endl; } };
例题5:
- 编写一个程序,设计一个类Score用于统计一个班的学生成绩,其中定义一个静态数据成员totalScore存储总分,一个静态成员函数GetTotalScore( )实现对该静态数据成员的访问
#include <iostream> class Score { private: static int totalScore; // 静态数据成员,存储总分 public: // 静态成员函数,实现对静态数据成员的访问 static int GetTotalScore() { return totalScore; } }; // 静态数据成员的定义和初始化 int Score::totalScore = 0; int main() { // 假设有一些学生成绩需要统计 int scores[] = {80, 90, 75, 85, 95}; // 统计总分 for (int i = 0; i < 5; i++) { Score::totalScore += scores[i]; } // 输出总分 std::cout << "Total score: " << Score::GetTotalScore() << std::endl; return 0; }
例题6:
- 创建一个名为Time的类,它包括分别表示小时、分钟和秒的int类型的数据成员以及两个构造函数,一个构造函数将这个数据初始化为0,另一个将它初始化为一个固定的值。另有一成员函数将时间以11:59:59的格式显示在屏幕上。
#include <iostream> class Time { private: int hours; int minutes; int seconds; public: // 默认构造函数,将时间初始化为0 Time() : hours(0), minutes(0), seconds(0) {} // 带参数的构造函数,将时间初始化为给定值 Time(int h, int m, int s) : hours(h), minutes(m), seconds(s) {} // 显示时间在屏幕上 void displayTime() { std::cout << "Time: " << hours << ":" << minutes << ":" << seconds << std::endl; } };
- 构造函数用缺省值的形式来写
#include <iostream> class Time { private: int hours; int minutes; int seconds; public: // 默认构造函数,将时间初始化为0 Time(int h = 0, int m = 0, int s = 0) : hours(h), minutes(m), seconds(s) {} // 显示时间在屏幕上 void displayTime() { std::cout << "Time: " << hours << ":" << minutes << ":" << seconds << std::endl; } };
例题7:
编写一个学生和教师数据输入和显示程序,学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名输入和显示设计成一个类person,并作为学生数据操作类student和教师数据操作类teacher的父类。试编程实现,并将编写的代码贴到原代码处。
#include <iostream> #include <string> // 父类 Person class Person { protected: int id; std::string name; public: void inputPersonData() { std::cout << "Enter ID: "; std::cin >> id; std::cout << "Enter Name: "; std::cin >> name; } void displayPersonData() { std::cout << "ID: " << id << std::endl; std::cout << "Name: " << name << std::endl; } }; // 子类 Student class Student : public Person { private: int classNumber; int score; public: void inputStudentData() { inputPersonData(); std::cout << "Enter Class Number: "; std::cin >> classNumber; std::cout << "Enter Score: "; std::cin >> score; } void displayStudentData() { displayPersonData(); std::cout << "Class Number: " << classNumber << std::endl; std::cout << "Score: " << score << std::endl; } }; // 子类 Teacher class Teacher : public Person { private: std::string title; std::string department; public: void inputTeacherData() { inputPersonData(); std::cout << "Enter Title: "; std::cin >> title; std::cout << "Enter Department: "; std::cin >> department; } void displayTeacherData() { displayPersonData(); std::cout << "Title: " << title << std::endl; std::cout << "Department: " << department << std::endl; } }; int main() { Student student; Teacher teacher; std::cout << "Enter Student Data:" << std::endl; student.inputStudentData(); std::cout << std::endl; std::cout << "Enter Teacher Data:" << std::endl; teacher.inputTeacherData(); std::cout << std::endl; std::cout << "Student Data:" << std::endl; student.displayStudentData(); std::cout << std::endl; std::cout << "Teacher Data:" << std::endl; teacher.displayTeacherData(); return 0; }