高质量程序设计指南c++/c语言(25)--类与内联函数

摘要: 我们可以用inline来定义内联函数,不过,任何在类的说明部分定义(不是声明)的函数都会被自动的认为是内联函数。 内联函数必须是和函数体声明在一起,才有效。像这样的声明inline Tablefunction(int I);是没有效果的,编译器只是把函数作为普通的函数声明,我们必须定义函数体。inline tablefunction(int I) {return I*I},这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。 我们也可以将定义在类的外部的函数定义为内联函数,比如: class TableClass{private: ... 阅读全文
posted @ 2013-05-01 20:55 江在路上2 阅读(113) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(24)--内连接与外连接

摘要: 转载:http://www.cnblogs.com/sybtjp/archive/2012/05/15/2501291.html在介绍C++中的内部连接与外部连接前,先说明一些概念。一、声明 一个声明将一个名称引入一个作用域。在c++中,在一个作用域中重复一个声明是合法的。二、定义 一个定义提供一个实体(类型、实例、函数)在一个作用域的唯一描述。在同一作用域中不可重复定义一个实体。三、编译单元 当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.o... 阅读全文
posted @ 2013-05-01 15:41 江在路上2 阅读(344) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(23)--存储类型及其作用域规则

摘要: 在把一个程序的源代码转变为机器指令的过程中,一些程序元素被剔除了,一些程序元素则保留在可执行代码中。被保留的程序元素将在最终的可执行程序中占用一定的存储空间。然而,不同的程序元素在运行时的存储方式不尽相同,这就引出了“存储类型”的概念。同时,不同的程序元素在编译阶段具有不同的作用范围,这就是“作用域”的概念。 标准c语言为变量、常量、函数定义了4种存储类型,即extern、auto、static、register。extern和static用来标识永久生存期限的变量和函数,而auto和register则用来标示临时生存期限的变量(它们俩不修饰函数啊)。 默认情况下,全局变量和全局... 阅读全文
posted @ 2013-04-29 22:56 江在路上2 阅读(152) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(22)--多编译单元编程

摘要: 该程序由main.cpp、h1.cpp、h1.h三个文件组成,公有两个编译单元。1、h1.h#ifndef _H1#define _H1class Utility{public: static const int MAX; enum { OK = 10 };};extern int a;#endif2、h1.cpp#include <iostream>#include "h1.h"using namespace std;void f(){ a = 100; cout << "h1.cpp: a=" << a <& 阅读全文
posted @ 2013-04-29 21:20 江在路上2 阅读(384) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(21)--实际应用中如何定义常量

摘要: 如果要为程序中多个编译单元或者多个模块定义统一的符号常量,在C程序中会把它定义在哪里呢?在c++程序中又会定义在哪里呢?如果是只为某一个编译单元定义符号常量,又当如何? 显然,在c和c++中定义符号常量是有区别的。我们仅仅讨论“多个编译单元公用符号常量”的声明和定义。 在c程序中,const符号常量定义的默认连接类型时extern的,即外连接的。因此,如果要在头文件中定义,必须使用static关键字,这样每一个包含该头文件的编译单元就会分别拥有该常量的一份独立定义实体(如同直接在每一个源文件中分别定义一次),否则会导致redefinition的错误。如果在源文件中定义,除非明确改... 阅读全文
posted @ 2013-04-29 20:28 江在路上2 阅读(731) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(20)--符号常量

摘要: 存在两种符号常量,用#define定义的宏常量和用const定义的常量。宏常量是预编译伪指令,在本质上是字面常量。在c语言中,const符号常量默认是外连接的,因此会给它分配存储空间,也就是说你不能在两个编译单元中同时定义一个同名的const符号常量(重复定义错误),或者把一个const符号常量定义在一个头文件中而在多个编译单元中同时包含该头文件。但是在标准c++中,const符号常量默认是内连接的,因此可以定义在头文件中。当在不同的编译单元中同时包含该头文件时,编译器认为它们是不同的符号常量,因此每个编译单元独立编译时会分别为它们分配存储空间,而在连接时进行常量合并。 在c++中,c... 阅读全文
posted @ 2013-04-28 18:34 江在路上2 阅读(451) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(19)--赋值操作符“=”

摘要: 赋值操作符的左边的操作数要求是可寻址的。1、#include<iostream>#include<string>using namespace std;char get_val(string &str,string::size_type ix){ return str[ix];}int main(void){ string s("123456"); cout<<s<<endl; get_val(s,0)='a'; cout<<s<<endl; return 0;}编译错误:get 阅读全文
posted @ 2013-04-28 16:25 江在路上2 阅读(197) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(18)--使用断言

摘要: 断言(assert)的语义如下:如果表达式的值为0,则输出错误消息并终止程序的执行(一般会出现提示对话框,说明在什么地方引起了assert),如果表达式为真,则不进行任何操作。因此断言失败就表明程序存在一个bug。 程序一般为分debug版本和release版本,由于assert的宏体全部被条件编译为伪指令#ifdef _DEBUG和#endif所包含,因此,assert()只在debug版本里有效。为了不在debug版本里和release版本里造成差别,assert不应该带来任何副作用。所以assert不是函数,而是宏。程序猿可以把assert看成一个在任何情况下都可以安全使用的无害测... 阅读全文
posted @ 2013-04-28 15:57 江在路上2 阅读(231) 评论(0) 推荐(1) 编辑

高质量程序设计指南c++/c语言(17)--函数

摘要: 对于静态链接库的函数库或者类库,如果你调用了其中的函数,那么连接器会从相应的库中提取这些函数的实现代码并把他们连接到你的程序中,如果你没有调用库中的某些函数,则连接器是不会把他们的实现代码连接进来的,即使该库包含了成千上万个函数。如果你使用的是动态链接库,则运行时必须将所有dll都复制到运行环境的相应目录下。 连接的本质就是把一个名字的实现代码绑定到对它的每一个引用语句上,如果你根本没有引用这个名字,那么它的实现和谁去绑定呢? 同样,如果程序中任何地方都没有调用你自己编写的某个函数的话,编译器也不会为该函数生成可执行代码。明白了这个道理,你应该可以消除一些不必要的担心了。例如,我... 阅读全文
posted @ 2013-04-28 13:49 江在路上2 阅读(232) 评论(0) 推荐(0) 编辑

高质量程序设计指南c++/c语言(16)--回车和换行

摘要: 换行:\n,ASCII值为0x0A回车:\r,ASCII值为0x0D 回车和换行是不同的。首先,它们的ASCII值不同。“换行”字符一般用于文件,即把从键盘输入的回车字符转化为换行字符来保存,而不是直接保存回车字符;换行字符还用于程序的输出控制,即输出一个换行字符以指示终端输出从新行开始。而回车是键盘功能,用于输入控制,例如代替鼠标左击和表示输入的结束和从新行输入,它不能输出。因此要记住,输出“换行”,输入“回车”。不过有些字符输入函数可以把从键盘输入的回车字符自动转换为换行字符输出,如getchar()。 阅读全文
posted @ 2013-04-27 21:54 江在路上2 阅读(403) 评论(0) 推荐(0) 编辑