首页 > 编程知识 正文

const函数的用法,Delphi中const对象

时间:2023-05-03 14:47:10 阅读:14498 作者:2969

在C++中,可以用const来定义一个const对象,但const对象不可以调用类中的非const成员函数

原因引发原因::由指向在调用成员函数时隐式传递的当前对象的this指针引起。

非常数成员函数的隐式参数: classA* thisconst成员函数的隐式参数: const class a* this 3358 www.Sina.com /

const对象的指针是const classA* this,因此编译器在传递非const成员函数时报告错误(类型不匹配,无法从const指针转换为非const指针)。 但是,传递给const成员的函数类型匹配。 指向非常数对象的指针是classA* this,可以调用常数成员函数。 这是因为const修饰符保证了对象不会发生更改。 代码解释假设有一个名为test代码的类。

class test{public: void print () const; (; 由于c知道类的成员函数还隐式地传递指向当前对象的this指针,因此在test类中实际的print函数应该是这样的voidprint(test*this )。 中选择所需的墙类型。 这意味着指向test对象的指针this被传递给了print函数

当使用test类创建对象时,

testobj1(12; obj1.print (; 第二句,obj1.print (; 其实相当于print(obj1); 中选择所需的墙类型。 也就是说,将当前对象obj1的指针传递给print ()函数是没有问题的

假设在test类中创建const对象,然后调用print ()函数? 这将是一个问题

Consttestobj2(122; obj2.print (; 在这种情况下,obj2对象的指针将传递给test *this指针。 obj2的地址翻译成指针型应该是这样的。 const test* this,在这种情况下,会发生类型不匹配的错误,visual studio会发生以下错误:

因此,从上述说明中,我们明白了const对象为什么不能调用非const成员函数。

说明const对象为什么可以调用const成员函数。

class test{public: void print () const; (; 之前,我们尝试翻译了非const成员函数print ()。 同样,也翻译const成员函数。 语音打印) ) const; 可以翻译为语音打印(const test * this ); 常量对象的地址翻译为常数测试* this; 和void print () const; 因为中this指针的类型相同,所以常量对象可以调用const成员函数

需要注意的一点是,在c中实际上有最小权限原则,非常数对象可以调用常数成员函数。

不更改成员数据的函数必须声明为const函数,以便可以在const对象中使用。

*注意: **构造函数和析构函数不是常数成员函数,因为它们在初始化和清理过程中总是对对象进行更改。

摘要:如何使用const成员函数更改——位成员和按成员列出的const成员。如果试图创建const成员函数,但想更改对象中的某些数据,该怎么办? 这导致按位列出的const和按成员列出的const之间的差异。 位const表示对象中的每个位是固定的,因此对象的每个位图像不会更改。 按成员列出的const是指整个对象在概念上保持不变,但某个成员可能有变化。 当编译器被告知该对象是const对象时,它会保护该对象。

本节介绍了在const成员函数中更改数据成员的两种方法。

1 .强制转换const的首要方法已经过去,被称为“强制转换const”。 它以相当奇怪的方式运行。 获取this (该关键字生成当前对象的地址),并强制将其转换为指向当前类型对象的指针。 this似乎已经是我们需要的指针,但因为它是常数指针,所以必须强制转换为常规指针,以便可以从运算中去除常量性。 以下是一个例子。

class Y {int i,j; public:Y () { i=j=0; }void f () const; (; void Y:f () const(/! I; //error () y* ) this )-j; //ok,cast away const feature.}此方法是可行的,在过去的程序代码中可以看到这种用法,但这不是首选技术。 问题是this没有用const限定。 这是因为对象的成员函数隐藏了它,如果用户看不到源代码(并且找到使用该方法的位置),就不知道发生了什么

2 .关键字mutable第二种建议的方法也是在类声明中使用关键字mutable指定特定数据成员可以在const对象中进行更改。

class Y {int i; mutable int j; public:Y () { i=j=0; }void f () const; (; void Y:f () const(/! I; //error () y* ) this )-j; //ok,mutable.}引申:类成员函数调用成员变量1 ) const成员函数可以是const对象以外的非const数据成员、const数据成员或const对象中的所有

2 )非常数成员函数可以访问非常数对象的非常数数据成员、常数数据成员,但是不能访问常数对象的任何数据成员;根本原因:

例如:

classtest{public:test(intI,int j ) :value(I ),non_const(j ) }; void test (常数测试t1 ) const { t1.value; }voidtest0(consttestT1) const ) T1.value; } void test1 (常数测试) { t.value; }voidtest2(testT2 ) { t2.value; } private :常数int value; int non_const; (; 这个可以编译

摘要const对象只调用const成员函数,而不调用非const成员函数。 非常数对象可以调用常数成员函数。 参考了文章:

3359 blog.csdn.net/QQ _ 33726635/article/details/105200480

3359 blog.csdn.net/nawuyao/article/details/52748747? depth_1-

33559 www.cn blogs.com/CP Linux/p/5553716.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。