上一篇博客学的默认成员函数是类和对象的最重要的内容,相信大家已经掌握了吧,这一篇博客接着继续剩下的内容,加油!
目录
一、const修饰成员函数(理解)
1.0 引入
先看代码:
#include <iostream>
using namespace std;
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
void func( Date d) 这里的形参为对象,它会进行调用一次拷贝构造
{
d.Print();
}
int main()
{
Date d1(2024, 7, 20);
func(d1); 这里直接传递的是对象
return 0;
}
程序运行结果:、
再看代码:
#include <iostream>
using namespace std;
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
void func( const Date& d) 这里的形参为对象的引用/别名,它就是d1的别名,同一个实体,不会进行拷贝构造 加const代表我引用这个对象,但是我不会通过引用从而修改这个对象!
{
d.Print();
}
int main()
{
Date d1(2024, 7, 20);
func(d1); 这里直接传递的是对象
return 0;
}
程序运行结果:
为什么会是上面的结果???
其实,这就是我们在入门阶段学习的指针的相互赋值,指针的能力不能出现扩张,这样编译器会报错!那又该如何解决呢? 这便引入了要学习的const成员。
void Print() const // void Print(const Date* this )
{
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
1.1 概念
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数 隐含的this指针,表明在该成员函数中不能对类的任何成员变量进行修改。(const修饰的指针)比如:_year= 2026; (编译器底层:this->_year=2026;) 这是不允许的!
复习:
- const Date* p1 : const修饰的是指针指向的对象,也就是说不可以通过这个指针来修改对象的数据!
- Date const * p2 : 和上面的一样,const修饰的是指针指向的对象,也就是说不可以通过这个指针来修改对象的数据!
- Date * const p3 : const修饰的是指针p3本身,也就是说,不可以修改指针的指向!
- const Date* const p4: const既修饰指针指向的对象,也就是说不可以通过这个指针来修改对象的数据!也修饰了指针p3本身,也就是说,不可以修改指针的指向!(双重限定)
1.2 总结
1.2.1 对象调用成员函数
1. const对象可以调用非const成员函数吗?
不可以。
const
对象只能调用const
成员函数,因为const
对象不能被修改,而非const
成员函数可能会修改对象的状态。
class MyClass
{
public:
void nonConstFunc()
{
// 修改对象状态的代码
}
void constFunc() const
{
// 不修改对象状态的代码
}
};
int main()
{
const MyClass obj;
obj.constFunc(); // 可以调用
obj.nonConstFunc(); // 编译错误
return 0;
}
2. 非const对象可以调用const成员函数吗?
可以。非
const
对象可以调用const
成员函数,因为const
成员函数保证不会修改对象的状态。
class MyClass
{
public:
void nonConstFunc()
{
// 修改对象状态的代码
}
void constFunc() const
{
// 不修改对象状态的代码
}
};
int main()
{
MyClass obj;
obj.constFunc(); // 可以调用
obj.nonConstFunc(); // 也可以调用
return 0;
}
1.2.2 成员函数调用成员函数
1. const成员函数内可以调用其它的非const成员函数吗?
<