• 第24课经典问题(中)-----关于const对象的疑问


    关于const对象的疑问
    const关键字能否修饰类的对象?
    如果可以,有什么特性?
    const关键字能够修饰对象
    const修饰的对象为只读对象
    只读对象的成员变量不允许被改变。(对象是只读的,成员变量不允许被改变 )
    只读对象是编译阶段的概念,运行时无效。

    C++中的const成员函数
    -const对象只能调用const的成员函数
    -const成员函数中只能调用const成员函数
    -const成员函数中不能直接改写成员变量的值

    const成员函数的定义:
    Type ClassName::function(Type p) const
    类中的函数声明与实际函数定义中都必须带const关键字

    类的const函数初探

    #include <stdio.h>
    
    class Test
    {
        int mi;
    public:
       int mj; Test(
    int i); Test(const Test& t); int getMi(); }; Test::Test(int i) { mi = i; } Test::Test(const Test& t) { } int Test::getMi() { return mi; } int main() { Test t(1); return 0; }

    基于该程序,做以下实验:

    1)在main 函数中定义:

    const Test t(1);

    t.mj = 1000;

    这个程序是无法编译通过的,因为t是const对象,它里面的成员变量是无法被改变的。

    2)t.getMi(),用t对象调用getMi函数时,会出错。

    因为t是const对象,它只能调用const的成员函数,不能调用非const成员函数。

    应该将getMi改为const成员函数:

    int getMi() const;

    int Test::getMi() const

    {

      return mi;

    }

    3)在const成员函数内,试图改变mi的值,能编译过吗?

    int Test::getMi() const

    {

      mi = 1000; //错,在const成员函数内,是不允许修改成员变量的值。

      return mi;

    }

    4)此时将getMi()的const属性去掉,进行下面的操作:

    Test::Test(const Test& t)

    {

      mi = t.getMi();

    }

    这样修改后能编译过吗?

    编译会失败,明确告诉我们 mi = t.getMi()这个地方失败。为什么会编译失败呢?

    此处的t是Test对象的引用,注意前面加上了const关键字,这意味着给t这个对象加上了只读属性。使得t这个引用所代表的对象变成了只读对象。既然是只读对象,就只能调用const成员函数。

    5)下面这样的赋值可以过吗?

    Test::Test(const Test& t)

    {

      mi = t.mi;

    }

    可以编过。问题:t是一个对象,mi是类的私有成员变量。前面不是说过,不能通过一个对象直接调用类的私有成员变量嘛,在这个地方为什么可以?

    下篇博客将继续探讨这个问题。

  • 相关阅读:
    Orchard:如何生成模块和生成一个Content Part
    马云2011年邮件
    asp.net页面编码问题
    创建一个三D立体感的主页
    25个网页设计实例
    设计一个简洁的个人网站
    新浪微博产品交互改进[转]
    设计一个暗色调简洁漂亮的主页
    用HTML5 画LOGO
    成功企业站设计思路
  • 原文地址:https://www.cnblogs.com/-glb/p/11873388.html
Copyright © 2020-2023  润新知