C++ 笔记49页.docx
- 文档编号:10260411
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:82
- 大小:48.63KB
C++ 笔记49页.docx
《C++ 笔记49页.docx》由会员分享,可在线阅读,更多相关《C++ 笔记49页.docx(82页珍藏版)》请在冰豆网上搜索。
C++笔记49页
--摘自
第2章基本概念
本章意在解释对理解C++至关重要的一些概念,C程序员将对这些概念中的很多内容非常熟悉,但存在一些细微的差别可能导致意想不到的程序结果,包含了以下论题:
*术语
*说明和定义
*范围
*程序和连接
*开始和结束
*存储类
*类型
附加的论题包括l值、r值和数值范围界限。
--------------------------------------------------------------------------------
术语
本书所使用的C++术语在表2.1中给出了定义:
表2.1C++术语
术语含义
说明说明向一个程序引入名称及它们的类型,而不必定义相关联的对象或函数。
但很多说明被作为定义
定义定义提供信息而允许编译器为对象分配存储器或为函数产生代码
生存期一个对象的生存期是对象存在包括创建和析构的时间阶段
连接名称可以有外部连接、内部连接或无连接,在一个程序内(一套转换单元),只有带外部连接的名称才表示相同的对象或函数。
在一个转换单元内,带有内部或外部连接的名称均可表示相同的对象或函数(当函数重载时除外)。
(关于转换单元的更多信息,参阅本书后面“预处理器参考”中“翻译阶段”)。
无连接的名称只表示唯一的对象或函数
名称名称表示一个对象、函数、重载的函数集、枚举元、类型、类成员、模板、值或标号、C++程序用名称指出与它们相关联的语言元素。
名称可以是类型名称或标识符
对象一个对象是用户定义类型(一个类类型)的一个实例(一个数据项)。
一个对象和一个变量之间的区别是变量保留状态信息,而对象还可以拥有动作。
本手册给出的对象和变量之间的区别是:
“对象”指用户定义类型的实例,而“变量”指基本类型的实例。
在对象或变量均可用情况下,术语“对象”被用作为包容性术语,意为“对象或变量”
范围名称只能在程序上下文的特定区域内使用,这些区域被称为名称的范围
存储类被命名的对象的存储类指其生存期、初始化及在某特定情况下指其连接
类型带有相关类型的名称指的是存储在一个对象中或由一个函数返回的值的含义
变量一个变量是一个基本类型(如int、float或double)的数据项,变量存储状态信息但不为信息如何被处理而定义动作。
看前面列出的“对象”项来获得有关术语“变量”和“对象”是如何在本文档中被运用的
--------------------------------------------------------------------------------
说明和定义
说明告诉编译器一个程序元素或名称存在,定义指定名称描述的是什么代码或数据,一个名称必须先说明而后才能使用。
说明
一个说明向一个程序中引入一个或多个名称,说明在一个程序可出现不止一次,因此,可以为每个编译单元说明类、结构、枚举类型和其它用户定义类型。
多说明的限制是所有说明必须可标识。
说明还可作为定义,除了以下说明:
>是一个函数原型(没有函数体的函数说明)
>有extern指示符但没有初始表达式(对象和变量)或函数体(函数),这意味着该定义在当前转换单元里不是必须的,且给出了名称外部连接。
>是类说明内部的静态数据成员。
由于静态类数据成员是由类的所有成员共享的离散变量,它们必须在类说明外部加以定义和初始化(关于类和类成员的更多的信息参见第8章“类”)。
>是一个不带定义的类名说明,例如classT;
>是typedef语句
说明同时也是定义的例子有:
//说明和定义整型变量i和j
inti;intj=10;
//说明枚举suits
enumsuits{Spades=1,Clubs,Hearts,Diamonds};
//说明类CheckBox
classCheckBox:
publicControl
{
public:
BooleanIsChecked();
virtualintChangeState()=0;
}
有些说明不是定义:
externintI;
char*strchr(constchar*Str,constcharTarget);
定义
一个定义是一个对象或变量、函数、类或枚举的唯一规格,由于定义必须唯一,所以一个程序对于一给定的程序元素只能包含一个定义。
说明和定义之间可以是多对一的关系。
有两种情况下一个程序元素可被说明但不被定义:
*函数被说明但从来没有用函数调用或带有函数地址的表达式引用过。
*一个类仅用于其定义不要求被知道的情况,但是,类必须被说明,以下代码描述了这种情况:
classWindowCounter;//前向引用,没有定义
classWindow
{
staticWindowCounterWindowCounter;//WindowCounter定义不被要求
}
--------------------------------------------------------------------------------
范围
C++的名称仅能用于一个程序的特定区域,这个区域被称为名称的“范围”。
范围确定一个不表示静态范围的对象的名称的生存期,范围还指出了当类构造和析构函数被调用时,以及对范围而言是局部的变量被初始化时一个名称的可见性(详见第11章“特殊成员函数”中“构造”和“析构”部分)。
有五种范围:
>局部范围,在一个块内说明的名称仅在此块中以及包含在此块中的块内是可访问的,且仅从说明后开始。
一个函数在函数最外层块范围内的普通参量的名称具有局部范围,就好象它们在包含函数体的块内被说明一样,考虑以下代码段:
{
inti;
}
由于i的说明包含在花括号括起的块内,所以i有局部范围而且永远不能被访问,因为在闭花括号前没有代码对其进行访问操作。
>函数范围,标号是唯一具有函数范围的名称,它们可在一个函数内的任意位置被使用,但在函数外部则不能访问。
>文件范围,任何在所有块或类的外部说明的名称具有文件范围,在其说明后,在转换单元的任何位置均可访问。
带有文件范围的不说明静态对象的名称通常被称为“全局”文字。
>类范围,类成员名具有类范围。
类成员函数仅能用对象上的成员选择运算符(.或->)或成员指针运算符(.*或->*)或指向那个类的对象的指针进行访问,非静态类成员数据被认为相对于那个类的对象是局部的。
考虑以下类说明:
classPoint
{
intx;
inty;
}
类成员x和y被认为是在类Point范围内。
>原型范围,在函数原型中说明的名称仅到了原型结尾处才是可见的。
以下原型说明了两个名称(szDest,szSource);这些名称在原型结尾处便超出范围了:
char*strcpy
(char*szDest,constchar*szSource);
说明点
一个名称被认为就在其说明符后在其(可选的)初始化之前马上说明。
(有关说明符的更多信息参见第7章“说明符”)。
一个枚举器被认为应在命名它的标识符后,但在其(可选的)初始化之前立即说明。
考虑这个例子:
doubledVar=7.0;
voidmain()
{
doubledVar=dVar;
}
如果说明点在初始化之后,则局部dVar将被初始化为7.0,即全局变量dVar的值。
但是,实际并非如此,所以dVar被初始化为一个未定义的值。
枚举遵循同样的规则,但是,枚举器被输出到枚举的包含范围外。
在下例中枚举元素Spades、Clubs、Hearts和Diamonds被说明,因为枚举器被输出到封闭的范围外,它们被认为具有全局范围。
例中的标识符已经在全局范围被定义。
考虑以下代码:
constintSpades=1,Clubs=2,Hearts=3,Diamonds=4;
enumSuits
{
Spades=Spades,//错误
Clubs,//错误
Hearts,//错误
Diamonds//错误
}
由于在前面代码中标识符已经在全局范围内被定义,所以产生出错信息。
注意:
用相同的名称指定不止一个的程序元素,例如一个枚举器和一个对象,这都被认为是很糟的编程方式,应当避免使用。
在前例中,这种方式导致出错。
隐藏名称
你可以通过在一个包围的块内说明名称来隐藏该名称,在图2.1中,i在更内层的块内又被说明了,而隐藏了在较外层块范围内与i相关的变量。
Sample:
:
Func(char*szWhat)
{
intl=0;
cout<<"i="< {
inti=7,j=9;
cout<<"i="< 外层包含局部范围对象i和<<"j="< }
cout<<"i="< }
内层块包含局部范围对象i和
图2.1中给出的程序输出为:
i=0
i=7
j=9
i=0
注意:
参量szWhat被认为在函数范围内,因此,它被看成好象是在函数的最外层块内被说明的。
具有文件范围的隐藏名称
你可以通过在块范围内明确地说明相同的名称而隐藏带文件范围的名称。
但是文件范围名称可以使用范围分辨运算符(:
:
)进行访问。
例如:
#include
inti=7;//i具有文件范围即在所有的块外部说明的
voidmain(intargc,char*argv[])
{
inti=5;//i具有块范围,隐藏了具有文件范围的I
cout<<"Block_scopedihasthevalue:
"<
cout<<"File_scopedihasthevaIue:
"<<:
:
i<<"\n";
}
前面代码的结果是:
Block_scopedihasthevalue:
5
File_scopedihasthevalue:
7
隐藏类名
你可以通过在相同的范围内说明一个函数、对象或变量、或者枚举器来隐藏类名。
当然,类名还可以通过使用关键字class前缀进行访问。
//在文件范围说明类Account
classAccount
{
public:
Account(doubleInitialBaIance)
{balance=InitialBalance;}
doubleGetBalance()
{returnbalance;}
private:
doublebalance;
};
doubleAccount=15.37//隐藏类名Accountvoidmain()
{
classAccountchecking(Account);//限定Acconut为类名
cout<<"Openingaccountwithbalanceof:
"
< } 注意,类名(Account)在任何位置被调用时,都要用关键字class将其与文件域变量Account区别开来,当类名出现在范围分辩运算符(: : )的左侧时不用此规则。 范围分辩运算符左侧的名称总被认为是类名,以下例子说明如果用关键字class来说明一个类型Account的对象的指针: classAccount*Checking=newclassAccount(Account); 上述语句中的Account在初始化器中(在圆括号内)具有文件范围,类型为double。 注意: 在这个例子中,标识符名称重新使用认为是糟糕的程序设计风格。 有关指针的更多的信息参见本章后面的“派生类”。 有关类对象的说明和初始化详见第8章“类”。 有关使用new和delete自由存储运算符的更多信息,参见第11章“特殊的成员函数”。 函数的形式参量的范围 函数的形式参量(在函数定义内指定的参量)被认为是在函数体的最外层块的范围内。 -------------------------------------------------------------------------------- 程序和连接 一个程序由连接在一起的一个或多个转换单元组成,从包含main函数的转换单元开始执行(概念上)(有关转换单元的更多信息,参见本书后面“预处理器参考”的“翻译阶段”。 有关main函数,详见本章后面的“程序开始: main函数”)。 连接的类型 在转换单元之间共享对象或函数的名称的方式被称为“连接”。 这些名称有: >内部连接,即它们仅指自己的转换单元中的程序元素,不与其它转换单元共享。 在其它转换单元中的相同的名称可以指不同的对象或不同的类。 具有内部连接的名称有时被认为相对于它们的转换单元是局部的。 具有内部连接的名称的一个说明例子如下: staticinti//static关键字确保是内部连接 >外部连接,即指程序中的任意一个转换单元中的程序元素,在转换单元的之间共享。 在另一个转换单元中的相同名称被认定为指示同一个对象或类,具有外部连接的名称有时被认为是全局的。 具有外部连接的名称的一个说明例子如下: externinti; >无连接,即指唯一实体,在另一个范围中的同样的名称可能不是相同的对象,例如一个枚举(但注意,你可以用无连接来向一个对象传递一个指针,这使得在其它转换单元中该对象是可访问的。 )具有文件范围的名称的连接以下的连接规则适用于具有文件范围的名称(不是typedef及枚举器名称): l如果一个名称被显式说明为static,则它具有内部连接,标识在转换 单元内的一个程序元素。 >枚举器名称及typedef名称是无连接 >具有文件范围的所有其它的名称都是外部连接 Microsoft特殊处 >如果一个具有文件范围的函数名称被显式说明为inline,如果它被实例化或其地址被引用时,它具有外部连接。 因此,对于一个具有文件范围的函数,可能有内部或外部的连接。 Microsoft特殊处结束一个类有内部连接,如果: >不使用C++功能(例如成员访问控制、成员函数、构造函数、析构函数等) >不用于说明具有外部连接的另一个名称。 此限制意味着,类类型对象传递给具有外部连接的函数导致类具有外部连接。 具有类范围的名称的连接 以下连接规则适用于具有类范围的名称 >静态类成员具有外部连接 >类成员函数具有外部连接 >枚举器及typedef名称是无连接 Microsoft特殊处 >被说明为friend函数的函数必须具有外部连接。 把一个静态函数说明为friend会出错。 Microsoft特殊处结束 具有块范围的名称的连接 以下连接规则适用于具有块范围的名称(局部名称): >说明为extern的名称具有外部连接,除非它们在前面说明为static >具有块范围的所有其它名称是无连接 具有无连接的名称 具有无连接的名称仅仅有: >函数参量 >没有被说明为extern或static的块范围名称 >枚举器 >在typedef语句中说明的名称,而当typedef语句用于为一个未命名的类类型提供一个名称时是一个例外。 如果类具有外部连接,则该名称可能具有外部连接。 以下例子给出了具有外部连接的typedef名称的情形: typedefstruct { shortx; shorty; }POINT; externintMoveTo(POINTpt); typedef名称POINT成了未命名的结构的类名,然后它被用于说明一个具有外部连接的函数。 因为typedef名称为无连接,所以在转换单元之间它们的定义可以不同,因为编译是独立地进行的,所以编译器无法检查出这些不同处,结果是,这种类型的错误要到链接时才能被查出。 考虑以下情形: //转换单元1 typedefintINT INTmyInt; ... //转换单元2 typedefshortINT externINTmyInt ... 前面的代码在链接时产生一个“未分解的外部”错误。 C++函数仅能在文件或类范围内定义,以下例子描述了如何定义函数并给出了一个错误的函数定义: #include voidShowChar(charch);//说明函数ShowChar voidShowChar(chatch)//定义函数ShowChar {//函数具有文件范围 cout< } structChar//定义类Char { charShow();//说明Show函数 charGet();//说明Get函数 charch; }; charChar: : Show()//定义具有类范围的Show函数 { cout< returnch } voidGoodFuncDef(charch)//定义具有文件范围的GoodFuncDef { intBadFuncDef(inti)//错误地嵌套函数 { returni*7; } for(inti=0;i (2);++i) cout< cout<<"\n"; } 连接到非C++函数: 只有在前面说明为具有C连接的C函数和数据才能被访问。 可是,它们必须定义在分开的编译过的转换单元中。 语法 连接规格: extern字符串文字{说明表opt} extern字符串文字说明 说明表: 说明 说明表说明 MicrosoftC++支持字符串文字域中的字符串“C”和“C++”。 以下例子给出了可选择的具有C连接的名称的说明方法: //说明printf具有C连接 extern"C"intprintf(constchar*fmt,...); //使头文件"cinclude.h中的所有内容具有C连接 extern"C" { #include } //说明具有C连接的两个函数ShowChar和GetChar extern"C" { charShowChar(charch); charGetChar(void); } //定义具有C连接的两个函数ShowChar和GetChar extern"C"charShowChar(charch) { putchar(ch); returnch; } extern"C"charGetChar(void) { charch; ch=getchar(); returnch } //说明一个具有C连接的全局变量errno extern"C"interrno; -------------------------------------------------------------------------------- 启动和结束 通过使用两个函数: main和exit,使程序方便地启动和结束。 其它的启动和结束代码可能被执行。 程序启动: main函数 一个被称为main的特殊函数是所有C++程序的入口点,此函数并未被编译器预定义,而是必须在程序文本中提供。 如果你正在编写依附于单代码程序设计模式的代码,你可以使用main的宽字符版本wmain。 main的说明语法是: intmain(); 或,可选地: intmain(intargc[,char*argv[][,char*envp[]]]) ;wmain的说明语法如下: intwmain();或,可选地: intwmain(intargc[,wchar_t*argv[][,wchar_t*envp[]]]); 另外,main和wmain函数还可被说明为返回值是void(无返回值)。 如要你将main或wmain说明为返回值void,则用return语句无法向父进程或操作系统返回退出代码。 当main或wmain被说明为void时,若要返回退出代码,则必须使用exit函数。 使用wmain代替main 在单代码程序设计模式中,你可以定义main函数的宽字符版本。 如果你想编写可移植的依附于单代码规格的代码
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 笔记49页 笔记 49
![提示](https://static.bdocx.com/images/bang_tan.gif)