文章目录
- 常量对象和非常量对象(常量对象不能调用非常量成员函数)
- 常量成员函数(常量成员函数不能修改类的数据成员;常量成员函数只能调用常量成员函数,不能调用非常量成员函数)
常量对象和非常量对象(常量对象不能调用非常量成员函数)
在C++中,常量对象和非常量对象是指对于同一个类的不同对象,它们的常量性质不同。
常量对象是指被const关键字修饰的对象,它们的数据成员不能被修改。常量对象可以调用常量成员函数,但不能调用非常量成员函数。
非常量对象是指没有被const关键字修饰的对象,它们的数据成员可以被修改。非常量对象可以调用常量成员函数和非常量成员函数。
常量对象和非常量对象的区别在于它们的常量性质,常量对象的常量性质更强,因此不能修改数据成员,而非常量对象则可以修改数据成员。常量对象的引入可以提高程序的安全性和可靠性,防止数据被意外修改。
下面是一个简单的示例,用于说明常量对象和非常量对象的区别:
#include <iostream>
using namespace std;
class MyClass
{
private:
int x;
public:
MyClass(int n)
{
x = n;
}
void setX(int n) // 非常量成员函数
{
x = n;
}
int getX() const // 常量成员函数
{
return x;
}
};
int main()
{
MyClass obj1(10); // 非常量对象
const MyClass obj2(20); // 常量对象
obj1.setX(30); // 可以修改obj1的数据成员
cout << "obj1.x = " << obj1.getX() << endl; // obj1.x = 30
// obj2.setX(40); // 编译错误,不能修改obj2的数据成员(常量对象不能调用非常量成员函数)
cout << "obj2.x = " << obj2.getX() << endl; // obj1.x = 20
return 0;
}
在这个示例中,我们定义了一个MyClass类,其中包含一个int类型的数据成员x和两个成员函数setX()和getX()。setX()函数用于设置x的值,getX()函数用于获取x的值。在main函数中,我们创建了两个对象obj1和obj2,其中obj1是非常量对象,obj2是常量对象。我们可以通过obj1调用setX()函数来修改它的数据成员x,但不能通过obj2调用setX()函数来修改它的数据成员x。这是因为obj2是常量对象,它的数据成员不能被修改。
常量成员函数(常量成员函数不能修改类的数据成员;常量成员函数只能调用常量成员函数,不能调用非常量成员函数)
常量成员函数是C++98标准中引入的一个特性。C++98标准中将常量成员函数定义为一种特殊的成员函数,它们可以被常量对象和非常量对象调用,但是在常量对象中,只能调用常量成员函数。这个特性的引入是为了提高程序的安全性和可靠性,防止类的数据成员被意外修改。在后续的C++标准中,常量成员函数的语法和用法没有发生变化,仍然是C++98标准中定义的形式。
在C++中,常量成员函数是指在函数声明或定义中使用const关键字修饰的成员函数。常量成员函数有以下特点:
-
常量成员函数不会修改类的成员变量,即它们是只读的。因此,常量成员函数不能修改类的数据成员,也不能调用非常量成员函数,因为非常量成员函数可能会修改类的数据成员。
-
常量成员函数可以被常量对象和非常量对象调用。如果一个对象是常量对象,则只能调用该对象的常量成员函数,而不能调用非常量成员函数。
-
常量成员函数可以访问类的所有成员变量和常量成员函数。
常量成员函数的语法格式如下:
返回类型 函数名() const;
其中,const关键字放在函数参数列表后面,表示该函数是一个常量成员函数。
常量成员函数的作用是保证类的数据成员不被修改,从而提高程序的安全性和可靠性。常量成员函数通常用于访问类的数据成员,而不是修改它们。例如,可以使用常量成员函数来实现类的数据成员的读取操作,而使用非常量成员函数来实现类的数据成员的写入操作
。
下面是一个示例代码,其中getAge()函数调用了常量成员函数getName()来获取name的值:
#include <iostream>
#include <string>
using namespace std;
class Person
{
private:
string name;
int age;
public:
Person(string n, int a)
{
name = n;
age = a;
}
string getName() const
{
return name;
}
void getAge() const
{
string n = getName();
cout << "The name of the person is: " << n << endl;
cout << "The age of the person is: " << age << endl;
return;
}
};
int main()
{
Person p("Tom", 20);
p.getAge();
return 0;
}
在这个示例中,我们将getName()函数改为常量成员函数,以便在getAge()函数中调用。在main函数中,我们创建了一个对象p,并调用了它的常量成员函数getAge()来打印age的值。由于getAge()是常量成员函数,因此它可以调用常量成员函数getName(),但不能修改类的数据成员。