java基础改学C++(七)类的进一步学习

一、构造方法


观察:

class  A{

    

    float   x,y;

    

public:

    //构造1:构造函数可以指定参数的缺省值

    A(float a,float b=1)x=a;  y=b;  }

    //构造2: 无参

    A() {    x=0y=0;  }

    void  Print(void) {cout<<x<<'\t'<<y<<endl;  }

    

};


int main(void){

    

    A  a1, a2, a3(3.07.0);

    a1.Print();

    a2.Print();

    a3.Print();


1、因为构造2的存在,构造1不能给俩参数都有默认值;

2、这个写法是错的:  A(float a=1,float b)x=a;   y=b;  } 第一个参数不能有默认值(规定)

3、全局对象,main函数执行之前调用构造函数

4、域不赋默认值 则是随机值,java是0或者false···


读个程序:

java基础改学C++(七)类的进一步学习


发现,两次调用f();只有一个静态A存在,不是覆盖上的,而是根本没调用第二次构造.和java一样,

一个方法不论被调几次,其内部的静态变量都是初始化1次,并在全局实例析构之前析构


再说一遍。。。new 运算符:返回地址  new运算符产生的动态对象,在不再使用这个对象时,必须用delete运算符来释放对象所占用的存储空间


demo:

class A{

    

public:

    

    int x,y;

    //this指针之前没说,就是java的this

    A(int x,int y){this->x = x;this->y = y;}

   

    void printx();

    //一种初始化方法:

    A(int a,int b,int c):x(a),y(b+c){

        //当需要初始化的数据成员较多时,这种方式更显其优越性.

    }

    //可以在这声明一个函数头,体在下面

    A();


    //析构函数:函数名与类名相同,前面加上字符 不能有参数、返回值,不指定函数类型,和构造方法一样 也 有默认的析构函数

    //一个类中,只能定义一个析构函数,析构函数不允许重载,回收对象时由系统自动调用

    ~A(){

  cout<<"a instance deinit";//方法体可以写类外,像构造方法一样

}


(一般地,)调用析构函数的次序正好与调用构造函数的次序相反。

};


A::A(){

    cout<<"NO para"<<endl;

}



void A::printx(){

    cout<<x<<endl;

}



int main(){

    

    A*a;

    a = newA(10,10);

    

    A a2(10,10,10);

    A*b = & a2;

    

    a->printx();

    b->printx();

    

    delete a;

//    new的必须delete,不new的不能delete

//    直接定义的变量是定义在栈里,随着函数的弹栈而释放

//    new出的东西定义在堆里,需要手动释放,系统不能回收new分配的动态存储空间


//引用变量,下面的 a45:

    A & a45 = a2;

//    注意:指针用->,引用 .

    a45.printx();

//C++与java相比,多了个指针,引用也是有的。声明格式: className & varietyName = instance

}

再看一个demo学习:

class Str{

    char *Sp;   int Length;

public:

    

    Str(char *string){

        if(string){

            Length=strlen(string);

            Sp=newchar[Length+1]; //在构造函数中将成员数据指针指向动态开辟的内存

            strcpy(Sp,string);   //用初值为开辟的内存赋值

        }else

            Sp=0;

    }

    

    void Show(){

        cout<<Sp<<endl;

    }

    

    ~Str(){

        if(Sp)

            delete []Sp; //析构函数,当释放对象时收回用new开辟的空间

    }

};


   对象如果用new运算符开辟了空间,则在类中应该定义一个析构函数,并在析构函数中使用delete删除由new分配的内存空间


int main(){

    Str s1("Study C++");

    s1.Show();

}


下面是附加的一个例子,不要求理解,因为要知道内存的细节,这里不解释了


class A{

    

public:

    

    int x,y;

    

    A(int x,int y):x(x),y(y){

        cout<<"an A instance init "<< endl;

    }

    ~A(){

        cout<<"an instance deinit"<<endl;

    }

    

    void printx();


};


void A::printx(){

    cout<<x<<endl;

}


class B{

    

public:

    

    int x,y;

    

    B(int x,int y):x(x),y(y){

        cout<<2<<"a B instance init"<<endl;

    }

    ~B(){

        cout<<"an instance deinit"<<endl;

    }

    

    void printx();

    

};


void B::printx(){

    cout<<x<<endl;

}


int main(){

    

    A*a =new A(10,20);

 

    delete a;

    

    a->printx();

    ((B*)a)->printx();

自己跑起来看看,打印:


an A instance init 

an instance deinit

10

10


神奇的内存==

}

先说到这 以后再补充 最近有别的事