C++ 为什么这里不调用显式构造函数?

C++ 为什么这里不调用显式构造函数?,c++,class,constructor,C++,Class,Constructor,我对本课程有两个问题: 为什么我不能使用标记为问题1的注释结构。调用的是复制构造函数而不是显式构造函数(据我所知,编译器调用构造函数时签名并不含糊) 我是否必须对问题2中分配的指针使用“delete[]p”,或者析构函数是否会自动删除它 我是新来上课的,我正在努力掌握窍门,所以提前谢谢你 #include <iostream> using namespace std; #define DIM 2 class Complex { double re, im; ch

我对本课程有两个问题:

  • 为什么我不能使用标记为问题1的注释结构。调用的是复制构造函数而不是显式构造函数(据我所知,编译器调用构造函数时签名并不含糊)

  • 我是否必须对问题2中分配的指针使用“delete[]p”,或者析构函数是否会自动删除它

  • 我是新来上课的,我正在努力掌握窍门,所以提前谢谢你

    #include <iostream>
    using namespace std;
    
    #define DIM 2
    
    class Complex {
    
        double re, im;
        char *name;
    
    public:
    
        Complex(double re = 1.0, double im = 1.0) {
    
            Complex::name = new char[9];
            Complex::re = re;
            Complex::im = im;
    
        }//constructor
    
        Complex(const Complex &aux) {
    
            re = aux.re;
            im = aux.im;
            name = aux.name;
    
        }//copy constructor
    
        void setReal(double re);
        void setImag(double im);
        void setName(char name[9]);
        double getReal();
        double getImag();
        char *getName();
        Complex sum(Complex);
        Complex dif(Complex);
        Complex multi(Complex);
        Complex div(Complex);
    
        ~Complex() {
    
        }//destructor
    
    };
    
    void main() {
    
        Complex *p = new Complex[DIM];  //QUESTION 2        
                                        //Is the destructor called or do I have do use delete []p ?
        char *name[DIM];
    
        for (int i = 0; i < DIM; i++) {
    
        //data input    
    
        }
    
        for (int i = 0; i < DIM; i++)       //freeing memory
    
            delete name[i];
    
        //Complex sum(), dif(), prod(), div();              //QUESTION 1
                                                            //why is this calling the copy constructor instead of the explicit 
                                                            //constructor with the deault parameters ?  
        Complex sum(*p), dif(*p), prod(*p), div(*p);    //initialising with the first element using copy constructor    
    
        for (int i = 1; i < DIM; i++) {
    
            sum=sum.sum(*(p+i));        
            dif = dif.dif(*(p + i));
            prod = prod.multi(*(p + i));
            div = div.div(*(p + i));
    
        }
    
    //some data output
    
        //delete[]p;
    
    }//end main
    
    #包括
    使用名称空间std;
    #定义尺寸2
    阶级情结{
    双re,im;
    字符*名称;
    公众:
    复杂(双re=1.0,双im=1.0){
    Complex::name=新字符[9];
    复合::re=re;
    复合::im=im;
    }//建造师
    综合设施(综合设施和辅助设施){
    re=辅助re;
    im=辅助im;
    name=aux.name;
    }//复制构造函数
    void setReal(双re);
    无效设置标记(双im);
    void setName(字符名[9]);
    双getReal();
    双getImag();
    char*getName();
    复数和(复数);
    复合dif(Complex);
    复杂多(复杂);
    复杂组(复杂组);
    ~Complex(){
    }//析构函数
    };
    void main(){
    复数*p=新复数[DIM];//问题2
    //是调用析构函数还是必须使用delete[]p?
    字符*名称[DIM];
    对于(int i=0;i
    对于第二个问题,您必须设置一个循环来删除每个对象的
    名称
    成员变量,或者为类编写解构器并使用
    delete[]p

    此处的行:

    Complex sum(), dif(), prod(), div();
    
    未创建
    复杂变量
    sum
    dif
    prod
    div
    。它实际上声明了4个函数,这些函数不带任何参数,并返回一个
    复合体。声明如下:

    Complex sum, dif, prod, div;
    

    哪个按预期工作

    你能把代码缩小一点吗?好的,只需一秒钟。任何时候你使用
    new
    ,都需要相应的
    delete
    ;否则会泄漏内存。另外:不要使用
    void main()
    ;它不是合法的C++。改用
    int main()
    。好的,谢谢。我使用ValueMin(),因为我在大学里做这个,我们使用VisualStudio(我注意到,当我试图在XCODE中写一些C++时,这是非法的)。代码>否解构器应该是
    删除名称
    和在主代码中,当您要删除对象数组时,只需键入
    delete[]p
    @mask no,它应该是
    delete[]name
    ,因为它是用
    new[]