C++ 构造函数

来源:互联网 发布:colorpicker mac 编辑:程序博客网 时间:2024/06/16 07:30

这篇博客将会介绍以下几个方面的内容

(会有遗漏,而且是初学者,可能表述不准确或者错误)

(本博客不权威,但是有自己的理解,如果有谁有不理解的地方或者发现错误  可以评论)

一c++中构造函数的定义:


二c++中构造函数的分类:


三c++中构造函数使用形式:


四构造函数何时调用,自动调用?手动调用?自动调用何种形式的构造函数?


一:构造函数的定义

     构造函数 ,是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。

1.1构造函数的功能:

   为对象分配空间;

   对数据成员赋初值;

   请求其他资源。

1.2构造函数的特点:

   1与类同名          2  无返回值     3构造函数可以有重载。  4分配内存时会自动调用(这句话必须深刻理解)或者手动调用指定的构造函数(涉及何种情况下调用何种构造函数)

       深刻理清第四个特点其实构造函数就没有问题了。


二:构造函数的分类

1.普通构造函数:有两个或两个以上参数的构造函数
2.默认构造函数
3.复制(拷贝)构造函数
4.类型转换构造函数


三构造函数的使用形式


class Employee{
public:

  Employee();                                          //默认构造函数的形式    //未写任何构造函数下  则系统自动分配这个构造函数。 可以自己编写
    Employee(char *n);                               //普通构造函数
 //   Employee(Employee &emp);              //这是拷贝构造函数的声明形式     //未写拷贝构造函数下  则系统自动分配这个拷贝构造函数。 可以自己编写
    ~Employee();

    int age;       //其实数据做成公用的并不合适,这个只是为了做样子
private:


   char *name;
};


Employee::Employee(){                   //如果未自己写其他构造函数(本例子中已经写了下面的构造函数,所以要写),这个函数可以不写,系统会默认分配一个空参数构造函数。
                                                             //当然如果没有采用空参数的构造函数生成的实例对象,本函数还是可以不写。但是本例子中有Employee tm1这个会调用; 

}                                               

Employee::Employee(char *n){
    name = new char[strlen(n)+1];
    strcpy(name,n);
}



Employee::Employee(Employee &emp){                   //拷贝构造函数
    int len=strlen(emp.name);
    name=new char[len+1];
    strcpy(name,emp.name);
}





Employee::void  copy_test1(Employee &tmp){              //自己所写的普通函数,将对构造函数有更进一部的认识。顺便带复习下&  引用传值。
    age=tmp.age;
}


Employee::void  copy_test2(Employee   tmp){              //自己所写的普通函数,与上个函数的区别仅仅在于 &
    age=tmp.age;
}


int main(){

    Employee tm1;            //此时内存中已经有分配这快空间,所以自动调用默认构造函数Employee::Employee()
    Employee emp1(“zhang”);        //内存分配空间。 调用Employee::Employee(char *n)构造函数

//调用拷贝构造函数的几种形式:

 
    Employee emp2(emp1);            //在没有重写拷贝构造函数的情况下         会  调用系统  自动分配的拷贝构造函数    //本例子已经重写        
    //Employee emp2=emp1;           //同上:调用  拷贝构造函数           //系统自动分配的拷贝构造函数  对于指针成员变量的拷贝会出现 的连体问题。建 议//自己重写 

   tm1.copytest1(emp1);              //这个函数并没有什么特别的。

  tm1.copytest2(emp1);              //这个函数首先会调用一个拷贝构造函数。将copytest2这个函数的形参实例化,也就是在copytest2的程序代码段前  复制一个emp1的副本,调  //用的是 拷贝构造函数。。。。。。。。。。。反正在内存中生成一个对象,也就是分配空间,必须调用构造函数。。   至于调用何种构造函数,由其调用的形式决定。。。这里的形式是进入其他函数,生成一个副本。

    return 0;
}

//拷贝构造函数说明(也就是下面所说的复制构造函数)

如果类中没有说明复制构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员
浅复制和深复制
浅)复制:将对象数据成员的值进行简单的复制(最好利用系统自动生成的复制构造函数,已完成浅复制(系统自动生成的复制构造函数是浅赋值。发现复制后的类  与 被复制的对象   指针类型的成员 所指向的一样。也就是指针变量里面的地址一样,free掉一个,对另外一个的内容也会造成破坏。。。。两个对象实际上在指针类型上是连体婴儿,而不是有独立的部分。)
深复制:不仅将对象数据成员的值进行复制,而且对指针型数据成员生成新空间,然后复制对应的值。(自己写的函数最好写成深拷贝,其实看意愿,担任我们肯定不希望指针部分连体)



0 0
原创粉丝点击