构造函数 析构函数 友元函数 拷贝构造函数
时间: 2024-06-16 21:05:40 浏览: 124
构造函数:
构造函数是一种特殊的成员函数,用于创建和初始化对象。它的名称与类名相同,没有返回类型,并且在对象创建时自动调用。构造函数可以有多个重载版本,根据参数的不同进行区分。构造函数可以用来初始化对象的成员变量,分配内存空间,执行其他必要的初始化操作。
析构函数:
析构函数是一种特殊的成员函数,用于在对象销毁时执行清理操作。它的名称与类名相同,前面加上一个波浪号(~),没有返回类型,也不接受任何参数。析构函数在对象销毁时自动调用,用于释放对象占用的资源,如释放动态分配的内存、关闭文件等。
友元函数:
友元函数是在类外部声明的非成员函数,但可以访问类的私有成员和保护成员。通过在类中声明友元函数,可以使其具有访问类的私有成员的权限。友元函数可以在类内部声明为友元,也可以在类外部声明为友元。
拷贝构造函数:
拷贝构造函数是一种特殊的构造函数,用于创建一个新对象并将其初始化为已有对象的副本。它通常用于对象之间的赋值操作、传递对象给函数或从函数返回对象时。拷贝构造函数接受一个同类型的对象作为参数,并使用该对象的值来初始化新对象。如果没有显式定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。
相关问题
下面选项中,不是类的成员函数为( )。 A. 构造函数 B. 析构函数 C. 友元函数 D. 缺省参数的构造函数
C. 友元函数不是类的成员函数。类的成员函数包括构造函数、析构函数、成员函数和静态成员函数。其中,构造函数用于初始化对象,析构函数用于清理对象,成员函数用于处理对象的行为,静态成员函数用于处理类的行为。而友元函数是一种独立于类的非成员函数,它可以访问类的私有成员和保护成员。因此,友元函数不是类的成员函数。
选项 D. 缺省参数的构造函数可以是类的成员函数,它是一种特殊的构造函数,用于给构造函数的参数提供默认值。例如:
```c++
class MyClass {
public:
MyClass(int x = 0, int y = 0) {
this->x = x;
this->y = y;
}
private:
int x;
int y;
};
int main() {
MyClass a(1, 2); // 调用带参数的构造函数
MyClass b; // 调用缺省参数的构造函数
return 0;
}
```
在上面的例子中,`MyClass` 类定义了一个带参数的构造函数和一个缺省参数的构造函数。当使用 `MyClass a(1, 2)` 时,会调用带参数的构造函数,传入参数 1 和 2;而当使用 `MyClass b` 时,会调用缺省参数的构造函数,不传入参数,使用默认值 0。
设计class:student,根据你的需求分析,定义数据成员和成员函数,类型、数量和功能无限制,要求: class中需要至少分别定义1个static和const成员; 至少3种构造函数:不带参数的构造函数,带参数有默认值的构造函数,拷贝构造函数以及你需要的其他构造函数; 析构函数:自定义析构函数; 使用友元函数,实现合适的功能; 编写测试程序main(),测试你定义的class:student中的所有功能
以下是一个参考的实现:
```cpp
#include <iostream>
#include <string>
using namespace std;
class Student {
public:
// 定义静态变量和常量
static int num_students;
const string school_name;
// 构造函数
Student() : school_name("ABC School") {
num_students++;
cout << "调用无参构造函数" << endl;
}
Student(string name, int age = 18, float score = 0.0) : name(name), age(age), score(score), school_name("ABC School"){
num_students++;
cout << "调用带参数的构造函数" << endl;
}
Student(const Student &other) : name(other.name), age(other.age), score(other.score), school_name("ABC School") {
num_students++;
cout << "调用拷贝构造函数" << endl;
}
// 析构函数
~Student() {
num_students--;
cout << "调用析构函数" << endl;
}
// 成员函数
void set_name(string name) {
this->name = name;
}
void set_age(int age) {
this->age = age;
}
void set_score(float score) {
this->score = score;
}
void study() {
cout << name << "正在学习" << endl;
}
// 友元函数
friend void print_student_info(const Student &stu);
private:
string name;
int age;
float score;
};
// 定义静态变量
int Student::num_students = 0;
// 友元函数
void print_student_info(const Student &stu) {
cout << "姓名:" << stu.name << endl;
cout << "年龄:" << stu.age << endl;
cout << "成绩:" << stu.score << endl;
}
int main() {
Student s1; // 调用无参构造函数
s1.set_name("张三");
s1.set_age(20);
s1.set_score(90.5);
Student s2("李四"); // 调用带参数的构造函数
s2.set_age(21);
s2.set_score(88.5);
Student s3(s1); // 调用拷贝构造函数
print_student_info(s1);
print_student_info(s2);
print_student_info(s3);
cout << "学生人数:" << Student::num_students << endl;
return 0;
}
```
程序输出:
```
调用无参构造函数
调用带参数的构造函数
调用拷贝构造函数
姓名:张三
年龄:20
成绩:90.5
姓名:李四
年龄:21
成绩:88.5
姓名:张三
年龄:20
成绩:90.5
学生人数:3
调用析构函数
调用析构函数
调用析构函数
```
阅读全文