C++期末

116 阅读6分钟

实验一1

#include<iostream>
using namespace std; //该行代码表示使用了C++标准库的std命名空间,这样就可以直接使用std命名空间内的函数和对象,而不需要使用std::前缀。
int main() //定义了程序的主函数。
{
    int arr[4]={1,2,3,4},i; //声明了一个包含4个整数的数组arr,并赋初值为{1, 2, 3, 4}。另外定义了一个整型变量i。
    int *a=arr; //定义了一个整型指针a,指向数组arr的第一个元素的地址。
    int *&p=a; //定义了一个整型指针p的引用,指向指针a。这里涉及到引用的概念,p的改变会影响a,反之亦然。
    p++; //将指针p的值自增,使其指向数组arr的下一个元素。
    *p=100; //将指针p所指向的值修改为100。
    cout << *a <<"\t" <<*p <<endl; //输出指针a和指针p所指向的值,以及换行。
    for (i=0;i<4;i++) 
        cout << arr[i] << "\t";//通过循环输出数组arr的所有元素。
    cout << endl;
    int b=10; //定义了一个整型变量b,赋值为10。
    p=&b;//将指针p指向变量b的地址。
    cout << *a <<"\t" <<*p <<endl; //输出指针a和指针p所指向的值,以及换行。
    for(i=0;i<4;i++)
        cout << arr[i] << "\t"; //通过循环输出数组arr的所有元素。
    cout << endl;
    return 0; //主函数执行完毕,返回0表示程序正常结束。
}

image.png

实验一2

#include<iostream> //包含iostream标准库头文件,以便使用输入输出流。
using namespace std; //使用std命名空间,避免每次使用标准库的函数时都需要写std::前缀。
void fun(int x, int& y)
{
	x += y;
	y += x;
} //定义了一个名为fun的函数,接受一个整型参数x和一个整型引用参数y。在函数体内,x与y相加并赋值给x,然后y再与x相加。
int main()
{
	int x = 5, y = 10;
	fun(x, y); //在主函数中,定义了两个整型变量x和y,分别赋值为5和10。调用fun函数,传入x和y的值,其中x和y的值会传递给函数fun。
	fun(y, x); //再次调用fun函数,传入y和x的值,因为fun函数中的y是引用参数,在第一次调用时y的值已经被更改,所以会引起不同的结果。
	cout << "x=" << x << ",y=" << y << endl; //输出变量x和y的值。
	return 0; //返回0表示程序正常结束。
} 

image.png

实验二1

头文件

#include<iostream>
#include<string> //包含iostream和string标准库的头文件,以便使用输入输出流和string类。
using namespace std;//使用std命名空间,避免每次使用标准库的函数时都需要写std::前缀。
class Croster
{
public:
    static int Count;
private:
    string name;
    int Math;
    int English;
    int Sum;
public:
    Croster(string na = "undef", int m = 10, int e = 100);
    void Display();
    int Cumulation();
}; //定义了一个名为Croster的类,包括公有成员变量Count(静态成员)、成员变量name、Math、English和Sum,以及公有成员函数Croster、Display和Cumulation。静态成员Count是类的静态成员变量,属于整个类,而不是类的具体对象。
Croster::Croster(string na = "undef", int m = 10, int e = 100)
{
    name = na;
    Math = m;
    English = e;
    Sum = Math + English;
} //Croster类的构造函数,带有默认参数值,用于初始化成员变量name、Math、English和Sum。
void Croster::Display()
{
    cout << "Name: " << name << endl;
    cout << "Math score: " << Math << endl;
    cout << "English score: " << English << endl;
    cout << "Total score: " << Sum << endl;
}//Croster类的成员函数Display,用于显示学生的姓名、数学成绩、英语成绩和总成绩。
int Croster::Cumulation()
{
    return Math + English;
} //Croster类的成员函数Cumulation,用于计算学生的数学成绩和英语成绩之和,并返回结果。

2-1源文件1

#include"2-1头文件.h" //包含名为"2-1头文件"的头文件,这里假设该头文件中包含了Croster类的声明和相关依赖。
int Croster::Count = 100; //对Croster类的静态成员变量Count进行初始化,赋值为100。
Croster::Croster(string na, int m, int e) :name(na), Math(m), English(e)
{
    cout << "欢迎新同学" << endl;
    Sum = Math + English;
    Count--;
} //Croster类的构造函数的另一种实现方式,采用了成员初始化列表来初始化成员变量name、Math、English。在构造函数中输出"欢迎新同学",计算总成绩Sum,并将Count减1。
void Croster::Display()
{
    cout << name << endl;
    cout << "Math:" << Math << endl;
    cout << "English:" << English << endl;
    cout << "Sum:" << Sum << endl;
}//Croster类的成员函数Display,用于显示学生的姓名、数学成绩、英语成绩和总成绩。
int Croster::Cumulation()
{
    Sum = Math + English;
    return Sum;
} //Croster类的成员函数Cumulation,重新计算学生的数学成绩和英语成绩之和,并返回结果。

2-1源文件2

#include"2-1头文件。h"
包含名为"2-1头文件"的头文件,这里假设该头文件中包含了Croster类的声明和相关依赖。
int main()
{
    cout << "Number of all student=" << Croster::Count << endl;
    Croster list[3];
    cout << "Number of all student=" << list[1].Count << endl;
    Croster stu_A;
    cout << "Number of all student=" << stu_A.Count << endl;
    cout << "Number of all student=" << Croster::Count << endl;
    return 0;
}
//定义了主函数main,依次执行以下操作:

1.  输出所有学生数目,即输出Croster类的静态成员变量Count的值。
1.  创建了一个Croster类的数组list,包含3个对象,输出第二个对象list[1]的Count值。
1.  创建了一个Croster对象stu_A,输出该对象的Count值。
1.  再次输出所有学生数目,即输出Croster类的静态成员变量Count的值。

这段代码演示了静态成员变量的使用方式,可以通过类名::静态成员变量名或对象名.静态成员变量名来访问静态成员变量,静态成员变量是属于整个类而不是类的对象的。

image.png

实验三

#include <iostream>
using namespace std;
class BaseA
{
private:
	int a1;
protected:
	int a2;
public:
	int a3;
	void setA(int x, int y, int z)
	{
		a1 = x;
		a2 = y;
		a3 = z;
	}
	void showA()
	{
		cout << "a1=" << a1;
		cout << "a2=" << a2;
		cout << "a3=" << a3 << endl;
	}
};
class BaseB
{
private:
	int b1;
protected:
	int b2;
public:
	int b3;
	void setB(int x, int y, int z)
	{
		b1 = x;
		b2 = y;
		b3 = z;
	}
	void showB()
	{
		cout << "b1=" << b1;
		cout << "b2=" << b2;
		cout << "b3=" << b3 << endl;
	}
};
class BaseC
{
private:
	int c1;
protected:
	int c2;
public:
	int c3;
	void setC(int x, int y, int z)
	{
		c1 = x;
		c2 = y;
		c3 = z;
	}
	void showC()
	{
		cout << "c1=" << c1;
		cout << "c2=" << c2;
		cout << "c3=" << c3 << endl;
	}
};
class Derived : public BaseA, protected BaseB, private BaseC
{
private:
	int d1;
protected:
	int d2;
public:
	int d3;
	void setD(int x, int y, int z)
	{
		d1 = x;
		d2 = y;
		d3 = z;
	}
	void showD()
	{
		cout << "d1=" << d1;
		cout << "d2=" << d2;
		cout << "d3=" << d3 << endl;
	}
	void setall(int x0, int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8, int x9, int x10, int x11)
	{
		setA(x0, x1, x2);
		setB(x3, x4, x5);
		setC(x6, x7, x8);
		setD(x9, x10, x11);
	}
	void showall()
	{
		showA();
		showB();
		showC();
		showD();
	}
};
int main()
{
	Derived obj;
	obj.setall(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120);
	//obj.showA();
	//obj.showB();
	//obj.showC();
	//obj.showD();
	obj.showall();
	return 0;
}

image.png

#include <iostream>
using namespace std;
class Base
{
public:
	Base(int x)
	{
		a = x;
	}
	virtual void Print()
	{
		cout << "Base::a=" << a << endl;
	}
	int a;
};
class Derived : public Base
{
public:
	int a;
	Derived(int x, int y) : Base(x)
	{
		a = y;
		Base::a *= 2;
	}
	void Print()
	{
		Base::Print();
		cout << "Derived::a=" << a << endl;
	}
};
void f1(Base& obj)
{
	obj.Print();
}
void f2(Derived& obj)
{
	obj.Print();
}
int main()
{
	Base b(9);
	Derived d(200, 300);
	d.Print();
	d.a = 400;
	d.Base::a = 500;
	d.Base::Print();
	Base* pb;
	pb = &b;
	pb->Print();
	pb = &d;
	pb->Print();
	f1(b);
	f1(d);
	Derived* pd;
	pd = &d;
	pd->Print();
	f2(d);
	return 0;
}

image.png