c++学习3--拷贝构造函数

来源:互联网 发布:霸气业务网站源码 编辑:程序博客网 时间:2024/05/22 20:19

昨天看了一下关于拷贝构造函数和赋值构造函数的内容。自己总结了一下拷贝构造函数。

1.自定义的拷贝构造函数中第一个形参一定要为类的引用,后面可以带别的参数。一个类可以有多个拷贝构造函数。

2.一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数。这个默认的参数可能为 X::X(const X&)或 X::X(X&),由编译器根据上下文决定选择哪一个。同事默认拷贝构造函数是不处理静态成员变量的。

3.拷贝构造函数的调用分为三种情况

    1.以对象作为函数参数 2.以对象作为函数返回值 3.用对象初始化另一个对象

4.如果不想让拷贝函数发生,可以主动将拷贝函数声明为私有的

5.拷贝构造函数不处理静态成员变量

6.如果没有自定义赋值构造函数,x x2=x1其实是在调用拷贝构造函数

7.拷贝构造函数存在深拷贝和浅拷贝问题 可以参照 http://blog.csdn.net/lwbeyond/article/details/6202256讲的很详细。

主要是拷贝构造函数对于非基本类型成员变量或者动态申请的变量,是指向同一个内存区域的,会造成不同类修改相互影响以及析构时多次重复析构。

#include <iostream>
#include <string.h>
using namespace std;
static int k=1;


class x
{
public :
int temp;
static int num;
int * p;//指针变量


x(int temp)
{
this->temp=temp;
p=new int(100);//动态申请
cout<<"我的构造函数"<<temp<<endl;
num++;
}


x(x& t)//拷贝构造函数的参数一定是引用,不能不是引用,不然会出现无限递归

{
temp=t.temp+k;
k++;
cout<<temp<<"拷贝构造"<<endl;
p=new int;//重新申请新的内存
*p=*(t.p);//但是指向的内容我们一致
num++;//默认拷贝构造函数不处理静态成员变量num,自定义拷贝构造函数要手动处理
}


~x()
{
cout<<temp<<"我的析构函数"<<endl;
num--;
if(p != NULL)  
        {  
            delete p;  
        }  
}
};


x a(x t)
{
t.temp=100;
cout<<"此时对象个数"<<x::num<<endl;
return t;


}
int x::num=0;//这里要注意,类的静态成员变量在使用前必须先初始化。
int main()
{
   
    x x1(10);//k=1
cout<<"x1 "<<x1.temp<<" "<<"p的值"<<*(x1.p)<<endl;
x x2=x1;//拷贝函数 以对象初始化另一个对象  k=2
x x3(x1);//拷贝函数 以对象初始化另一个对象 k=3
cout<<"x2 "<<x2.temp<<" "<<"p的值"<<*(x2.p)<<endl;
cout<<"x3 "<<x3.temp<<" "<<"p的值"<<*(x3.p)<<endl;


cout<<"此时对象个数"<<x::num<<endl;


x x4=a(x1);//x1拷贝给参数t,  以对象初始化另一个对象  k=4
          //返回t时创建一个变量t',用t进行拷贝,t‘.temp=t.temp+k=100+4  以对象作为函数返回值 k=5
cout<<"x4 "<<x4.temp<<endl;


cout<<"此时对象个数"<<x::num<<endl;
    return 0;
}
0 0
原创粉丝点击