标签:stop style friend 标记 tin keyword 编写 输出 first
1) 如果多种事物,有一些共同的特点,又有一些各自不同的特点,如何编写类来代表这些事物比较合适?
B) 写一个类代表其中一种事物,代表其他事物的类,都从这个类派生出来
C) 概括所有事物的共同特点,写一个基类。然后为每种事物写一个类,都从基类派生而来
D) 一共就写一个类,包含所有事物的所有特点,然后用一个成员变量作为标记来区分不同种类的事物
A) 为每种事物独立编写一个类,各类之间互相无关
2) 以下哪种派生关系是合理的
B) 从“点”类派生出“圆”类
D) 从“爬行动物”类派生出“哺乳动物”类
A) 从“虫子”类派生出“飞虫”类
C) 从“狼”类派生出“狗”类
3) 派生类和基类有同名同参数表的成员函数,这种现象:
C) 叫覆盖。在派生类中基类的同名函数就没用了
D) 叫覆盖。体现了派生类对从基类继承得到的特点的修改
B) 叫函数的重载
A) 叫重复定义,是不允许的
4) 以下说法正确的是:
C) 派生类和基类的同名成员函数必须参数表不同,否则就是重复定义
D) 派生类和基类的同名成员变量存放在相同的存储空间
B) 派生类的成员函数中,可以调用基类的同名同参数表的成员函数
A) 派生类可以和基类有同名成员函数,但是不能有同名成员变量
5) 以下说法正确的是:
A) 派生类对象生成时,派生类的构造函数先于基类的构造函数执行
B) 派生类对象消亡时,基类的析构函数先于派生类的析构函数执行
D) 在派生类的构造函数中部可以访问基类的成员变量
C) 如果基类有无参构造函数,则派生类的构造函数就可以不带初始化列表
#include <cstdlib>
#include <iostream>
using namespace std;
// 求字符串的长度
int strlen(const char * s)
{
int i = 0;
for (; s[i]; ++i);
return i;
}
// 拷贝字符串
void strcpy(char * d, const char * s)
{
int i = 0;
for (i = 0; s[i]; ++i)
d[i] = s[i];
d[i] = 0;
}
// 比较字符串的字典序
int strcmp(const char * s1, const char * s2)
{
for (int i = 0; s1[i] && s2[i]; ++i) {
if (s1[i] < s2[i])
return -1;
else if (s1[i] > s2[i])
return 1;
}
return 0;
}
// 拼接字符串
void strcat(char * d, const char * s)
{
int len = strlen(d);
strcpy(d + len, s);
}
class MyString
{
private:
char* p; // 字符串指针 动态分配空间
int len; // 字符串长度
public:
// 字符串构造函数
MyString(const char* a)
{
len = strlen(a);
p = new char[len + 1];
strcpy(p, a);
}
// 无参数构造函数
MyString()
{
len = 1;
p = new char[1];
strcpy(p, "");
}
// 拷贝构造函数
MyString(const MyString& a)
{
len = strlen(a.p);
p = new char[len + 1];
strcpy(p, a.p);
}
// 输出运算符重载
friend ostream& operator<<(ostream& o, const MyString& a)
{
o << a.p;
return o;
}
// 赋值运算符重载
MyString& operator=(const MyString& a)
{
if (p == a.p)
{
return *this;
}
if (p)
delete p;
len = strlen(a.p);
p = new char[len + 1];
strcpy(p, a.p);
return *this;
}
// [] 运算符重载
char& operator[](int i)
{
return p[i];
}
// 字符串+的重载
friend MyString operator+(const MyString& a, const MyString& b)
{
int l = b.len + a.len;
char *c = new char[l + 1];
strcpy(c, a.p);
int i;
int j = 0;
for (i = a.len; i <= l - 1; ++i, ++j)
c[i] = b.p[j];
c[i] = 0;
return MyString(c);
}
// 字符串+=的重载
void operator +=(const char *a)
{
// 注意,不能直接拼接的原因是空间不够,需要先删除p
// 申请一个更大的空间,在拼接
int i = len;
char *b = new char[len + 1];
strcpy(b, p);
delete p;
len = len + strlen(a);
p = new char[len + 1];
strcpy(p, b);
int j = 0;
for (; i <= len - 1; i++, j++) {
p[i] = a[j];
}
p[i] = 0;
}
// 比较字典序的重载
friend bool operator<(const MyString& a, const MyString& b)
{
if (strcmp(b.p, a.p) == 1) {
return 1;
}
return 0;
}
// 比较字典序的重载
friend bool operator>(const MyString& a, const MyString& b) {
if (strcmp(a.p, b.p) == 1) {
return 1;
}
return 0;
}
// 比较字典序的重载
friend bool operator==(const MyString& a, const MyString& b) {
if (strcmp(a.p, b.p) == 0) {
return 1;
}
return 0;
}
// ()运算符的重载,取出字典字串
char* operator()(int a, int l) {
char* c = new char[l + 1];
int j = 0;
for (int i = a; i<a + l; i++, j++) {
c[j] = p[i];
}
c[j] = 0;
return c;
}
};
int CompareString(const void * e1, const void * e2)
{
MyString * s1 = (MyString *)e1;
MyString * s2 = (MyString *)e2;
if (*s1 < *s2)
return -1;
else if (*s1 == *s2)
return 0;
else if (*s1 > *s2)
return 1;
}
int main()
{
MyString s1("abcd-"), s2, s3("efgh-"), s4(s1);
MyString SArray[4] = { "big","me","about","take" };
cout << "1. " << s1 << s2 << s3 << s4 << endl;
s4 = s3;
s3 = s1 + s3;
cout << "2. " << s1 << endl;
cout << "3. " << s2 << endl;
cout << "4. " << s3 << endl;
cout << "5. " << s4 << endl;
cout << "6. " << s1[2] << endl;
s2 = s1;
s1 = "ijkl-";
s1[2] = ‘A‘;
cout << "7. " << s2 << endl;
cout << "8. " << s1 << endl;
s1 += "mnop";
cout << "9. " << s1 << endl;
s4 = "qrst-" + s2;
cout << "10. " << s4 << endl;
s1 = s2 + s4 + " uvw " + "xyz";
cout << "11. " << s1 << endl;
qsort(SArray, 4, sizeof(MyString), CompareString);
for (int i = 0; i < 4; i++)
cout << SArray[i] << endl;
//s1的从下标0开始长度为4的子串
cout << s1(0, 4) << endl;
//s1的从下标5开始长度为10的子串
cout << s1(5, 10) << endl;
return 0;
}
#include <cstdlib>
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class MyString :public string
{
// 在此处补充你的代码
public:
MyString():string() {}
MyString(const char *s):string(s) {}
MyString(const MyString & s):string(s){}
MyString(const string & s):string(s) {}
MyString operator()(int start, int end)
{
return substr(start, end);
}
};
int main()
{
MyString s1("abcd-"), s2, s3("efgh-"), s4(s1);
MyString SArray[4] = { "big","me","about","take" };
cout << "1. " << s1 << s2 << s3 << s4 << endl;
s4 = s3;
s3 = s1 + s3;
cout << "2. " << s1 << endl;
cout << "3. " << s2 << endl;
cout << "4. " << s3 << endl;
cout << "5. " << s4 << endl;
cout << "6. " << s1[2] << endl;
s2 = s1;
s1 = "ijkl-";
s1[2] = ‘A‘;
cout << "7. " << s2 << endl;
cout << "8. " << s1 << endl;
s1 += "mnop";
cout << "9. " << s1 << endl;
s4 = "qrst-" + s2;
cout << "10. " << s4 << endl;
s1 = s2 + s4 + " uvw " + "xyz";
cout << "11. " << s1 << endl;
sort(SArray, SArray + 4);
for (int i = 0; i < 4; i++)
cout << SArray[i] << endl;
//s1的从下标0开始长度为4的子串
cout << s1(0, 4) << endl;
//s1的从下标5开始长度为10的子串
cout << s1(5, 10) << endl;
system("pause");
return 0;
}
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int M;//两大阵营开始都有M个生命元
int r_maker[5] = {2,3,4,1,0};
int b_maker[5] = {3,0,1,2,4};
string weapon[3] = {"sword","bomb","arrow"};
int HP[5];
/*
dragon: 0
ninja : 1
iceman: 2
lion : 3
wolf : 4
*/
/*
red :0
blue:1
*/
class Warrior {
private:
int num;//勇士编号
int hp;//勇士生命值
public:
Warrior(int from,int name,int warrior_t,int left_t);
};
Warrior::Warrior(int from,int name,int warrior_t,int left_t)
{
//阵营名
string camp_name;
if(from == 0)
camp_name = "red";
else
camp_name = "blue";
//武士名
string warrior_name;
switch (name)
{
case 0:warrior_name = "dragon";break;
case 1:warrior_name = "ninja";break;
case 2:warrior_name = "iceman";break;
case 3:warrior_name = "lion";break;
case 4:warrior_name = "wolf";break;
}
//武士编号
int warrior_num = warrior_t;
//生命值
int life = HP[name];
//各自阵营left
int left = left_t;
//输出所有的信息
cout<<camp_name<<‘ ‘<<warrior_name<<‘ ‘<<warrior_num<<‘ ‘;
cout<<"born with strength "<<life<<‘,‘<<left<<‘ ‘<<warrior_name;
cout<<" in "<<camp_name<<" headquarter"<<endl;
//最后设置该warrior的参数
num = warrior_num;
hp = life;
}
class Dragon : public Warrior
{
private:
double morale;
int weapon_num;
string weapon_name;
public:
Dragon