LInux C++学习day05 this指针和常成员函数(常函数) 析构函数(Destructor) 拷贝构造和拷贝赋值

补充需要显式使用初始化列表的场景:
–》类中包含引用或const型的成员变量,必须要使用初始化列表来初始化.
–》成员变量的初始化顺序由声明顺序决定,而与初始化列表的顺序无关,所以不要使用一个成员变量去初始化另一个成员变量.


一 this指针和常成员函数(常函数)
1 this指针
1)类中的成员函数(包括构造函数、析构函数)中都隐藏一个当前类类型的指针参数,名为this,在成员函数中访问类中的其它成员,本质都是通过this来实现的:
–》对于普通的成员函数,this指向调用该函数的对象
–》对于构造函数,this指向正在创建的对象
class A{
public:
int m_data;
//void print(A* this)
void print(void){
//cout << this->m_data << endl
cout << m_data << endl;
}
};

2)需要显式使用this指针的场景
–》区分作用域
–》从成员函数中返回调用自身(返回自引用)//重点掌握
–》从类的内部销毁对象自身(对象自销毁)
–》作为成员函数的实参,实现对象间交互//了解

2 常成员函数
1)在一个成员函数参数表后面加const修改,即为常成员函数函数:
返回类型 函数名(形参表) const {…}
2)常成员函数中this是一个常量指针,不能在常函数中修改成员变量的值
注:被mutable关键字修饰的成员变量,可以在常函数中直接修改。

3)非const对象既可以调用常函数也可以调用非常函数,但是常对象只能调用常函数,不能调用非常函数.//重要
注:常对象也包括常指针和常引用

4)同一个类中,函数名和形参表相同的成员函数,其常版本和非常版本可以构成重载关系,常对象匹配常版本,非常对象匹配非常版本.

二 析构函数(Destructor)
1 语法
class 类名{
~类名(void){
//主要负责清理对象生命周期中的动态资源
}
};
1)函数名一定"~类名"
2)没有返回类型,也没有参数
3)析构函数不能重载,一个类只能有一个析构函数

2 当对象被销毁时,该类的析构函数自动被调用和执行
–》栈对象,离开所在作用域时,其析构函数被作用域终止的右花括号调用.
–》堆对象,其析构函数被delete操作符调用

3 如果类中没有显式定义析构函数,那么编译器会为该类提供一个缺省析构函数:
1)对于基本类型的成员变量什么也不做
2)对于类类型的成员变量(成员子对象),会自动调用相应类析构函数

4 对象的创建和销毁的过程
1)创建过程
–》分配内存
–》构造成员子对象(按声明顺序)
–》执行构造函数代码

2)销毁过程
–》执行析构函数代码
–》析构成员子对象(按声明逆序)
–》释放内存

三 拷贝构造和拷贝赋值
1 浅拷贝和深拷贝
1)如果类中包含指针形式的成员变量,缺省的拷贝构造函数只是复制了指针变量本身,没有复制指针所指向的内容,这种拷贝方式称为浅拷贝.
2)浅拷贝将导致不同对象间的数据共享,如果数据在堆区,析构时还可能会出现“double free”的错误,导致进程终止,所以必须自己定义一个支持复制指针所指向内容的拷贝构造函数,即深拷贝.

猜你喜欢

转载自blog.csdn.net/weixin_43789711/article/details/90113462
今日推荐