首先定义一个类进行操作。
1
2
3
4
5
6
7
|
class MM
{
public :
protected :
int year;
string name;
}
|
构造函数在类中默认有一个无参的构造函数
默认的构造函数为 类名(){};这个构造函数
如果直接写了构造函数那么这个构造函数将会没有
构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class MM
{
public :
//MM() {};//无参构造函数
MM( int year, string name) :year(year), name(name) {};
//有参构造函数 在定义对象的时候必须传参数,没参数会报错
MM( int year, string name)
{
this ->name = name;
this ->year = year;
} //这两个是一样的
MM( int year, string name = "" ) :year(year) {};
//因为string 是缺省的 如果写没有构造默认为空
就是 MM mm(15);这里mm对象year=15 name=“”;
//缺省只能左边到右边
protected :
int year;
string name;
};
|
析构函数
MM(){};就是对构建的对象进行销毁
析构函数的使用是一个自动调用的过程不需要人为进行,当对象的生命周期结束自动释放
//析构函数需要注意的点
1.当对象存在指针的时候使用析构函数时,析构函数里面需要释放指针的指向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class MM
{
public :
MM( const char * str)
{
strcpy ( this ->str, str);
}
~MM() { delete [] str; };
//这里需要释放str内存不然析构函数只会释放类不会释放str
protected :
int year;
string name;
char * str;
};
int main()
{
MM mm( "kkk" );
return 0;
}
|
如果类中没有指针就不用在析构函数中去释放指针指向
拷贝构造(对对象进行赋值)//直接调用拷贝构造不调用构造函数
1
2
3
4
5
6
|
MM mm(15, "kkk" );
//拷贝构造的二种方式对对象进行赋值
MM mm1(mm);
MM mm2 = mm;
mm1.printfMM();
mm2.printfMM();
|
如果是通过匿名创建时匿名对象调用构造函数
1
2
|
MM mm3 = MM(16, "jfsdl" );
mm3.printfMM();
|
然后匿名对象赋值给对象调用的是拷贝构造函数
拷贝构造之深拷贝和浅拷贝
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//浅拷贝 默认也是浅拷贝就是赋值拷贝
MM( const MM&object)
{
this ->str = object.str;
}
//深拷贝
//深拷贝就是通过指针申请指向然后进行赋值
MM( const MM& object)
{
int len = strlen (object.str) + 1;
this ->str = new char [len];
strcpy (str, object.str);
}
|
深浅拷贝区别
浅拷贝就是进行了赋值操作
深拷贝是通过申请指针后再进行赋值(深拷贝析构函数要释放申请的指针)
谢谢大家的阅读,如有不足请及时指出,万分感激
以上就是C++编程析构函数拷贝构造函数使用示例详解的详细内容,更多关于C++编程析构函数拷贝构造函数的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/weixin_56366633/article/details/121375596