文章目录
目录
前言
随着社会的不断发展,出现了很多的编程语言,但是大部分的代码的底层还是C语言与C++的相关函数,所以学好C++是很有必要的。本文就将继续接着前面七篇的学习笔记进行下面的知识梳理。本篇笔记内容如下:常对象和常方法,拷贝构造函数。
提示:以下是本篇文章正文内容
一、常对象和常方法
1 常对象:
1.1 常对象的定义:
由const修饰的类型对象或者引用类型对象就是常对象
1.2 常对象的特性:
①不可以修改本对象的相应属性
②不可以调用类中的普通方法,即常对象只能调用常方法
2 常方法:
类中的成员函数的函数体由const修饰,其本质是修饰的成员函数隐藏的this指针类型
2.1 常方法的语法形式
class 类名
{
成员函数(行参列表)const //常方法:本质是修饰this指针
{
//在这常方法函数体中不可以出现类对象中属性的修改
//属性可以被读取
}
}
2.2 常对象与常方法举例
//还是采用学生的类进行举例说明
class Stu
{
public:
string name;
int score;
public:
Stu() = default;
stu(string name, int score)
{
this ->name = name;
this ->score = score;
}
void showInfo()const //const修饰的是隐藏的this指针,
//此时就不能在函数中通过赋值修改属性.
{
//需要注意的是全局函数中因为没有this指针,所以不能利用const修饰
cout << “姓名:” << this->name << “成绩:” << this ->score <<endl;
}
};
//主函数中
Stu stu("xiaobai",100);
stu.showInfo;
二、拷贝构造函数
1.拷贝构造函数的分类
拷贝构造函数分为两类,一类是深拷贝,另一类是浅拷贝。这两者的区别请看下文介绍。
2.编译器所提供的默认拷贝构造形式就是浅拷贝
class 类名
{
public:
类名(const 类名& other)
{
this -> 本对象属性 ... = other.其它对象属性....
}
};
举例说明:
//还是采用学生的类
class Stu
{
private:
string name;
int score;
public:
Stu() = default; //C++11提供的一种构造默认构造函数的方式
Stu(string name, int score)
{
this->name = name;
this->score = score;
}
void showInfo()const
{
cout << "姓名:" << this->name << ",成绩:" << this->score << endl;
}
~Stu()
{
if(this->p != nullptr)
{
delete [] p;
}
}
//编译器提供默认拷贝构造形式:浅拷贝。
Stu(const Stu& other) //拷贝构造和其他的构造函数也构成了重载的关系
{
this->name = other.name;
this->score = other.score;
}//主函数中
Stu stu(“xiaobai”,100);
stu.showInfo();
Stu stu1 = stu; //此时stu1打印出来是姓名:xiaobai,成绩:100
3.深拷贝
当类中有着有指针属性的时候,就不能使用浅拷贝,此时就引入了深拷贝的概念。
如果使用浅拷贝的话,此时两个对象的指针指向了同一处的地址空间,如果stu不用了使用delete释放空间,此时会先利用析构将p指针指向的空间析构掉,会导致stu1中的指针变成野指针。
如果此时在将stu1利用delete释放掉,会造成double free的错误。为了避免这个错误,C++提供了深拷贝。
//引用上面浅构造的例子,在拷贝构造中添加如下
Stu(const Stu& other) //拷贝构造和其他的构造函数也构成了重载的关系
{
this->name = other.name;
this->score = other.score;this->p = new int[1024]; //拷贝原空间中的数据到新的空间之中:
memcpy(this->p, other.p,sizeof(int[1024]));
}
注意:拷贝构造的调用时机有下面的三点:
1.当定义的本对象使用其它已经构建好的对象进行初始化。
2.当函数传参时,如果参数为类类型,那么将自动调用拷贝构造。
3.当函数返回值为类类型时,那么将自动调用拷贝构造。
总结
以上就是今天要整理的内容,本文简单介绍了拷贝构造函数和常对象和常方法的使用。希望博主整理的知识点能帮助到需要的朋友们。如果发现有问题的地方,请在评论区或者私信帮我指出来,谢谢。