北大 C++ 2.6 构造函数

2.6构造函数

构造函数的定义----成员函数的一种

  • l  名字和类相同,可以有参数,不能有返回值(void也不行)
  • 作用是对对象进行初始化,给成员变量赋初值
  • l  如果定义类时没有写构造函数,则编译器生成一个默认的无参数的构造函数

 默认构造函数无参数,不做任何操作

  • l  如果定义了构造函数,则编译器不生成默认的无参数的构造函数
  • 对象生成时构造函数自动被调用。对象一旦生成,就再也不能再其上执行构造函数

只要有对象生成,不管以何种方式生成的时候,必须会调用构造函数。

  • l  一个类可以有多个构造函数


为什么需要构造函数

      1)构造函数执行必要的初始化工作,有了构造函数,就不必专门再写初始化函数,也不用担心忘记调用初始化函数。

      2)有时对象没被初始化就使用,会导致程序出错。

例1. classComplex {

      private:

           double real,imag;

      public:

           void Set(double r,double i);

};

Complex c1;

Complex *pc = newComplex; //这里同样也是需要用默认构造函数。

例2.

class Complex{

      private:

           double real,imag;

      public:

           Complex(double r,double i = 0);

};

 

Complex::Complex(doubler, double i){

      real = r;

      imag = i;

}

 

Complex c1;//error, 缺少构造函数的参数。

Complex *pc = newComplex; // error, 没有参数。

Complex cl(2); //OK

Complexc1(2,3),c2(3,5); OK

Complex *pc = newComplex(3,4 );

一个类可以有多个构造函数,参数个数或者参数类型不同

class Complex {

      private:

           double real,imag;

      public:

           void Set(double r, double i);

           Complex(double r, double i);

           Complex(double r);

           Complex(Complex cl,Complex c2);

};

 

Complex::Complex(doubler, double i){

      real = r;

      imag = i;

}

 

Complex::Complex(doubler){

      real r; imag = 0;

}

 

Complex::Comple(Complexc1,Complex c2){

      real = c1.real + c2.real;

      imag = c1.imag + c2.imag;

}

 

Complex c1(3),c2(1,0), c3(c1,c2);

 

构造函数在对象数组中的使用

#include<iostream>
using namespacestd;
 
class CSample {
      int x;
public:
      CSample(){
           cout<<"Constuctor 1Called"<<endl;
    }
    CSample(int n){
        x = n;
        cout<<"Constructor 2Called"<<endl;
    }
};
 
int main(){
      CSample array1[2];
      cout<<"step1"<<endl;
      CSample array2[2]={4,5};
      cout<<"step2"<<endl;
      CSample array3[2] = {3};
    cout<<"step3"<<endl;
    CSample *array4 = new CSample[2];
    delete [] array4;
    cout<<"step4"<<endl;
    array4 = new CSample[2]{2,3};
    delete [] array4;
    cout<<"step5"<<endl;
    array4 = new CSample[2]{1};
    delete [] array4;
    cout<<"step6"<<endl;
    return 0;
}


例3.

#include <iostream>
using namespace std;

class Test{
	public:
		Test(int n){  } //(1)
		Test(int n,int m){  }//(2)
		Test(){  }//(3)
};


int main{
    Test array1[3] = {1,Test(1,2)};
    //数组里面的三个元素分别用(1),(2),(3)进行初始化
    Test array2[3] = {Test(2,3),Test(1,2),1};
    //(2),(2),(1)
    Test *parray[3] = {new Test(4),new Test(1,2)};
    //只生成了2个对象。
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值