| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2854 人关注过本帖
标题:关于const成员函数的几个不解?
取消只看楼主 加入收藏
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
结帖率:90.24%
收藏
已结贴  问题点数:20 回复次数:4 
关于const成员函数的几个不解?
图片附件: 游客没有浏览图片的权限,请 登录注册


我的理解如下:
    如上图,const成员函数可以认为修改了this指针的类型,将this指针类型由classType * const类型转换为 classType const * const类型,因此const成员函数可以访问常量对象,而
非const成员函数则不行。但是请问为何非const成员函数可以访问const成员呢?那岂不是相当于classType * const pt = &(常量),这个在语法上是错误的呀?不是非常指针不能指向常量嘛,
求大佬帮助!

搜索更多相关主题的帖子: const 成员 函数 指针 常量 
2018-04-02 20:04
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
第二个问题:
图片附件: 游客没有浏览图片的权限,请 登录注册


里面对于派生类类内的修改情况是不是有点问题呢?

程序代码:
#include <iostream>
#include <vector>
#include <string>

using namespace std;

class A
{
protected:
    int pa;    
};

class B :protected A
{
public:
    void setPa()
    {
        pa = 10;
    }
};

int main()
{
    B b;
    
    b.setPa();

    system("pause");
    return 0;
}


比如以上代码,我就能在派生类内修改protected成员撒~

请问是不是上面这位仁兄总结的表格有问题呢? 感激不尽哈~

[此贴子已经被作者于2018-4-3 00:09编辑过]


既然还有不甘心
就还没到放弃的时候~
2018-04-02 20:31
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
回复 4楼 Jonny0201
因为c++ primer上讲到了一般成员函数中的this指针本身是一个常指针,类型为Type* const ptr,而const成员函数相当于将this只能再次进行强化为const Type* const ptr,即变成了只想常量对象的常量指针。
但是非const成员函数依然能访问类的const成员,在我的理解中就类似于以下操作:
Type* const ptr = &(常量)  
______ 此操作与以下操作类似 ______
const int elem = 10;
int *pt = &elem;
下面明显是不对的撒,为啥上面的确可以访问呢?
求大佬给解答一二,不胜感激!


[此贴子已经被作者于2018-4-4 11:58编辑过]


既然还有不甘心
就还没到放弃的时候~
2018-04-04 11:57
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
回复 3楼 Jonny0201
嗯 所以说上面别人总结的那个表表是错误的咯!

还是在CSDN上看到的~!

既然还有不甘心
就还没到放弃的时候~
2018-04-04 11:59
S140131022
Rank: 2
来 自:重庆邮电大学
等 级:论坛游民
帖 子:205
专家分:35
注 册:2014-10-9
收藏
得分:0 
回复 7楼 枫林火山
总结一下吧: 不纠结了 感觉自己钻了牛角尖

在使用C++语言开发中,如果我们希望某一个对象在定义之后不被错误的修改,我们可以将这个对象声明为const对象,这样这个对象的数据成员就不可以被更改。

1.定义const对象

const 类名 对象名;

  类名 const 对象名;

1)定义类对象时可以将其指定为const对象。定义后const对象不能再被修改;

2)const对象不能调用非const类型的成员函数。

  在非const成员函数内部,有可能会对对象的数据成员进行修改,比如setHour()修改了对象的Hour值。而const类型的成员函数是不会修改对象的数据成员的。

const数据成员

1.const数据成员

  在类内部使用const关键字来声明const数据成员。const数据成员的值不能被修改。

const int m_nNum;//定义了一个const数据成员

  初始化时比较特殊,只能通过初始化列表初始化。不能在构造函数里赋值。

2.初始化列表

  构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。

  初始化列表可以为数据成员初始化,不仅仅只是const数据成员。

  我们在构造函数外面添加了初始化列表,这个列表里面为const成员m_nNum赋了初始值10,如果我们有多个构造函数,必须在每一个构造函数外面都对这个const成员添加初始化列表初始化,包括复制构造函数。

 

const成员函数

1.const成员函数只能被const对象引用;

2.const成员函数内可以引用const数据成员,也可以引用非const数据成员,但不能修改非const数据成员的值,也不能调用非const成员函数;

3.const成员函数在声明和定义的时候都必须加上const。

[此贴子已经被作者于2018-4-5 11:55编辑过]


既然还有不甘心
就还没到放弃的时候~
2018-04-05 11:47
快速回复:关于const成员函数的几个不解?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018822 second(s), 12 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved