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

什么时候在创立对象时后边必须要加初始化?

troyzyc 发布于 2018-04-16 21:52, 2017 次点击
自己写了一个简单的插入排序:

#include<iostream>
using namespace std;

class Cha
{
    public:
        Cha();  //如果我不写这个默认构造函数,那么main函数中Cha obj; 就没有问题;可是我一写上这句,就在 main函数中Cha obj; 这句出错。但是 写为Cha obj(5);就没问题了,这是为什么?为什么一定要加一个初始赋值?
        Cha(int a=5);
        
        void chasort();
        ~Cha();
        void Show();
    private:
        int *p;
        int n;
};

Cha::Cha()
{
   
}

Cha::Cha(int a)
{
    cout<<"输入数据元素个数n=";
    cin>>a;
    n=a;
    p=new int [n];
    cout<<"依次输入数据内容:";
    for(int i=0;i<n;i++) //初始化了一组数据
        cin>>p[i];
}

void Cha::chasort()
{
    int i,j,t,temp;
    for(i=1;i<n;i++)
    {
        for(j=0;j<=i-1;j++)
        {
            t=p[i];
            temp=i;
            if(p[i]<p[j])
            {
                while(i>=j+1)
                {
                    p[i]=p[i-1];
                    i--;
                }
                i=temp;
                p[j]=t;
            }

        }
    }
}

Cha::~Cha()
{
    delete[]p;
    cout<<"释放该组数据"<<endl;
}

void Cha::Show()
{
    for(int i=0;i<n;i++)
        cout<<p[i]<<" ";
    cout<<endl;
}

int main()
{
    Cha obj;   //这句总是出错
    obj.chasort();
    obj.Show();
    return 0;
}
5 回复
#2
rjsp2018-04-17 00:13
对于 Cha obj; 这句,编译期猜不出你是想调用无参数的那个构造函数,还是缺省参数为5的那个函数
#3
troyzyc2018-04-17 08:10
回复 2楼 rjsp
我写了Cha obj; 无参,难道计算机不认为我是调用无参的构造函数吗?就算是调用了默认构造函数在之后计算不出结果,也应该走无参构造函数吧?
#4
rjsp2018-04-17 08:18
回复 3楼 troyzyc
为什么?
Cha(int a=5); 的意思就是 用户不给参数的情况下自动给一个参数5 ,也就是 Cha obj; 等同于 Cha obj(5);
#5
rjsp2018-04-17 08:22
换句话说,假如 Cha obj; 应该调用无参构造函数的话,那么 Cha(int a=5); 中这个缺省函数什么时候起作用?
#6
troyzyc2018-04-17 08:31
回复 5楼 rjsp
明白了,多谢大神屡次指教,顿悟的感觉!!!
1