C++第6周项目1 - 改错

简介: 课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8748730【题目】下面的程序存在编译错误。有两种方法可以修改,请给出这两种修改方案,在报告中说明你倾向于用哪一种?为什么?处理此类问题的原则是什么?

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8748730


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

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 限定函数的参数,这样可以实现更灵活的限定。 



(本文完)

目录
相关文章
|
5月前
|
编译器 C++ 开发者
【Conan 入门教程 】使用Conan 2.X和Autotools高效构建C/C++项目
【Conan 入门教程 】使用Conan 2.X和Autotools高效构建C/C++项目
324 1
|
5月前
|
算法 测试技术 数据处理
【C/C++ 面试技巧】如何在简单的项目里突出自己的价值?
【C/C++ 面试技巧】如何在简单的项目里突出自己的价值?
151 1
|
5月前
|
算法 测试技术 开发工具
编写高效技术文档的艺术:C++项目实践指南
编写高效技术文档的艺术:C++项目实践指南
156 0
|
5月前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
199 7
|
9天前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
111 3
|
1月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
33 3
|
3月前
|
Rust 测试技术 编译器
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
Rust与C++的区别及使用问题之Rust项目中组织目录结构的问题如何解决
|
2月前
|
编译器 C++ 开发者
Visual Studio属性表:在新项目中加入已配置好的C++库
通过以上步骤可以确保Visual Studio中新项目成功地加入了之前已配置好的C++库。这个过程帮助开发者有效地管理多个项目中共享的库文件,提升开发效率。
60 0
|
3月前
|
Java C++ 开发者
如何根据项目需求选择使用C++还是Python进行内存管理?
【7月更文挑战第2天】如何根据项目需求选择使用C++还是Python进行内存管理?
44 0
|
5月前
|
存储 C++ UED
【C++】飞机大战项目记录
通过上面的设计,我们实现来看飞机大战的主要功能
82 4