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

【大家好】程序中有一部分 我实在想不明白【定义对象和初始化和一合并?】

JackyZhang 发布于 2011-04-29 08:11, 368 次点击
程序代码:
#include<iostream>
using namespace std;
//定义类
class Arr
{
    int m;  //数组实际元素个数
    int a[100];
public:
    Arr(int x[],int size)//构造函数,用size始化m,用参数x初始化数组a
    {
        m=size;
        for(int i=0;i<m;i++)
            a[i]=x[i];
    }

    void delsame();

    void show()
    {
        for(int i=0;i<m;i++)
        {
            cout<<a[i]<<"\t";
            if((i+1)%5==0)
                cout<<endl;
        }
        cout<<endl;
    }
};
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
//定义类内函数delsame()
void Arr::delsame()//删除重复数据
{
    int i,j;
    for(i=0;i<m-1;i++)
    {
        if(a[i]==a[i+1])
        {
            for(j=i+1;j<m-1;j++)
            {
                a[j]=a[j+1];
            }
            m--;//删除一个数据后元素个数减一
            i--;//可能出现连续多个相同的数,so 继续判断当前元素
        }                                                                                                                    
    }
}
//主函数
int main()
{
    int b[16]={1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10};
    Arr v(b,sizeof(b)/sizeof(b[0]));//此行我想不懂
    v.show();//显示原数组
    v.delsame();
    v.show();//显示结果数组
    return 0;
}


我想问的有两点:(1)关于sizeof,我记得sizeof(数组)得到的是数组中的元素个数,而b数组中的元素个数是已知的,是不是可能这样做:Arr v(b,16);
(2)Arr是类也是构造函数,从程序中可以看出v是定义的对象了,那为什么可以这样定义 Arr v(b,sizeof(b)/sizeof(b[0]));难道Arr在此处可以初始化,还可以定义对象吗?C++中有这种语法吗?
3 回复
#2
laigaoat20052011-04-29 09:09
1)关于sizeof,我记得sizeof(数组)得到的是数组中的元素个数,而b数组中的元素个数是已知的,是不是可能这样做:Arr v(b,16);
sizeof(数组不是求元素个数,是得到数据所占有的字节数)


(2)Arr是类也是构造函数,从程序中可以看出v是定义的对象了,那为什么可以这样定义 Arr v(b,sizeof(b)/sizeof(b[0]));难道Arr在此处可以初始化,还可以定义对象吗?C++中有这种语法吗?

Arr  (int x[],int size                    )//构造函数,用size始化m,用参数x初始化数组a
Wrr:构造函数名  int x[] 形式参数,在本例中用来接收数组b   size  也是形式参数在本例中用来接收
sizeof(b)/sizeof(b[0]) 的计算结果


Arr v(    b  ,    sizeof(b)/sizeof(b[0])  );
Arr 类型名。 v 类型变量  b 第一个实际参数,传递给形式参数int x[],
       sizeof(b)/sizeof(b[0]) 第二个实际参数 传递给形式参数int size,
这个语句的意思是:新建一个arr类的变量,名为 v,它用b和后面的sizeof(b)/sizeof(b[0])表达式的值初始化
#3
pangding2011-04-29 09:49
嗯。楼上正解。

1) 像楼主这种情况,写 Arr v(b, 16) 也行。不过如果将来改源代码的话,增加或者减少点 b 的元素,那么下面这行也得跟着改。而用 sizeof 则不用担心。
2) 这个也说的很清楚。在定义对象的时候要调用构造函数。像楼主这种没有默认构造函数的情况,不写参数还不行呢。
#4
JackyZhang2011-04-29 10:26
回复 3楼 pangding
thx ,i see
1