注册 登录
编程论坛 C++教室

一段C++代码,请能读懂的朋友在每句代码后面用“//”进行标注解释!谢谢!

ccnky123 发布于 2011-05-14 22:02, 642 次点击
这学期刚开始学C++,老师给了段代码要我们分析,读不懂啊,而且老师讲知识喜欢穿插讲,很多没学过的内容都写进代码里了!请朋友帮忙!代码如下:
第一题
#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#include "malloc.h"

struct item{
    char name[20];
    long number;
};
class PhoneBook{
    int n;
    struct item *p;
    public:
        PhoneBook(int);
        ~PhoneBook();
        void setname(int,char*);
        void setnumber(char*,long);
        void print();
};
PhoneBook::PhoneBook(int x){
    n=x;
    p=(struct item*)calloc(n,sizeof(struct item));
}
PhoneBook::~PhoneBook (){
     free(p);
}
void PhoneBook::setname (int a,char* b){
    strcpy((p+a)->name ,b);
}
void PhoneBook::setnumber (char* a,long b){
    for (int i=0;i<n;i++){
        if (strcpy((p+i)->name ,a)==0)
            (p+i)->number =b;
    }
   
}
void PhoneBook::print (){
    for (int i=0;i<n;i++){
        cout<<"name="<<(p+i)->name;
        cout<<"number="<<(p+i)->number;
    }
}

int main(int argc, char* argv[])
{
    PhoneBook a(10);


    a.setname(0,"aaaa");
    a.setname(1,"bbbb");
    a.setname(2,"cccc");
    a.setname(3,"dddd");
    a.setname(4,"eeee");

    a.setnumber("aaaa",1111);
    a.setnumber("bbbb",2222);
    a.setnumber("cccc",3333);
    a.setnumber("dddd",4444);
    a.setnumber("eeee",5555);

    a.print ();

    return 0;
}
第二题
#include "stdafx.h"
#include "malloc.h"
#include "string.h"
#include "iostream.h"

struct item{
    char name[20];
    long number;
};
class PhoneBook{ //类的声明
    int current;
    int n;
    struct item *p;
    public:
        PhoneBook(int);
        ~PhoneBook();
        void setname(int,char*);
        void setnumber(int,long);

        long& operator()(char*);

        PhoneBook& operator()(int);
        void operator=(char*);
   
        long operator[](char*);
        char* operator[](long);

        void print();

};
//类的定义
long PhoneBook::operator [](char* x){
        for (int i=0;i<n;i++){
            if (strcmp((p+i)->name,x)==0)
                return (p+i)->number;
        }
}
char* PhoneBook::operator [](long x){
    for (int i=0;i<n;i++){
        if ( (p+i)->number==x)
            return (p+i)->name;
    }
}
void PhoneBook::operator =(char* a){
    strcpy((p+current)->name, a);
}
PhoneBook& PhoneBook::operator ()(int a){
    current=a;
    return *this;
}
void PhoneBook::print(){
    for (int i=0;i<n;i++)
        cout<<"name="<<(p+i)->name<<" number="<<(p+i)->number<<endl;

}
long& PhoneBook::operator ()(char* a){
    for (int i=0;i<n;i++){
        if (strcmp((p+i)->name,a)==0)
            return (p+i)->number;
    }
}
void PhoneBook::setnumber(int a,long b){
    (p+a)->number =b;
}
void PhoneBook::setname(int a,char* b){
    strcpy((p+a)->name,b);
}
PhoneBook::PhoneBook(int a){
    n=a;
    p=(struct item*)calloc(n,sizeof(struct item));
}
PhoneBook::~PhoneBook(){
    free(p);
}

//----------------------------------
int main(int argc, char* argv[])
{
    PhoneBook a(10);
    a(0)="hahaha0";
    a(1)="hahaha1";
    a(2)="hahaha2";
    a(3)="hahaha3";
    a(4)="hahaha4";
    a(5)="hahaha5";
    a(6)="hahaha6";
    a(7)="hahaha7";
    a(8)="hahaha8";
    a(9)="hahaha9";
    a("hahaha0")=12345;
    a("hahaha1")=54321;
    a("hahaha2")=1234;
    a("hahaha3")=5431;
    a("hahaha4")=1345;
    a("hahaha5")=5321;
    a("hahaha6")=1345;
    a("hahaha7")=5421;
    a("hahaha8")=13345;
    a("hahaha9")=53421;
    a.print();

    cout<<"hahaha7 's number is "<<a["hahaha7"]<<endl;
    cout<<"13345 's name is "<<a[13345]<<endl;

    return 0;
}
9 回复
#2
寒风中的细雨2011-05-14 22:11
这代码 有压力  老师写的?
#3
ccnky1232011-05-14 22:23
是的,都看不懂,想对着书看着自学,又不知道是哪部分的内容。
#4
ccnky1232011-05-14 22:39
回复 楼主 ccnky123
请问你能帮帮我吗?就大概说一下,我想找到对应的章节好自学~
#5
寒风中的细雨2011-05-14 23:20
类的定义
成员函数在类外的定义
动态内存开辟 释放
类的实例化(定义对象)
成员函数的调用
对象的销毁


函数重载(函数签名)
运算符重载(operator关键字)
#6
laigaoat20052011-05-14 23:29
我来说一个吧。高手别笑我哈
程序代码:
//#include "stdafx.h"
#include "iostream.h"
#include "string.h"
#include "malloc.h"

struct item{               //结构体
    char name[20];
    long number;
};
class PhoneBook{                   //
    int n;                     //私有成员 int n;
    struct item *p;             //私有成员 item 指针
    public:                     //公有接口
        PhoneBook(int);           //声明构造函数
        ~PhoneBook();               //声明析构函数
        void setname(int,char*);    // 声明接口
        void setnumber(char*,long); //声明接口
        void print();                  //声明接口
};

 //定义构造函数
PhoneBook::PhoneBook(int x){
    n=x;
    p=(struct item*)calloc(n,sizeof(struct item)); //申请n个item内存空间
}


 //定义析构函数
PhoneBook::~PhoneBook (){
     free(p);            // 释放内存
}

void PhoneBook::setname (int a,char* b){
    strcpy((p+a)->name ,b);       // 把 字串 b 拷贝到 第 (a+1)个位置上的name中
}
void PhoneBook::setnumber (char* a,long b){
    for (int i=0;i<n;i++){            //遍历 item
        if (strcpy((p+i)->name ,a)==0)   //如果拷贝结果为空
            (p+i)->number =b;             //把当前item的number设置为b
    }
   
}
void PhoneBook::print (){     //输出    类似重载 operator<<()
    for (int i=0;i<n;i++){        // 遍历 item
        cout<<"name="<<(p+i)->name;  // 输出 当前item 的name项
        cout<<"  number="<<(p+i)->number;// 输出 当前item 的item项
        cout << endl;//  加个格式
    }
}

int main(int argc, char* argv[])
{
    PhoneBook a(10);     //定义obj,用10初始化

//下面的不用说了吧?
    a.setname(0,"aaaa");
    a.setname(1,"bbbb");
    a.setname(2,"cccc");
    a.setname(3,"dddd");
    a.setname(4,"eeee");

    a.setnumber("aaaa",1111);
    a.setnumber("bbbb",2222);
    a.setnumber("cccc",3333);
    a.setnumber("dddd",4444);
    a.setnumber("eeee",5555);

    a.print ();

    return 0;
}

#7
laigaoat20052011-05-14 23:31
只是运行结果有点让我意外。等明天再看。
#8
lyj232011-05-15 06:55
这段代码仔细看很简单的,基本上是基于对象设计中算容易的。
思考都挺简单。
没有容错处理,没有try块,catch块。
根本不用考虑对象会不会释放,建立会不会成功。。
#9
ccnky1232011-05-15 08:36
谢谢各位的答复。学习就是这样,基本知识要学扎实。我们老师可能比较忽悠人吧,我们不怕东西难。基础知识没学好,一上来就整本书的内容都用上了来写代码,哪个学生受得了?
#10
ccnky1232011-05-15 08:45
回复 8楼 lyj23
我的QQ75937176,请问可以加你好友吗?还想问您一些问题
1