美文网首页
C++ - 构造函数

C++ - 构造函数

作者: Mitchell | 来源:发表于2016-01-14 14:57 被阅读236次

    概念

    • 成员函数的一种
      • 名字与类名相同,可以有参数,不能有返回值(void 也不行)
      • 作用是对对象进行初始化,如给成员变量赋初值
      • 如果定义类的时候没有写构造函数,则编译器生成一个默认的无参数的构造函数
        • 默认的构造函数无参数,不做任何操作.
    • 如果定义了构造函数,则编译器不生成默认的无参数的构造函数.
    • 对象生成的时候构造函数自动被调用. 对象一旦生成, 就再也不能在其上执行构造函数
    • 一个类可以有多个构造函数
    • 注意: 对象初始化时在内存的分配并不是由构造函数来完成,构造函数只是执行对象的初始化的工作。
    • 为什么需要构造函数:
      • 构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用再担心忘记调用初始化函数。
      • 有时候对象没被初始化就使用,会导致程序出错。
    class Complex{
        private:
                double real,image;
        public:
                void Set(double r,double i);
    };
    Complex c1;//调用默认生成的构造函数
    Complex * pc = new Complex;
    
    class Comples{
        private:
                  double real,image;
        public:
                  Complex( double r,double i = 0);//自定义构造函数,这个时候就不会再生成默认的构造函数。
    };
    Complex::Complex( double r,double i){
        real = r;image = i;
    }
    //调用
    Complex c1;//error ,缺少构造函数的参数
    Complex *pc = new Complex;//error,没有参数
    Complex c1(2); //OK
    Complex c1(2,4),c2(3,5); //OK
    Complex *pc = new Complex(3,4);//OK
    
    • 一个类可以有多个构造函数,参数个数或者类型不同
    class Complex{
          private:
                  double real,imag;
          public:
                  void Set(double r,double i);
                  Complex(double r,double i);
                  Complex(double r);
                  Complex(Complex c1,Complex c2);
    };
    Complex::Complex(double r,double i)
    {
          real = r; imag = i;
    }
    Complex::Complex(double r)
    {
          real = r; imag = 0;
    }
    Complex::Complex(Complex c1, Complex c2)
    {
          real = c1.real + c2.real;
           imag = c1.imag + c2.imag;
    }
    Complex c1(3),c2(1,0),c3(c1,c2);
    
    • 构造函数在数组中的使用
    class CSample{
            int x;
    public:
            CSample() {
                    cout<<"Constructor 1 Called" <<endl;
             }
             CSample(int n){
                    x = n;
                    cout<<"Constructor 2 Called"<<endl;
            }
    }
    //调用
    int main(){
    //创建 CSample 的数组,由于没有传递任何参数,默认是用无参数的构造函数进行初始化
        CSample array1[2];
        cout<<"step1"<<endl;
    //传递了两个参数,所以两个元素都是由有参数的构造函数来进行初始化
        CSample array2[2] = {4,5};
        cout<<"step2"<<endl;
    //第一个元素使用有参数,第二个使用无参数
        CSample array3[2] = {3};
        cout<<"step3"<<endl;
    //两个都为无参数
        CSample * array4 = new Sample[2];
        delete []array4;
        return();
    }
    
    • 构造函数在对象数组与指针数组之间的区别
    class Test {
          public:
                  Test(itn n){}
                  Test(itn n ,int m){}
                  Test(){}
    };
    //初始化对象数组,每个元素都会调用构造函数,如果有参数调用有参数的构造函数,如果没有参数则调用无参构造函数
    Test array1[3] = {1,Test(1,2)};
    Test array2[3] = {Test(2,3),Test(1,2),1};
    //初始化指针数组,以为数组的内容都是指针,不会自动调用对象的构造函数,只有调用才会生成,不调用指针就会为 NULL。
    Test *pArray[3] = {new Test(4),new Test(1,2)};
    

    注意:
    - 对象数组初始化,每个数组中的对象都会调用构造函数。
    - 指针数组初始化,只有创建过对象的位置的指针会被赋值,否则指针会为 NULL。
    - new 创建的对象在堆内存上,可以通过指针在不同对象和函数之间传递,而函数中声明的对象是在栈内存上创建的,要想在作用域外使用必须复制(包括返回值也是赋值),因为作用域一旦结束,栈内存上的对象都析构了。而堆内存上的对象都要手动删除(除非用智能指针),而且手动删除前对象是保证可以被任何拥有该指针的函数访问的。另外堆内存的可用空间比栈内存大的多。


    相关文章

      网友评论

          本文标题:C++ - 构造函数

          本文链接:https://www.haomeiwen.com/subject/jtthkttx.html