C++的常量成员函数

在C++中,若类的成员函数的形参列表之后紧跟着const关键字,则该成员函数为常量成员函数。如下:

struct Sales_data
{
	//数据成员
	std::string bookNo;
	unsigned uints_sold = 0;
	double revenue = 0.0;

	//成员函数
	std::string isbn() const { return bookNo; } //常量成员函数
	Sales_data& combin(const Sales_data&);
};
当我们调用类的成员函数时,实际上是调用具体的某个对象的成员函数。成员函数是通过一个名为this的额外的隐式形参来调用它的那个对象。即当我们调用某个对象的成员函数时,会将this指针和该对象进行绑定。

在成员函数内部,我们可以直接使用,并且能够正确的使用调用该函数的对象的成员,而不用通过成员运算符来具体指定某个对象,就是因为this所指的正是这个对象。因为this的目的总是指向“这个”对象,故this是一个常量指针,不允许改变this保存的地址(它保存的地址正是“这个”对象的地址)。


成员函数中,形参列表后面的const关键字,作用是修改隐式this指针的类型。前面说this指针是常量指针,其保存的地址不能改变,即只能指向“这个”对象。但是如果该对象被声明为常量对象,此时虽然this指针始终指向该常量对象,但是this却并不是一个指向常量的指针,它只是一个常量指针。换句话说,允许通过this指针来改变这个常量对象,岂不是有问题了?

这就意味着,我们不能调用一个常量对象的普通函数。因为这意味着将普通函数的隐式this常量指针,跟一个常量对象进行绑定。关键字const的作用就是将this指针由常量指针改为指向常量对象的常量指针。如此,可以被常量对象所调用。


由上面分析可以知道:

(1)常量成员函数形参列表后的const关键字,意味着this指针指向常量。

(2)常量成员函数不会改变调用它的对象(因为this指针已经被改为指向常量的指针)

(3)非常量对象可以调用常量成员函数,常量对象只能调用常量成员函数不能调用普通成员函数(即使该普通成员函数不改变调用它的对象)。


参考:《C++ primer》 第五版


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++常量成员是指在声明的成员变量或成员函数,其值在对象创建后不能被修改。常量成员可以被声明的数据成员或成员函数常量数据成员: 常量数据成员是指的数据成员,在对象创建后其值不能被修改。常量数据成员必须在的构造函数的初始化列表进行初始化,否则会导致编译错误。 以下是常量数据成员的定义和示例代码: ```cpp class MyClass { private: const int constantData; // 常量数据成员 public: MyClass(int data) : constantData(data) {} // 构造函数初始化常量数据成员 }; ``` 在上述示例,`constantData`是一个常量数据成员,它在构造函数的初始化列表被初始化为传入的参数`data`。 常量成员函数常量成员函数是指成员函数,在函数内部不能修改任何非静态数据成员。常量成员函数通过在函数声明后加上`const`关键字来定义。 以下是常量成员函数的定义和示例代码: ```cpp class MyClass { private: int data; public: void setData(int newData) { data = newData; } void displayData() const { // 常量成员函数 // 在常量成员函数不能修改非静态数据成员 std::cout << "Data: " << data << std::endl; } }; ``` 在上述示例,`displayData()`是一个常量成员函数,通过在函数声明后加上`const`关键字来定义。在常量成员函数内部,不能修改非静态数据成员`data`的值。 常量成员函数通常用于不会修改对象状态的操作,例如只读访问数据成员或计算某些结果而不修改对象的状态。 需要注意的是,常量成员函数可以被非常量对象常量对象调用,但非常量成员函数只能被非常量对象调用。常量成员函数在调用期间将确保不会修改对象的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值