第6周-任务1-使用常对象的一个典型错误

简介: 【题目】下面的程序存在编译错误。有两种方法可以修改,请给出这两种修改方案,在报告中说明你倾向于用哪一种?为什么?处理此类问题的原则是什么? class C{private: int x; public: C(int x){this->x= x;} int getX(){return x;}};void main(){ const C c

【题目】下面的程序存在编译错误。有两种方法可以修改,请给出这两种修改方案,在报告中说明你倾向于用哪一种?为什么?处理此类问题的原则是什么?

class C
{private:
    int x;
 public:
    C(int x){this->x= x;}
    int getX(){return x;}
};
void main()
{
    const C c(5);
    cout<<c.getX();   //这一行将会出现错误
    system("pause");
}

【分析】这个程序中的问题在于第10行定义了常对象c;然而在第11行对c的访问中,用了getX()函数,该函数并不是一个const成员函数。

【确症】常对象要由常成员函数进行操作。

【药方】(1)第10行,定义对象 c 时,去掉限定词 const—— c将不享受由const带来的保护;(2)在第 6 行成员函数getX()的定义中,指定const 限定词,指明为一个常成员函数——该函数将不能实施对对象的修改。本题只意在强化这一语法点,程序也并无实际的意义,这两种方法都可以。但在实际应用中,要根据实际的需求确定合适的方案。

【方案1】定义对象 c 时,去掉限定词 const—— c将不享受由const带来的保护

class C
{private:
    int x;
 public:
    C(int x){this->x= x;}
    int getX(){return x;}
};
void main()
{
    C c(5);   //去掉const
    cout<<c.getX();
    system("pause");
}

【方案2】成员函数getX()的定义中,指定const 限定词,指明为一个常成员函数——该函数将不能实施对对象的修改

class C
{private:
    int x;
 public:
    C(int x){this->x= x;}
    int getX() const {return x;} //加上const,成为常成员函数
};
void main()
{
    const C c(5);
    cout<<c.getX();
    system("pause");
}

【评价】在本题中,getX()函数意在返回私有成员x的值,是一个典型的只读不修改的函数。为了防止其中意外的错误修改,常要用 const 进行限定。这样处理后,函数既可以被const 对象调用,也可以被非const对象调用。所以,此方案更好。

将一个函数声明为常成员函数仍然是一个粗线条的处理。更常见的,我们用const 限定函数的参数,这样可以实现更灵活的限定。 



(本文完)

目录
相关文章
|
存储 C语言 索引
第十一周:结构类型
你会坚持下来的对吗?希望C语言不会成为你跨进编程世界的拦路虎,而是你的启蒙语言,梦的开始
66 0
|
编译器 C++
C++引用分析实例与案例刨析及使用场景分析详解
多情况使用场景 demo1地址和值都不可以修改 只读不可修改,防止误操作 demo2指针常量,地址可变,值不可变 用于在函数体内给函数体外的变量更换别名,且别名只在函数体内有效 demo3常量指针,地址不变,值可以变 正常的值传递,可以简化指针值传递的繁琐操作
209 0
C++引用分析实例与案例刨析及使用场景分析详解
定义一个时钟类(TimeDemo),属性有:时、分、秒(默认值10时30分),方法有展示当前时间、过1秒,过1分钟,过1小时后的时分秒;在测试类中实现过10秒,过10分,过10小时后的时间展示
定义一个时钟类(TimeDemo),属性有:时、分、秒(默认值10时30分),方法有展示当前时间、过1秒,过1分钟,过1小时后的时分秒;在测试类中实现过10秒,过10分,过10小时后的时间展示
364 0
|
C++
2015级C++第10、11周程序阅读(补充) 继承和派生
(1) #include&lt;iostream&gt; using namespace std; class G { public: static int m; G( ){ //构造函数 m++; cout&lt;&lt;"G begins\n"; } ~G( ) { cout&lt;&l
1069 0
|
C++ C语言
2015级C++第10、11周补充实践项目 继承和派生
【项目0 - 是春哥啊】参考解答 请在下面程序的横线处填上适当内容,以使程序完整,并使程序的输出为: Name: 春哥 Grade: 19 #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class Person{ public: Person(char* s){
975 0
|
C++ 人工智能 开发工具
2015级C++第10、11周程序阅读 继承和派生
阅读程序,请写出这些程序的运行结果 (1)阅读程序,写出执行结果 #include &lt;iostream&gt; using namespace std; class Data { public: Data(int i):x(i){cout&lt;&lt;"A";} ~Data(){ cout&lt;&lt;"B";} private: i
1129 0
|
C++ 人工智能
2015级C++第9周程序阅读 类和指针
阅读程序,写出程序的运行结果并理解其运行机制。 (1) #include &lt;iostream&gt; using namespace std; class A { public: A(){cout&lt;&lt;"A";} ~A(){cout&lt;&lt;"~A";} }; class B { A *p; public: B()
890 0