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

新手求助 拷贝构造函数,内联成员函数,聚集?

guowei3758 发布于 2010-05-02 16:12, 1280 次点击
新手求助 拷贝构造函数,内联成员函数,聚集都是什么???
干什么的???
怎么用????
8 回复
#2
温度2010-05-03 02:49
拷贝构造函数是类
#3
guowei37582010-05-03 11:14
回复 2楼 温度
可否具体点啊。。。。。。这些都怎么用啊??
#4
2010-05-03 15:49
拷贝构造函数是用一个已存在的对象来初始化另一个对象,简单地说就是将一个对象中的内容“抄”进另一个对象中去。
例如:
class A
{
    ...
};
main()
{
    A a;
    ...
    A b(a);//或写成 A b=a;此时就调用了拷贝构造函数
}
其中,A是一个类,a是一个在开始就建立的对象。当需要建立另外一个对象b,并且希望用a来初始化b,“A b(a);”这样就调用拷贝构造函数了,于是对象b就与a完全一样了(在调用默认拷贝构造函数的情况下)。可能写成“A b=a;”更好理解(“A b=a;”与“A b(a);”等价)。就像普通基本数据类型一样,int a=5;int b=a;这时b的值就是5了,只不过现在不是基本数据类型int而变成了类A,当变成了类A时,就该调用拷贝构造函数了。可能你也许会问,既然功能一样,为什么还要编写和调用拷贝构造函数?的确,如果在类A中你没有自己编写拷贝构造函数,那么系统会自动生成一个“默认拷贝构造函数”,此函数作用就是将对象a中的内容完全“抄”进b中,这时对象a与b完全一样。但是我们知道,一个对象中的数据是有多个的,有时我们并不希望这样,我们希望b中只有一部分数据与A一样,这时就要自己编写拷贝构造函数了。打个比方,当老师要求交作业时,突然发现自己没有写,怎么办?拿别人的抄吧,我们抄作业时就相当于在调用拷贝构造函数,但是我们怎么抄?难到照着别人的作业一字不差的抄下来?难道连他的名字你也照抄?显然不可能,我们可能只抄他的一部分。所以很多情况下,我们要自己根据情况编写拷贝构造函数,什么该抄,什么不该抄!至于拷贝构造函数的具体怎么编写,这里就不再多说了,因为课本上讲的要详细得多。

内联成员函数其实很简单,就是将函数体的定义写在类中,或者在函数体定义前加上关键字inline。
聚集应该是UML语言中的概念,类与类之间有4种关系,依赖关系,作用关系,包含关系,继承关系。包含关系里面又分聚集和组合,也就是说聚集时包含关系的一种。
例如:
class point//点
{
    int x,y;//点坐标
};
class line//线
{
    point A,B;
};
我们知道,两点确定一条直线,上面的类line与类point就是一种聚集关系。
这里只是简述,深入了解请查阅有关UML的书籍。
初学者的话建议重点掌握拷贝构造函数!
希望对你有所帮助!
#5
南国利剑2010-05-03 19:40
拷贝构造函数是用一个旧的对象去初始化一个新的对象。
内联函数成员是在声明函数原型时同时给出函数的具体实现即函数体。
聚集时类与类之间的一种关系的描述。
建议你看看课本,这些课本里头都有很详细的说明。
#6
hduhjj2010-05-03 21:54
以下是引用南国利剑在2010-5-3 19:40:00的发言:

拷贝构造函数是用一个旧的对象去初始化一个新的对象。
内联函数成员是在声明函数原型时同时给出函数的具体实现即函数体。
聚集时类与类之间的一种关系的描述。
建议你看看课本,这些课本里头都有很详细的说明。
这位回答的比较全面,建议楼主好好看书,呵呵,编程急不来的,这些东西是最基本的知识,理解概念之后还要通过实际编程来加深理解;

楼上有说copy函数是“抄”,这个比喻很恰当的,但是在函数中有引用的时候,就不能说是“抄”了,而是创造出一个“基本数据部分相同,引用类型相同但目标不同”的对象,并且实现相同功能;

内联函数可以再声明是在声明之后即写出函数体,也可以用inline关键字,加在后面的函数体前,以实现与声明同时给出函数体同样的效果。
#7
guowei37582010-05-03 22:35
#include<iostream>
using namespace std;
enum paople_sex{m,f};
class date
{
private:
    int year;
    int month;
    int day;
public:
    date(int year,int month,int day);
    void birth()
    {
        cout<<"the birthday"<<endl;
        cout<<"please input the year:";
        cin>>year;
        cout<<"please input the month:";
        cin>>month;
        cout<<"please input the day:";
        cin>>day;
    }
    void print2()
    {
        cout<<year<<"."<<month<<"."<<day<<endl;
    }
    ~date();
};
class people
{
private:
    long int number;
    char sex;
    char id[20];
public:
    date b1;
    date b2(b1);
    people(long int number,char sex,char id[20]);
    void xinxi()
    {
            cout<<"please input the number:";
            cin>>number;
            cout<<"please input the sex:(m/f)";
            cin>>sex;
            cout<<"please input the id:";
            cin>>id;
            b1.birth();
    }
    void print1()
    {
        cout<<number<<endl
            <<sex<<endl
            <<id<<endl;
        b2.print2();
    }
    ~people();
};
void main()
{
    int i,n;
    system("color 9e");
    people p1[1000];
    people p2[1000](p1[1000]);
    cout<<"How many people?";
    cin>>n;
    for(i=0;i<n;i++)
    {
        p1[i].xinxi();
    }
    for(i=0;i<n;i++)
    {
        p2[i].print1();
    }
}
这个程序是输入员工信息,再输出(要求用到构造,析构,内联,拷贝构造,聚集)
貌似问题很严重
请各位帮忙改一下,先谢谢了
#8
2010-05-04 01:47
#include<iostream>
#include<stdlib.h>     //由于在主函数中出现了system("color 9e");因此要加该头文件
using namespace std;
enum paople_sex{m,f};//这个枚举类型好像没有用到
class date
{
private:
    int year;
    int month;
    int day;
public:
    date()//该构造函数没有定义函数体这是出错的主要原因之一 ,并且形参也有问题
    {
        year=0;month=0;day=0;     
    }
    void birth()
    {
        cout<<"the birthday"<<endl;
        cout<<"please input the year:";
        cin>>year;
        cout<<"please input the month:";
        cin>>month;
        cout<<"please input the day:";
        cin>>day;
    }
    void print2()
    {
        cout<<year<<"."<<month<<"."<<day<<endl;
    }
    ~date()//没有函数体的定义,这里只要加一对{}并把;删去就行了
    {}
};
class people
{
private:
    long int number;
    char sex;
    char id[20];
public:
    date b1;
    //date b2(b1);//这种写法错误,类中不能这样调用拷贝构造函数。所以该行要删去。
    people()//同样没有函数体的定义 ,形参也有问题
    {
            number=0;sex='\0';   
    }
    void xinxi()
    {
            cout<<"please input the number:";
            cin>>number;
            cout<<"please input the sex:(m/f)";
            cin>>sex;
            cout<<"please input the id:";
            cin>>id;
            b1.birth();
    }
    void print1()
    {
        cout<<number<<endl
            <<sex<<endl
            <<id<<endl;
        b1.print2();//删去了 b2所以改为b1
    }
    ~people()//少函数体的定义
    {}
};
int main()//标准C++规定main前面是int,并且末尾加上return 0;不然有的编译器会报错
{
    int i,n;
    system("color 9e");
    people p1[1000];
    //people p2[1000](p1[1000]);//调用默认拷贝构造函数不能是数组形式,所以这样是错误的。应该删去该行
    cout<<"How many people?";
    cin>>n;
    for(i=0;i<n;i++)
    {
        p1[i].xinxi();
    }
    for(i=0;i<n;i++)
    {
        p1[i].print1();//上面的那一句删去了,所以p2应当改为p1;
    }
    return 0;
}
上面的代码没有错误了,但是没有用到拷贝构造函数。至于怎么用请楼主自己想办法往里面添加吧,但要提醒楼主,不能以数组的形式调用默认拷贝构造函数,
像people p2[1000](p1[1000]);这样都是错误的。并且类中也不能出现像date b2(b1);类型得到语句!
希望对你有所帮助
#9
guowei37582010-05-04 17:45
呵呵,又学到了不少东西
另外,我用的是VC++,在用system("color 9e")时,好像不用加头文件,
而且在main前也可以用void,不过的确还是应该写标准的,我记住了,多谢了
1