第五章的表达式和第六章的语句我就没有仔细看了,本来也想着跳过函数这一章直接进入IO库的,后来发现里面有一节是关于函数指针的,想着当时看《C专家编程》的时候好像还是觉得有些难懂,于是就看了,这一看,其实发现有很多知识点以前不清晰的,或者是记不住的,原来背后是有很多道理的啊。主要就是有关const的,还有就是函数的指针了。这个const真的是大有学问啊。
1. const与函数的各种关系
从前我写函数,很害怕使用const的,因为总会编译不通过,最后我就“放宽限制”,全部都不用const啦。可以见得我以前是多么地急功近利,都不愿意花个功夫好好研究一下const的意义的。当然,通过《C专家编程》和这两天的阅读,我对const与指针、引用的关系也渐渐清晰了。
const与函数的关系首先表现在形参上,对函数的形参加上const限制,说明函数在使用这个形参的时候不可以改变它。但是,必须注意到的是,普通的形参(非引用)传递给函数时,实际上是复制了一个副本,因此有(1)调用函数时,如果该函数使用非引用的非const形参,则既可以给该函数传递const实参,也可以传递非const实参。反之,(2)如果函数将形参定义为非引用的const类型,传递给函数的实参即可以是const的,也可以是非const的。
道理说清楚了,实际上一点也不混乱,重点就是,对函数的形参加上const限制,说明的是函数在使用这个参数的时候不可以改变的,而实参传递给函数时,实际上传的是它的副本。这两点搞清楚了,就很清晰了。
除了非引用的形参,还有引用形参,引用实参的作用在于,当我们需要通过函数对实参做出修改(而不仅仅是利用它的值)时,需要用引用形参;另一方面,假设实参很大,我们不希望发生复制,也会直接使用引用形参,这个时候,如果我们不希望对实参发生改动,则必须将该引用形参设成const的。书中有一句话是这样说的:“应该将不修改相应实参的形参定义为const引用。如果将这样的形参定义为非const引用,则毫无必要地限制了该函数的使用。”这就是为什么我前面在“放宽限制”那里加了引号,实际上,如果考虑到函数不一定是你自己一个人使用的,使用const对函数形参进行限制,实际上加大了它可接受的参数范围(如前所述,实参既可以是const的,也可以是非const的,而如果没有const限制,实参就不能为const的)。举书里的一个例子:
//returns index of first occurrence of c in s or s.size() if c isn't in s
//Note: s doesn't change, so it should be a reference to const
string::size_type find_char( string &s, char c ){
string::size_type i = 0;
while( i!= s.size() && s[i] != c )
++i;
return i;
}
这个时候,首先被限制的就是字符串常量值,虽然字符串常量值可以转换为string对象,但像这样的调用:
if( find_char( "Hello world!", 'c' ) )
将会导致编译失败。
另外,如果string在外面被声明成const的,我们也无法使用此函数去检测string中的字符了。所以说这样限制了函数的使用。
const与函数的另一个关系表面在类的const成员函数上。设类:
class Sales_item{
public:
double avg_price() const;
bool same_isbn( const Sales_item &rhs ) const
{ return isbn == rhs.isbn; }
private:
std::string isbn;
unsigned units_sold;
double revenue;
}
之前c++没有好好学,我一直不知道avg_price()和same_isbn(...)函数后面加个const到底是指什么。原来,const改变了隐含的this形参的类型。我们知道每个成员函数都有一个额外的、隐含的形参this,在调用成员函数时,形参this初始化为调用函数的对象的地址。而这个const改变了隐含的this的形参的类型,表示指向const Sales_item*类型的指针。
用这种方式使用const的函数称为常量成员函数,由于this是指向const对象的指针,const成员函数不能修改调用它们的对象的数据成员。
“const对象、指向const对象的指针或引用只能用于调用其const成员函数”,这句话同样提醒我们,如果函数确实不需要对this对象做出修改,应该声明它为const成员函数,不然其使用范围又是被人为地限制了。
2. 指向函数的指针
奇怪的是,现在再看指向函数的指针,我却没有觉得有那么难理解了。应该是对声明的分析更熟悉了。反正先把名字找出来,然后把与它关联的优先级最高的拿出来,然后就大概知道这个声明是指的什么了。具体可以看这篇http://philoscience.iteye.com/blog/998208(分析C语言的声明)
分享到:
相关推荐
这本书名为《C++ Premier》第四版的中文版,意味着它是一本专门介绍C++编程语言的书籍,并且是针对中文读者进行编写的版本。C++是一种广泛使用的、面向对象的编程语言,由Bjarne Stroustrup在20世纪80年代初基于...
1. **基础语法**:C++的基础语法包括变量、数据类型、运算符、流程控制(如if语句、循环)、函数等。这部分内容是所有编程语言学习的起点,也是理解C++后续特性的基础。 2. **面向对象编程**:C++的核心在于其面向...
2. **函数**:函数是C++中的可重用代码块,用于实现特定功能。第四版会介绍如何定义和调用函数,以及函数参数的传递方式,包括传值和传引用。此外,还涵盖了函数重载和递归函数的概念。 3. **类与对象**:C++的核心...
在《C++ Primer 第四版》中,读者将学到如何使用基本数据类型、控制结构、函数、数组和指针来构建程序;了解类和对象的概念,以及封装、继承和多态等面向对象特性;掌握模板的使用,包括函数模板和类模板,以及STL中...
《C++ Primer Plus》这本书涵盖了C++的基础知识,包括基本语法、数据类型、控制结构、函数、类和对象、模板、异常处理等内容。中英文对照的设计使得读者在遇到难以理解的概念时,可以直接查阅英文原文,加深理解,...
理解如何定义类、创建对象,以及如何通过成员函数和友元函数操作对象,是学习C++的关键。 本书还涵盖了模板,这是C++中非常强大的一种工具,允许我们编写可以处理多种数据类型的通用代码。模板不仅用于函数,还可以...
1.1 C++的发展和主要特点 1.2 第一个C++程序以及C++程序开发过程 1.3 C++在非面向对象方面的常用新特性 1.4 程序陷阱 1.5 补充:变量的定义、数据类型、函数等
C++ Primer是一本经典的C++编程语言入门书籍,本文档总结了C++ Primer的要点,涵盖了C++语言的基本概念、变量、数据类型、控制流、函数、数组、指针、引用、类型别名、自定义数据结构等方面。 1. 基本概念 C++语言...
接下来的20天里,读者将深入学习C++的核心概念和技术,包括但不限于数据类型、控制结构、函数、类与对象等基本概念,以及模板、异常处理等高级主题。这一阶段的目标是帮助读者建立起坚实的C++编程基础。 ### Bonus ...
此外,本书还适合与《C++ premier(5th)》配合使用,意味着它可能涉及了C++的基础知识和一些高级特性,使得读者在掌握了基础C++编程技能后,能够进一步深化对标准库的理解和应用。 在描述中还提到,这本书不仅是一...
根据提供的文件信息,我们可以推断出这是一本关于使用 C++ 进行游戏编程的入门书籍,出版于 2004 年,由 Premier Press 出版社发行。本书的版本号为 LRN 7.0-2.5 LotB。尽管提供的“部分内容”仅包含“TeamLRN”重复...
此外,C++提供了内置函数,如printf和scanf,用于输入输出操作。 面向对象编程(OOP)是C++的核心特性之一。你需要理解类和对象的概念,类是数据和操作数据的方法的集合,而对象是类的实例。继承允许创建新的类,...
本资源是使用XMind总结C++中关联容器的使用,关联容器包括map,set,multimap,multiset。内含相关的操作及构造函数,代码片段演示
5. **函数**:学习函数的定义、调用、参数传递和返回值。了解函数指针和递归函数的概念。 6. **数组**:理解一维、多维数组的声明、初始化和操作。数组作为函数参数时的注意事项。 7. **指针**:深入理解指针的...
这些代码可能是用C++, Python或JavaScript等编程语言编写,目的是实现3D建模的特定功能,如: 1. **几何构建**:创建基本形状(如立方体、球体)的函数,以及如何组合这些形状构建复杂的模型。 2. **变换操作**:...
《游戏经典教材的源码之一》这一资源包含了Premier.Press.MUD.GAME.PROGRAMMING这本书的源代码,这些源码是用C++语言编写的,对于深入理解游戏开发,尤其是MUD(多用户地下城)游戏编程具有极高的学习价值。...
InstallShield 提供了多个版本,如 InstallShield 2009 Premier 版本,它可以无缝集成到 Microsoft Visual Studio .NET 2003 中,简化开发流程。 **一、创建简单的安装程序** 1. **新建 InstallScript 项目**:在 ...
附录A 在Visual C++中使用内联汇编 │ ├─InlineASM ;内联汇编实例 │ └─SeparateASM ;VC 中调用 MASM 独立汇编实例 │ └─附录B.....................................附录B 在Visual Basic中使用汇编 ├─...