一、实验目的
1. 理解类的组合定义、说明与使用
2. 参数化列表的使用
3. 组合类的特例——string类
二、实验任务
重点:掌握组合类的定义与实现,丰富类的数据成员与成员函数,拓展其功能。
(1)思考并实验验证程序,回答程序处标注的思考题?
(2)查阅资料回答:组合类对象不用参数化列表方式初始化是否可以?常数据成员,常成员函数的特点?
在C++中,组合类对象可以使用默认构造函数进行初始化,不一定需要参数化列表方式。常数据成员是指在类中声明为const的成员变量,它们的值不能在对象生命周期内被修改。常成员函数是指在类中声明为const的成员函数,它们保证不会修改对象的状态,只能访问对象的常数据成员和非常成员函数。常数据成员和常成员函数可以提高程序的可读性和安全性,尤其是在多线程或并发编程中。
(3)查阅资料回答:静态变量、静态成员函数的特点?
静态变量和静态成员函数的特点包括:
1.与类相关而不是与对象相关。
2.可以通过类名直接访问。
3.不需要类的实例即可使用。
4.静态变量在程序生命周期内只创建一次,本质上是全局变量,因此需要小心使用以避免命名冲突。
5.静态成员函数不能访问非静态成员,也不能使用this指针,因为它们没有隐式的对象参数。
(4)查阅资料回答:string类的使用特点?
string类的使用特点包括:
1.动态内存管理:string类自动处理字符串的内存分配和释放,避免了手动管理内存带来的问题。
2.支持各种操作:string类支持大量的字符串操作,包括连接、比较、查找、替换等,方便了程序员的开发工作。
3.可读性强:string类代码具有可读性强的特点,能够很好地表达程序员的意图,降低代码出错的概率。
4.高效性:尽管string类是动态内存管理,但通过优秀的实现和算法,它可以非常高效地执行大多数操作。
5.与C风格字符串兼容:string类可以轻松地与C风格字符串进行转换和互操作,这使得在C++程序中使用已有的C代码更加容易。
#include <iostream>
#include <string>
using namespace std;
class Date
{
private:
int y, m, d;
const int a;
static int c;
public:
Date():a(0) //常变量使用初始化列表方式初始化
{
y = m = d = 0;
}
Date(int yy, int mm, int dd) : y(yy),a(0)//普通常变量也可以使用初始化列表方式初始化
{
m = mm; d = dd;
}
Date(Date &dt) :y(dt.y), a(dt.a)
{
m = dt.m; d = dt.d;
}
void output()
{
y = d;
cout << y << ":" << m << ":" << d << endl;
cout << "a="<<a << endl;
}
void output()const
{
y = d; //思考1:常成员函数是否可以改变变量的值?
cout << "a=" << a << endl;
cout << y << ":" << m << ":" << d << endl;
}
};
int Date::c = 0; //静态数据成员初始化
class Teacher //组合类
{
private:
string name;
const char* str;
Date bir;
public:
Teacher(string n,const char* s,Date b):bir(b) //思考2:第二个形参是否可以去掉const ?
{
name=n;
str =s;
}
Teacher() //思考3:无参构造函数中内嵌对象bir如何实现初始化 ?
{
name = " ";
str = " ";
}
Teacher(Teacher &t) :bir(t.bir)
{
name =t.name;
str =t.str;
}
string getname()
{
return name;
}
const char* getstr() //思考4:此函数是常成员函数吗 ?
{
return str;
}