home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional Developers Kit 1992 November / Disc01 / Disc01.mdf / cppbeta / help / dde4cpp.in_ / DDE4CPP.INF (.txt)
Encoding:
OS/2 Help File  |  1992-10-28  |  324.8 KB  |  14,416 lines

  1.  
  2. ΓòÉΓòÉΓòÉ 1. About This Book ΓòÉΓòÉΓòÉ
  3.  
  4. This book describes the C++ language and contains language reference material 
  5. to go along with the IBM C/C++ for OS/2 Programming Guide It describes in 
  6. detail the constructs that make up the OS/2 C/C++ language, and it emphasizes 
  7. the elements of C++ that are not part of the C language. 
  8.  
  9. In this book, the C++ programming language is referred to as C++ +. The IBM* 
  10. C/C++ compiler for OS/2* is referred to as the OS/2 C/C++ compiler. 
  11.  
  12. IMPORTANT 
  13.  
  14. This book is currently being reformatted and adapted to this platform.  Some 
  15. references may be incorrect or unresolved. 
  16.  
  17. The following topics are discussed in this chapter: 
  18.  
  19. o Who  should use this book 
  20. o How to use this book 
  21. o A note about examples 
  22. o How to read the syntax statements 
  23. o Related documentation 
  24.  
  25.  
  26. ΓòÉΓòÉΓòÉ 1.1. Who Should Use This Book ΓòÉΓòÉΓòÉ
  27.  
  28. This book is a reference manual for people who are already familiar with the 
  29. C++ language. It is intended for programmers who want to write applications 
  30. under the OS/2 operating system. It does not fully define the language. 
  31.  
  32.  
  33. ΓòÉΓòÉΓòÉ 1.2. How to Use This Book ΓòÉΓòÉΓòÉ
  34.  
  35. If you are not familiar with the C++ language, you may want to read through 
  36. this book sequentially. If you are familiar with the C++ language and you just 
  37. want specific reference information for some topic, you may want to look 
  38. through the following overview of the chapters: 
  39.  
  40. What is C++ gives a brief overview of the features of the C++ language, 
  41. including a description of the C++ language constructs that support 
  42. object-oriented programming. 
  43.  
  44. Lexical Conventions describes the basic elements of the C++ language. 
  45.  
  46. Experssions and Operators describes the expressions and standard C++ operators 
  47. used in computation. 
  48.  
  49. Declarations describes declarations and declarators. This chapter includes 
  50. descriptions of program linkage, storage classes, fundamental data types, and 
  51. initialization of the fundamental data types. 
  52.  
  53. Standard Conversions describes the standard conversions performed on the 
  54. fundamental data types. 
  55.  
  56. C++ Statements describes the statements used to control the execution sequence 
  57. of programs. 
  58.  
  59. Functions describes the form and use of functions, including function 
  60. declarations and definitions. 
  61.  
  62. C++ Classes describes the concept of classes in C++, including a description of 
  63. the different types of classes, how to declare class objects, and the scoping 
  64. rules for class objects. 
  65.  
  66. Class Members and Friends describes the scoping rules for class members and 
  67. member access rules. 
  68.  
  69. C++ Overloading describes the form and use of overloaded functions and 
  70. overloaded operators. 
  71.  
  72. Special Member Functions describes the member functions that are used to 
  73. create, destroy, convert, initialize, and copy class objects. 
  74.  
  75. Inheritance describes the concept of inheritance, including a description of 
  76. access control for derived and base classes. 
  77.  
  78. Templates describes class templates and function templates. 
  79.  
  80. Exception Handling describes the facilities C++ provides for handling errors 
  81. and other exceptions. 
  82.  
  83. The Preprocessor discusses preprocessor directives. 
  84.  
  85. C-C++ Compatibility summarizes the main differences between American National 
  86. Standard C language definition (ANSI C) and C++. 
  87.  
  88. C++ Grammar Summary provides a complete summary of the grammar used in this 
  89. book. 
  90.  
  91.  
  92. ΓòÉΓòÉΓòÉ 1.3. A Note About Examples ΓòÉΓòÉΓòÉ
  93.  
  94. Examples illustrating the use of the C/C++ Compiler are written in a simple 
  95. style. They are intended to be instructional and do not attempt to minimize run 
  96. time, conserve storage, or check for errors. The examples do not demonstrate 
  97. all of the possible uses of C++ language constructs. Some examples are only 
  98. code fragments and will not compile without additional code. 
  99.  
  100.  
  101. ΓòÉΓòÉΓòÉ 1.4. How to Read the Syntax Statements ΓòÉΓòÉΓòÉ
  102.  
  103. Throughout this book, syntax statements describe the form and syntax of C++. A 
  104. complete summary of the C++ grammar used in this book is presented in Appendix 
  105.  
  106. o Syntax statements are read from left to right. 
  107.  
  108. o Optional parameters are contained in [  ] (square brackets). 
  109.  
  110. o Parameters that can be repeated are followed by an ... (ellipsis). 
  111.  
  112. o Keywords appear as bold letters (for example, define) and must be spelled 
  113.   exactly as shown. 
  114.  
  115. o Variables appear in italic letters (for example, identifier ) and represent 
  116.   user-supplied values or parameters. 
  117.  
  118. o Punctuation marks, parentheses, arithmetic operators, or other symbols that 
  119.   you must type as part of the syntax are shown in bold. For example: 
  120.  
  121.           .postfix-expression ( [
  122.     expression-list
  123.     ] )
  124.  
  125. o In general, white space is permitted between language elements. The 
  126.   description of the syntax indicates where white space is not allowed. 
  127.  
  128.  
  129. ΓòÉΓòÉΓòÉ 1.5. Related Documentation ΓòÉΓòÉΓòÉ
  130.  
  131. You may want to refer to the following publications for additional information. 
  132.  
  133.  
  134. ΓòÉΓòÉΓòÉ 1.5.1. IBM Publications ΓòÉΓòÉΓòÉ
  135.  
  136. o IBM C/C++ for OS/2 Programming Guide 
  137.  
  138. o IBM C/C++ for OS/2 &cpplus. Basic Class Library Guide 
  139.  
  140. o IBM C/C++ for OS/2 &cpplus. IBM Class Libraries: Collection Classes Reference 
  141.  
  142. o IBM C/C++ for OS/2 &cpplus. IBM Class Libraries: User Interface Reference 
  143.  
  144.  
  145. ΓòÉΓòÉΓòÉ 1.5.2. Non-IBM Publications ΓòÉΓòÉΓòÉ
  146.  
  147. The C++ language was developed by Bjarne Stroustrup of AT&T** Bell 
  148. Laboratories. For more information about the history of the language, refer to 
  149. books and papers written by him. 
  150.  
  151. Many commercial books have been written about the C++ language and more appear 
  152. each month. The authors use varying approaches and emphasis. The following is a 
  153. sample of some of the non-IBM C++ publications that are generally available. 
  154. This sample is not an exhaustive list. IBM does not specifically recommend any 
  155. of these books, and other C++ publications may be available in your locality. 
  156.  
  157. o The Annotated C++ Reference Manual by Margaret A. Ellis and Bjarne 
  158.   Stroustrup, Addison-Wesley Publishing Company. 
  159.  
  160. o The C++ Programing Language (Second Edition) by Bjarne Stroustrup, 
  161.   Addison-Wesley Publishing Company. 
  162.  
  163. o C++ Primer (Second Edition) by Stanley B. Lippman, Addison-Wesley Publishing 
  164.   Company. 
  165.  
  166. At this time, there is no universal standard for the C++ language comparable to 
  167. the C standards. However, a committee of the American National Standard for 
  168. Information Systems (ANSI) is developing one. Their current working paper, 
  169. Working Paper for Draft Proposed American National Standard for Information 
  170. Systems - Programming Language C++ (X3J16/92-0060) was used as a base document 
  171. for developing the OS/2 C/C++ Compiler. 
  172.  
  173. Because C++ evolved from C, you should be aware of the C standards. The 
  174. following documents describe the standards for the C language. 
  175.  
  176. o American National Standard for Information Systems - Programming Language C 
  177.   (X3.159-1989) &dnansic. presents the ANSI standard for the C language. 
  178.  
  179. o International Standard C ISO/IEC 9899 &dnisoc. presents the International 
  180.   Standards Organization (ISO) standard for the C language. 
  181.  
  182.  
  183. ΓòÉΓòÉΓòÉ 2. Chapter 2. What Is C++? ΓòÉΓòÉΓòÉ
  184.  
  185. This chapter describes the C++ language, briefly summarizes the differences 
  186. between C and C++, and discusses the principles of object-oriented programming. 
  187. The following topics are discussed in this chapter: 
  188.  
  189. o The C[++ ] language 
  190. o C[++] support for object-oriented programming 
  191. o C[++] programs 
  192. o Declarations and definitions 
  193. o Scope 
  194. o Simple input and output 
  195. o Linkage specifications - linking to non-C[++] programs. 
  196.  
  197. You can also return to the table of contents 
  198.  
  199.  
  200. ΓòÉΓòÉΓòÉ 2.1. The C++ Language ΓòÉΓòÉΓòÉ
  201.  
  202. C++ is an object-oriented language based on the C programming language. It can 
  203. be viewed as a superset of C. Almost all of the features and constructs 
  204. available in C are also available in C++. However, C++ is more than just an 
  205. extension of C. Its additional features support the programming style known as 
  206. object-oriented programming. Several features that are already available in C, 
  207. such as input and output, are implemented differently in C++. 
  208.  
  209. C++ was developed by Bjarne Stroustrup of AT&T Bell Laboratories. C++ was 
  210. originally based on the definition of the C language stated in The C 
  211. Programming Language by Brian W. Kernighan and Dennis M. Ritchie. This C 
  212. language definition is commonly called K&R C. Since the introduction of C++, 
  213. the American National Standard C language definition (commonly called ANSI C) 
  214. has been developed. The ANSI C definition specifies many of the features that 
  215. K&R left unspecified. Features of ANSI C have been incorporated into the 
  216. current definition of C++, and some parts of the ANSI C definition have been 
  217. motivated by C++. 
  218.  
  219. While there is currently no C++ standard comparable to the ANSI C definition, 
  220. an ANSI committee is working on such a definition. The current draft of the 
  221. American National Standard for Information Systems - Programming Language C++ 
  222. is the source document for the upcoming standardization of C++. Developers of 
  223. the &xcomp. are adhering to the current version of the working paper ofthe 
  224. American National Standard for Information Systems - Programming Language C++ . 
  225.  
  226.  
  227. ΓòÉΓòÉΓòÉ 2.2. C++ Support for Object-Oriented Programming ΓòÉΓòÉΓòÉ
  228.  
  229. Object-oriented programming is a programming approach based on the concepts of 
  230. data abstraction, inheritance and polymorphism. Unlike procedural programming 
  231. techniques, object-oriented programming concentrates not on how something is 
  232. accomplished but instead on what data objects are involved in the problem and 
  233. how they are manipulated. Based on the foundation of data abstraction, 
  234. object-oriented programming allows you to reuse existing code more efficiently 
  235. and increase their productivity. 
  236.  
  237.  
  238. ΓòÉΓòÉΓòÉ 2.2.1. Types and Objects ΓòÉΓòÉΓòÉ
  239.  
  240. The C++ fundamental types are those found in ANSI C and include int, float, and 
  241. double. In this document, instantiations of data types are referred to as 
  242. objects . As in ANSI C, you must declare an object in C++ before you can use 
  243. it. In C++ code, objects are represented by variables.  A variable also 
  244. represents the location in storage that contains the value of an object. 
  245.  
  246. Like ANSI C, C++ allows you to assign new type names by using the typedef 
  247. construct. These new type names are not new types. 
  248.  
  249. C++ also supports the ANSI C non-fundamental types.  It extends the definition 
  250. of two of the non-fundamental types, struct and union . 
  251.  
  252.  
  253. ΓòÉΓòÉΓòÉ 2.2.2. Data Abstraction ΓòÉΓòÉΓòÉ
  254.  
  255. Data abstraction provides the foundation for object-oriented programming. In 
  256. addition to providing fundamental data types, object-oriented programming 
  257. languages allow the user to define their own data types, called user-defined or 
  258. abstract data types. In the C programming language, related data items can be 
  259. organized into structures. These structures can then be manipulated as units of 
  260. data. In addition to providing this type of data structure, object-oriented 
  261. programming languages allow you to implement a set of operations that can be 
  262. applied to the data elements. The data elements and the set of operations 
  263. applicable to the data elements together form the abstract data type. 
  264.  
  265. To support data abstraction, a programming language must provide a construct 
  266. that can be used to encapsulate the data elements and operations that make up 
  267. an abstract data type. In the C++ programming language, this construct is 
  268. called a class . An instance of a class is called an object. Classes are 
  269. composed of data elements called data members and member functions that define 
  270. the operations that can be carried out on the data members. 
  271.  
  272.  
  273. ΓòÉΓòÉΓòÉ 2.2.3. Encapsulation ΓòÉΓòÉΓòÉ
  274.  
  275. Another key feature of object-oriented programming is encapsulation. 
  276. Encapsulation means a class can hide the details of: 
  277.  
  278. o The representation of its data members 
  279.  
  280. o The implementation of the operations that can be performed on these data 
  281.   members. 
  282.  
  283. Application programs manipulate objects of a class using a clearly defined 
  284. interface. As long as this interface does not change, you can change the 
  285. implementation of a class without having to change the application programs 
  286. that use the class. Thus, encapsulation provides the following advantages: 
  287.  
  288. o Users of a class do not have to deal with unnecessary implementation details. 
  289.  
  290. o Programs are easier to debug and maintain. 
  291.  
  292. o Unwanted alterations are prevented. 
  293.  
  294. In C++, encapsulation is enforced by specifying the level of access control for 
  295. each member of a class. Both the data members and member functions of a class 
  296. can be declared public, protected, or private depending on the degree of access 
  297. control required. 
  298.  
  299.  
  300. ΓòÉΓòÉΓòÉ 2.2.4. Inheritance ΓòÉΓòÉΓòÉ
  301.  
  302. Inheritance lets you reuse existing code and data structures in new 
  303. applications. In C++, inheritance is implemented through class derivation. You 
  304. can extend a library of existing classes by adding data elements and operations 
  305. to existing classes to form derived classes. A derived class has all the 
  306. members of its parent or base class, as well as extensions that can provide 
  307. additional features. When you  create a new derived class, you only have to 
  308. write the code for the additional features.  The existing features of the base 
  309. class are already available. 
  310.  
  311. A base class can have more than one class derived from it. In addition, a 
  312. derived class can serve as a base class for other derived classes in a 
  313. hierarchy. Typically, a derived class is more specialized than its base class. 
  314.  
  315. A derived class can inherit data members and member functions from more than 
  316. one base class. Inheritance from more than one base class is called multiple 
  317. inheritance . 
  318.  
  319.  
  320. ΓòÉΓòÉΓòÉ 2.2.5. Dynamic Binding and Polymorphism ΓòÉΓòÉΓòÉ
  321.  
  322. Another key concept that allows you to write generic programs is dynamic or 
  323. late binding. Dynamic binding affects the derivation process and allows each 
  324. user-defined class in an inheritance hierarchy to have a different 
  325. implementation of a particular function.  Application programs can then apply 
  326. that function to an object without needing to know the specifics of the class 
  327. that the object belongs to. In C++, dynamic binding hides the differences 
  328. between a group of classes in an inheritance hierarchy from the application 
  329. program. At run-time, the system will determine the specific class of the 
  330. object and invoke the appropriate function implementation for that class. 
  331.  
  332.  
  333. ΓòÉΓòÉΓòÉ 2.2.6. Other Features of C[++ ΓòÉΓòÉΓòÉ
  334.  
  335.  
  336. C++ provides several other powerful extensions to the C programming language 
  337. that are not necessarily part of object-oriented programming. Among these 
  338. extensions are: 
  339.  
  340. o Constructors and destructors, which are used to create, initialize and 
  341.   destroy class objects. 
  342.  
  343. o Overloaded functions and operators, which provide static or compile-time 
  344.   binding of function calls. 
  345.  
  346. o Inline functions, which aid in optimization 
  347.  
  348. o "Pass-by-reference calls", which allow a function to modify its arguments in 
  349.   the calling function. 
  350.  
  351. o Template functions and classes, which allow user-defined families of classes 
  352.   and compile-time binding of functions 
  353.  
  354. o Exception handling, which provides transfer of control and recovery from 
  355.   errors and other exceptional circumstances. 
  356.  
  357.  
  358. ΓòÉΓòÉΓòÉ 2.3. C++ Programs ΓòÉΓòÉΓòÉ
  359.  
  360. C++ programs contain many of the same programming statements and constructs as 
  361. C programs. C++ has the same built-in data types as C. The scope and storage 
  362. class rules for C also apply in C++. In addition, C and C++ have the same set 
  363. of arithmetic and logical operators. 
  364.  
  365. In C++, a name can identify an object, a function, a set of functions, an 
  366. enumerator, a type, a class member, a template, a value, or a label. A 
  367. declaration introduces a name into a program and can define an area of storage 
  368. associated with that name. 
  369.  
  370. An expression performs some computational action and is composed of operations 
  371. and operands. An expression terminating with a semicolon is called a statement. 
  372. A statement is the smallest independent computational unit. Functions are 
  373. composed of groups of one or more statements. 
  374.  
  375. A C++ program is composed of one or more functions. These functions can all 
  376. reside in a single file or can be placed in different files which are linked to 
  377. each other. In C++, a program must have one and only one function called main() 
  378.  
  379. The following is a simple C++ program containing declarations, expressions, 
  380. statements, and two functions: 
  381.  
  382. #include <math.h>                         // contains definition
  383. of abs()
  384. extern double multiplier, common_ratio;   // variable
  385. declarations
  386. double geo_series(double a, double r)     // function definition
  387. {
  388.       if (r == 1)                         // if statement
  389.             return -1.0;                  // return statement
  390.       else if (abs(r) < 1.0)              // else if statement
  391.             return (a / (1 - r));         // statement containing
  392.                                           // expression
  393.       else return -2.0;
  394. }
  395. void main () // program execution begins here
  396. {
  397.       double sum; // variable definition
  398.        sum = geo_series(multiplier, common_ratio); // function
  399. call
  400.       // ..
  401. }
  402.  
  403.  
  404. ΓòÉΓòÉΓòÉ 2.4. Declarations and Definitions ΓòÉΓòÉΓòÉ
  405.  
  406. Declarations introduce identifiers into the program. A declaration is a 
  407. definition unless it: 
  408.  
  409. o declares a function without including the function body 
  410.  
  411. o contains the extern storage class specifier and has no initializer or 
  412.   function body 
  413.  
  414. o declares a static data member in a class declaration 
  415.  
  416. o declares a class name 
  417.  
  418. o declares a typedef. 
  419.  
  420. The following are only declarations: 
  421.  
  422. extern double d;
  423. extern int i;
  424. int bar(int);
  425. class C;
  426. typedef float FP;
  427.  
  428. The following declarations are also definitions: 
  429.  
  430. double d;
  431. extern int i = 1;
  432. int bar(int b) {return b;}
  433. class C { int a;};
  434. enum direction {vertical, horizontal};
  435.  
  436. A given function, object, or type can have only one definition. It can have 
  437. more than one declaration as long as all of the declarations match. If a 
  438. function is never called and its address is never taken, then you do not have 
  439. to define it. You can define a given class or enumerator more than once, but 
  440. every definition must be the same. 
  441.  
  442. One of the fundamental differences between C++ and C is the placement of 
  443. variable declarations. Although variables are declared in the same way, in C++ 
  444. variable declarations can be placed anywhere in the program. In C, variable 
  445. declarations must come before any other statements in a block. In the following 
  446. example, the variable d is declared in the middle of the main() function: 
  447.  
  448. #include<iostream.h>
  449. void main()
  450. {
  451.       int a, b;
  452.       cout << "Please enter three integers" <<
  453. endl;
  454.       cin >> a >> b;
  455.       int d = a + b;
  456.       cout << "Here is the sum of your two integers
  457. " << d << endl;
  458. }
  459.  
  460. In C++ function declarations, you must declare the number and type of arguments 
  461. that the function takes. This style of function declaration is the same as 
  462. function prototyping in ANSI C. You must declare the type of each argument 
  463. separately. In the following example the function yonge() takes two int 
  464. arguments and returns an int value: 
  465.  
  466. int yonge(int, int);
  467.  
  468. You can include optional argument identifiers in a function declaration. For 
  469. example: 
  470.  
  471. int yonge(int a, int b);
  472.  
  473.  
  474. ΓòÉΓòÉΓòÉ 2.5. Scope ΓòÉΓòÉΓòÉ
  475.  
  476. The area of the code where an identifier is visible is referred to as the scope 
  477. of the identifier. The four kinds of scope are: 
  478.  
  479. o Local 
  480.  
  481. o Function 
  482.  
  483. o File 
  484.  
  485. o Class. 
  486.  
  487. The scope of a name is determined by the location of the name's declaration. 
  488.  
  489. A type name first declared in a function return type has file scope. A type 
  490. name first declared in a function argument list has local scope. 
  491.  
  492. A function name that is first declared as a friend of a class is in the first 
  493. non-class scope that encloses the class. If the friend function is a member of 
  494. another class, it has the scope of that class. A class name first declared as a 
  495. friend of a class has the scope of the class containing the friend declaration. 
  496.  
  497.  
  498. ΓòÉΓòÉΓòÉ 2.5.1. Local Scope ΓòÉΓòÉΓòÉ
  499.  
  500. A name has local scope if it is declared in a block. A name with local scope 
  501. can be used in that block and in blocks enclosed within that block, but the 
  502. name must be declared before it is used. When the block is exited, the names 
  503. declared in the block are no longer available. 
  504.  
  505. Formal argument names for a function have the scope of the outermost block of 
  506. that function. 
  507.  
  508. If a local variable is a class object with a destructor, the destructor is 
  509. called when control passes out of the block in which the class object was 
  510. constructed. 
  511.  
  512. When one block is nested inside another, the variables from the outer block are 
  513. usually visible in the nested block. However, if an outer block variable is 
  514. redefined in a nested block, the new declaration is in effect in the inner 
  515. block. The original declaration is restored when program control returns to the 
  516. outer block. This is called block visibility. 
  517.  
  518.  
  519. ΓòÉΓòÉΓòÉ 2.5.2. Function Scope ΓòÉΓòÉΓòÉ
  520.  
  521. The only type of identifier with function scope is a label name. A label is 
  522. implicitly declared by its appearance in the program text and is visible 
  523. throughout the function that declares it. 
  524.  
  525.  
  526. ΓòÉΓòÉΓòÉ 2.5.3. File Scope ΓòÉΓòÉΓòÉ
  527.  
  528. A name has file scope if its declaration appears outside of all blocks and 
  529. classes. A name with file scope is visible from the point where it is declared 
  530. to the end of the source file. The name is also made accessible for the 
  531. initialization of global variables. If a name is declared extern, it is also 
  532. visible, at linkage time, in all object files being linked. Global names are 
  533. names declared with file scope. 
  534.  
  535.  
  536. ΓòÉΓòÉΓòÉ 2.5.4. Class Scope ΓòÉΓòÉΓòÉ
  537.  
  538. The name of a class member has class scope and can only be used in the 
  539. following cases: 
  540.  
  541. o In a  member function of that class 
  542.  
  543. o In a member function of a class derived from that class 
  544.  
  545. o After the . (dot) operator applied to an instance of that class 
  546.  
  547. o After the . (dot) operator applied to a class derived from that class 
  548.  
  549. o After the -> (arrow) operator applied to a pointer to an instance of that 
  550.   class 
  551.  
  552. o After the -> (arrow) operator applied to a pointer to class derived from that 
  553.   class 
  554.  
  555. o After the :: (scope) operator applied to the name of a class 
  556.  
  557. o After the :: (scope) operator applied to a class derived from that class. 
  558.  
  559. See "Scope of Class Names" for more details on class scope. 
  560.  
  561.  
  562. ΓòÉΓòÉΓòÉ 2.6. Simple Input and Output ΓòÉΓòÉΓòÉ
  563.  
  564. Like C, the C++ language has no built-in input and output facilities. Instead, 
  565. input and output facilities for C++ are provided by the I/O Stream Library. For 
  566. compatibility with C, C++ also supports the standard C I/O functions. The I/O 
  567. Stream Library supports a set of I/O operations, written in the C++ language, 
  568. for the built-in types. You can extend these facilities to provide input and 
  569. output functions for user-defined data types. 
  570.  
  571. For a complete description of the I/O Stream Library, see "Introduction to the 
  572. I/O Stream Library" in the Basic Class Library Guide  Compiler/6000 Version 
  573. 1.1.1. 
  574.  
  575. There are four standard predefined I/O stream objects that you can use to 
  576. perform standard I/O: 
  577.  
  578. o cout 
  579.  
  580. o cin 
  581.  
  582. o cerr 
  583.  
  584. o clog 
  585.  
  586. You can use these in conjunction with the overloaded << (insertion or output) 
  587. and  (extraction or input) operators. In order to use these streams and 
  588. operators, you must include the header file iostream.h. The following example 
  589. prints Hello World! to standard output. 
  590.  
  591. #include<iostream.h>
  592. main()
  593. {
  594.       cout << "Hello World!" << endl;
  595. }
  596.  
  597. The manipulator endl acts as a newline character, causing any output following 
  598. it to be directed to the next line. 
  599.  
  600.  
  601. ΓòÉΓòÉΓòÉ 2.6.1. Output ΓòÉΓòÉΓòÉ
  602.  
  603. The cout stream is associated with standard output. You can use the output 
  604. operator in conjunction with cout to direct a value to standard output. 
  605. Successive output operators are concatenated when applied to cout. The 
  606. following example prints out three strings in a row and produces the same 
  607. result as the previous example, printing Hello World! to standard output. 
  608.  
  609. #include<iostream.h>
  610. main()
  611. {
  612.       cout << "Hello " << "World" <<
  613. "!" << endl;
  614. }
  615.  
  616. The output operator is defined to accept arguments of any of the fundamental 
  617. data types, as well as pointers, references and array types. You can also 
  618. overload the output operator to define output for your own class types. 
  619.  
  620. The cerr and clog streams direct output to standard error. cerr provides 
  621. unbuffered output, while clog provides buffered output. The following example 
  622. checks for a division by zero condition. If one occurs, a message is sent to 
  623. standard error. 
  624.  
  625. #include<iostream.h>
  626. main()
  627. {
  628.       double val1, val2;
  629.       cout << "Divide Two Values" << endl;
  630.       cout << "Enter two numeric values: " <<
  631. endl;
  632.       cin >> val1 >> val2;
  633.       if (val2 == 0 )
  634.       {      cerr << "The second value must be non-zero"
  635. << endl;
  636.              return;
  637.       }
  638.       cout << "The answer is " << val1 /
  639. val2 << endl;
  640. }
  641.  
  642.  
  643. ΓòÉΓòÉΓòÉ 2.6.2. Input ΓòÉΓòÉΓòÉ
  644.  
  645. The cin class object is associated with standard input. You can use the input 
  646. operator in conjunction with cin to read a value from standard input. White 
  647. space (including blanks, tabs, and newlines) is disregarded by the input 
  648. operator. For example: 
  649.  
  650. #include<iostream.h>
  651. main()
  652. {
  653.       double val1, val2;
  654.       cout << "Enter two numeric values:" <<
  655. endl;
  656.       cin >> val1 >> val2;
  657.       cout       << "The first value entered is "
  658. << val1
  659.             << " and the second value is "
  660.             << val2 << "." << endl;
  661. }
  662.  
  663. If the values 1.2 and 3.4 were entered through standard input, the above 
  664. program prints the following to standard output: 
  665.  
  666. Enter two numeric values:
  667. 1.2
  668. 3.4
  669. The first value entered is 1.2 and the second value is
  670. 3.4.
  671.  
  672. Any white space entered between the two numeric values is disregarded by the 
  673. input operator. 
  674.  
  675. The input operator is defined to accept arguments of any of the fundamental 
  676. data types, as well as pointers, references and array types. You can also 
  677. overload the input operator to define input for your own class types. 
  678.  
  679.  
  680. ΓòÉΓòÉΓòÉ 2.7. Linkage Specifications - Linking to non-C++ Programs ΓòÉΓòÉΓòÉ
  681.  
  682. You can link C++ code to code produced by other compilers by using a linkage 
  683. specification. The syntax is: 
  684.  
  685.       linkage-specification:
  686.             extern string-literal
  687. {
  688. [declaration-list] }
  689.             extern string-literal declaration
  690.  
  691.       declaration-list:
  692.             declaration
  693.             declaration-list declaration
  694.  
  695. .* From heading: "String Literals" string-literal  is used to specify the 
  696. linkage associated with a particular function. For example, 
  697.  
  698. extern "C" printf(char*,...);
  699. void main()
  700. {
  701.       printf("hello\n");
  702. }
  703.  
  704. Here the string-literal, "C", tells the compiler that the routine 
  705. printf(char*,...) is a C library function. Note that string literals used in 
  706. linkage specifications are not case sensitive. 
  707.  
  708. The valid values for string-literal include: 
  709.  
  710. "C++"     Default 
  711.  
  712. "C"       C type linkage 
  713.  
  714. If the value of string-literal is not recognized, C type linkage is used. For 
  715. further details on linkage specifications, see "Using the XL C[++] 
  716. Compiler/6000 with Other Programming Languages" in the Programming Guide 
  717. Compiler/6000. 
  718.  
  719.  
  720. ΓòÉΓòÉΓòÉ 3. .Chapter 3. Lexical Conventions ΓòÉΓòÉΓòÉ
  721.  
  722. This chapter describes the following basic elements of C++ : 
  723.  
  724. o Tokens 
  725. o The C++ character set 
  726. o Trigraph sequences 
  727. o Digraph sequences 
  728. o Escape sequences 
  729. o Comments 
  730. o Identifiers 
  731. o Keywords 
  732. o Literals. 
  733.  
  734. You can also return to the table of contents 
  735.  
  736.  
  737. ΓòÉΓòÉΓòÉ 3.1. Tokens ΓòÉΓòÉΓòÉ
  738.  
  739. You can view C++ source code as a sequence of tokens. There are five different 
  740. types of tokens: 
  741.  
  742. o Identifiers 
  743.  
  744. o Keywords 
  745.  
  746. o Literals 
  747.  
  748. o Operators 
  749.  
  750. o Other separators. 
  751.  
  752. Adjacent identifiers, keywords and literals must be separated with white space. 
  753. White space includes blanks, horizontal and vertical tabs, newlines, formfeeds 
  754. and comments. 
  755.  
  756.  
  757. ΓòÉΓòÉΓòÉ 3.2. The C++ Character Set ΓòÉΓòÉΓòÉ
  758.  
  759. C++ source programs use the following character set: 
  760.  
  761. o The lowercase and uppercase letters of the English alphabet. 
  762.  
  763.           a b c d e f g h i j k l m n o p q r s t u v w x y
  764.     z
  765.  
  766.           A B C D E F G H I J K L M N O P Q R S T U V W X Y
  767.     Z
  768.  
  769.   C++ treats lowercase and uppercase letters as distinct characters. If you 
  770.   specifya lowercase a, an uppercase A cannot be substituted. 
  771.  
  772. o The digits: 
  773.  
  774.           0 1 2 3 4 5 6 7 8 9
  775.  
  776. o The following special characters: 
  777.  
  778.           ! " # % & ' ( ) * + , - . / :
  779.  
  780.           ; < = > ? [ \ ] ^ _ { } ~ |
  781.  
  782.   where the # character is used for preprocessing only, and the _ character is 
  783.   treated as a normal letter. 
  784.  
  785. o The space character. 
  786.  
  787. o The control characters that represent horizontal and vertical tabs, newlines, 
  788.   and formfeeds. 
  789.  
  790. o In extended mode, the &xcomp. allows the $ character to be used in 
  791.   identifiers to facilitate calls between different XL languages. See 
  792.   "Interlanguage Calling Conventions" in the Programming Guide 
  793.  
  794.  
  795. ΓòÉΓòÉΓòÉ 3.3. Trigraph Sequences ΓòÉΓòÉΓòÉ
  796.  
  797. Certain characters contained in the C++ character set are not available on all 
  798. keyboards. You can represent these characters in a C++ source program by using 
  799. a combination of keystrokes called a trigraph sequence. Before preprocessing, 
  800. each trigraph sequence in a string or a literal is replaced by the single 
  801. character that it represents. Trigraphs cannot be created using macro 
  802. concatenation. The trigraph sequences are: 
  803.  
  804. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  805. Γöé ??=                 Γöé #                   Γöé pound sign         Γöé
  806. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  807. Γöé ??(                 Γöé [                   Γöé left bracket       Γöé
  808. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  809. Γöé ??)                 Γöé ]                   Γöé right bracket      Γöé
  810. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  811. Γöé ??/                 Γöé \                   Γöé backslash          Γöé
  812. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  813. Γöé ??'                 Γöé ^                   Γöé caret              Γöé
  814. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  815. Γöé ??!                 Γöé Γöé                   Γöé pipe               Γöé
  816. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  817. Γöé ??<                 Γöé {                   Γöé left brace         Γöé
  818. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  819. Γöé ??>                 Γöé }                   Γöé right brace        Γöé
  820. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  821. Γöé ??-                 Γöé ~                   Γöé tilde.             Γöé
  822. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  823.  
  824.  
  825. ΓòÉΓòÉΓòÉ 3.4. Digraph Sequences ΓòÉΓòÉΓòÉ
  826.  
  827. If you use the -qdigraph compile option, you can represent unavailable 
  828. characters in a C++ source program by using a combination of two keystrokes 
  829. called a digraph sequence. Digraphs are read as tokens during the preprocessor 
  830. phase. Digraphs can be created using macro concatenation. They are not replaced 
  831. in string literals or in character literals. For example: 
  832.  
  833. char *s = "<%%>"; // stays "<%%>"
  834.  
  835. switch (c)
  836. {
  837.       case '<%' : { /* ... /* } // stays '<%'
  838.       case '%>' : { /* ... /* } // stays '%>'
  839. }
  840.  
  841. The digraph sequences are: 
  842.  
  843. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  844. Γöé %%                  Γöé #                   Γöé pound sign         Γöé
  845. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  846. Γöé < :                 Γöé [                   Γöé left bracket       Γöé
  847. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  848. Γöé : >                 Γöé ]                   Γöé right bracket      Γöé
  849. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  850. Γöé <%                  Γöé {                   Γöé left brace         Γöé
  851. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  852. Γöé %>                  Γöé }                   Γöé right brace        Γöé
  853. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  854.  
  855. For more information on the -qdigraph compiler option, see the "Summary of the 
  856. C[++ ] Compiler/6000 Options" of the Programming Guide 
  857.  
  858.  
  859. ΓòÉΓòÉΓòÉ 3.5. Escape Sequences ΓòÉΓòÉΓòÉ
  860.  
  861. Escape sequences are primarily used to place nonprintable characters in 
  862. character and string literals. You can use an escape sequence to represent any 
  863. member of the ASCII system character set. For example, an escape sequence can 
  864. be used to place a tab, carriage return, or backspace into a string literal or 
  865. character constant. 
  866.  
  867. An escape sequence consists of a \ (backslash) symbol followed by one of the 
  868. escape sequence characters. The C++ escape sequences are: :dtchd. Escape 
  869. Character Sequence    Represented 
  870.  
  871. \a        Alert (bell) 
  872.  
  873. \b        Backspace 
  874.  
  875. \f        Form feed (new page) 
  876.  
  877. \n        New-line 
  878.  
  879. \r        Carriage return 
  880.  
  881. \t        Horizontal tab 
  882.  
  883. \v        Vertical tab 
  884.  
  885. \'        Single quotation mark 
  886.  
  887. \"        Double quotation mark 
  888.  
  889. \?        Question mark 
  890.  
  891. \\        Backslash. 
  892.  
  893. You can use the first seven escape sequences, \a through \v, in string literals 
  894. to add the features shown above. You can use the single quotation mark escape 
  895. sequence, \', to place a single quotation mark in a character literal. The 
  896. double quotation mark escape sequence, \", places a double quotation mark in a 
  897. string literal. The question mark escape sequence, \? , places the question 
  898. mark character found in a trigraph in a string literal. The backslash escape 
  899. sequence, \\ , places a backslash character found in an escape sequence in a 
  900. string literal. For example: 
  901.  
  902.       cout << "The escape sequence \\n." <<
  903. endl;
  904.  
  905. This statement will result in the following output: 
  906.  
  907.       The escape sequence \n.
  908.  
  909. To represent an octal number, use a backslash followed by up to three octal 
  910. digits. The maximum length of an octal escape sequence is three digits.To 
  911. represent a hexadecimal number, use a backslash followed by x followed by any 
  912. number of hexadecimal digits.  A hexadecimal escape sequence terminates with 
  913. the first digit that is not a hexadecimal digit; however, the &xcomp. only uses 
  914. the last two digits. 
  915.  
  916. The octal and hexadecimal escape sequences specify the value of the character 
  917. they represent. For example, the character 'a' can be represented by the octal 
  918. escape sequence \141 and the hexadecimal escape sequence\x61 because the value 
  919. of 'a' in ASCII is97. The following program prints the character 'a' four times 
  920. to standard output, and then prints a new line: 
  921.  
  922. #include<iostream.h>
  923. void main()
  924.       {
  925.       char a,b,c,d,e;
  926.       a='a';
  927.       b=97;
  928.       c='\141';
  929.       d='\x61';
  930.       e='\n';
  931.       cout << a << b << c <<
  932. d << e;
  933.       }
  934.  
  935.  
  936. ΓòÉΓòÉΓòÉ 3.6. Comments ΓòÉΓòÉΓòÉ
  937.  
  938. There are two types of comments in C++. Single line comments begin with two 
  939. adjacent slashes // and terminate at the end of the line they appear on. The /* 
  940. characters begin a single or multiple line comment that terminates with the */ 
  941. characters. Because comments cannot be nested, the comment characters // , /* 
  942. and */ have no meaning within a single line comment. Similarly, the comment 
  943. characters // and /* have no meaning within a comment beginning with /*. 
  944.  
  945. In the following example, all characters recognized by C++ as comments are 
  946. highlighted in boldface type: 
  947.  
  948. 1      // A function with nested comments
  949. 2
  950. 3      void f()
  951. 4      {
  952. 5            int num;
  953. 6            char letter;
  954. 7            /*
  955. 8                 num = 55; // initialize num
  956. 9                 letter = 'A'; */
  957. 10            */
  958. 11            // The previous line causes an error
  959. 12      }
  960.  
  961. When the function f() is read, the &xcomp. &xcompos2. reads lines 7 through 9 
  962. as a comment, but line 10 is a C++ statement and generates a compiler error. 
  963. The comment on line 11 is a valid single-line comment. 
  964.  
  965.  
  966. ΓòÉΓòÉΓòÉ 3.7. Identifiers ΓòÉΓòÉΓòÉ
  967.  
  968. Identifiers provide names for the C++ elements. An identifier is made up of an 
  969. arbitrary number of digits and letters but must begin with a letter. The _ 
  970. (underscore) character is viewed as a letter. There is no set maximum length 
  971. for an identifier in C++. 
  972.  
  973. C++ distinguishes between the uppercase and lowercase letters in an identifier. 
  974. Thus, the identifiers TRUE, True, and true all represent different names. 
  975.  
  976. C++ reserves identifiers containing _ _ (double underscore) and beginning with 
  977. _ (single underscore). 
  978.  
  979. Identifiers can only contain the $ character in extended mode. See 
  980. "Interlanguage Calling Conventions" in the Programming Guide for more details. 
  981.  
  982.  
  983. ΓòÉΓòÉΓòÉ 3.8. Keywords ΓòÉΓòÉΓòÉ
  984.  
  985. Keywords are identifiers reserved by C++ for special uses. Only the lowercase 
  986. versions are reserved. For example, Do, containing an uppercase letterD, is not 
  987. a keyword in C++. You can use keywords as macro names. The following is a list 
  988. of C++ keywords. 
  989.  
  990. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  991. Γöé asm      Γöé continue Γöé float    Γöé new      Γöé signed   Γöé try     Γöé
  992. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  993. Γöé auto     Γöé default  Γöé for      Γöé operator Γöé sizeof   Γöé typedef Γöé
  994. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  995. Γöé break    Γöé delete   Γöé friend   Γöé private  Γöé static   Γöé union   Γöé
  996. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  997. Γöé case     Γöé do       Γöé goto     Γöé pro-     Γöé struct   Γöé unsignedΓöé
  998. Γöé          Γöé          Γöé          Γöé tected   Γöé          Γöé         Γöé
  999. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1000. Γöé catch    Γöé double   Γöé if       Γöé public   Γöé switch   Γöé virtual Γöé
  1001. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1002. Γöé char     Γöé else     Γöé inline   Γöé register Γöé template Γöé void    Γöé
  1003. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1004. Γöé class    Γöé enum     Γöé int      Γöé return   Γöé this     Γöé vola-   Γöé
  1005. Γöé          Γöé          Γöé          Γöé          Γöé          Γöé tile    Γöé
  1006. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1007. Γöé const    Γöé extern   Γöé long     Γöé short    Γöé throw    Γöé while   Γöé
  1008. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1009.  
  1010. If you use the -qdigraph compile option, you can represent unavailable 
  1011. characters in a C++ source program by using the following keywords: 
  1012.  
  1013. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1014. Γöé KEYWORD  Γöé Symbol   Γöé          Γöé          Γöé          Γöé         Γöé
  1015. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1016. Γöé bitand   Γöé &        Γöé          Γöé          Γöé          Γöé         Γöé
  1017. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1018. Γöé and      Γöé &&       Γöé          Γöé          Γöé          Γöé         Γöé
  1019. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1020. Γöé bitor    Γöé Γöé        Γöé          Γöé          Γöé          Γöé         Γöé
  1021. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1022. Γöé or       Γöé ΓöéΓöé       Γöé          Γöé          Γöé          Γöé         Γöé
  1023. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1024. Γöé xor      Γöé ^        Γöé          Γöé          Γöé          Γöé         Γöé
  1025. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1026. Γöé compl    Γöé ~        Γöé          Γöé          Γöé          Γöé         Γöé
  1027. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1028. Γöé and_eq   Γöé &=       Γöé          Γöé          Γöé          Γöé         Γöé
  1029. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1030. Γöé or_eq    Γöé Γöé=       Γöé          Γöé          Γöé          Γöé         Γöé
  1031. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1032. Γöé xor_eq   Γöé ^=       Γöé          Γöé          Γöé          Γöé         Γöé
  1033. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1034. Γöé not      Γöé !        Γöé          Γöé          Γöé          Γöé         Γöé
  1035. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1036. Γöé not_eq   Γöé !=       Γöé          Γöé          Γöé          Γöé         Γöé
  1037. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1038.  
  1039. These keywords are only reserved if you use the -qdigraph option. For more 
  1040. information on the -qdigraph compiler option, see the "Summary of the C[++ ] 
  1041. Compiler/6000 Options" of the Programming Guide for IBM AIX XL C++ 
  1042. Compiler/6000 Version 1.1.1. 
  1043.  
  1044.  
  1045. ΓòÉΓòÉΓòÉ 3.9. Literals ΓòÉΓòÉΓòÉ
  1046.  
  1047. C++ contains the following types of literals (also called constants): 
  1048.  
  1049. o Integer constants 
  1050.  
  1051. o Character constants 
  1052.  
  1053. o Floating constants 
  1054.  
  1055. o String literals. 
  1056.  
  1057.  
  1058. ΓòÉΓòÉΓòÉ 3.9.1. Integer Constants ΓòÉΓòÉΓòÉ
  1059.  
  1060. You can use integer constants to represent decimal, octal, and hexadecimal 
  1061. values. 
  1062.  
  1063. A decimal constant is composed of a sequence of the digits, 0 (zero) through 9, 
  1064. beginning with a nonzero digit, as well as optional suffixes u and l. For 
  1065. example: 
  1066.  
  1067. 485976
  1068. 433132211
  1069. 20
  1070. 5
  1071.  
  1072. An octal constant is composed of a sequence of the digits, 0 (zero) through 7, 
  1073. beginning with a 0 (zero). For example: 
  1074.  
  1075. 0
  1076. 0125
  1077. 034673
  1078. 03245
  1079.  
  1080. A hexadecimal constant begins with the 0 (zero) digit followed by either x or 
  1081. X, and it can contain any combination of the digits 0 (zero) through 9 and the 
  1082. letters a through f or A through F. The lowercase and uppercase letters are 
  1083. equivalent in a hexadecimal constant. For example: 
  1084.  
  1085. 0x3b24
  1086. 0XF96
  1087. 0x21
  1088. 0x3AA
  1089. 0X29b
  1090. 0X3bD
  1091.  
  1092. The data type is determined by the form, value, and suffix of the integer 
  1093. constant. The following lists the integer constants and shows the possible data 
  1094. types for each constant. The smallest data type in the list that can represent 
  1095. the constant value is assigned to the constant. Constant    Data Type 
  1096.  
  1097. unsuffixed decimal int, long int, unsigned long int 
  1098.  
  1099. unsuffixed octal int, long int, unsigned long int 
  1100.  
  1101. unsuffixed hexadecimal int, long int, unsigned long int 
  1102.  
  1103. suffixed by u or U unsigned int, unsigned long int 
  1104.  
  1105. suffixed by l or L long int, unsigned long int 
  1106.  
  1107. suffixed by both 
  1108.  
  1109. u or U and l or L unsigned long int 
  1110.  
  1111. A + (plus) or - (minus) symbol preceding an integer constant is treated as a 
  1112. unary operator rather than as a part of the integer constant value. 
  1113.  
  1114.  
  1115. ΓòÉΓòÉΓòÉ 3.9.2. Character Constants ΓòÉΓòÉΓòÉ
  1116.  
  1117. A character constant contains one or more characters or an escape sequence 
  1118. enclosed in single quotation marks. The following are all character constants: 
  1119.  
  1120. 'X'            '\''            '0'
  1121.  
  1122. '('            'x'            '\n'
  1123.  
  1124. '7'            '\117'            'n'
  1125.  
  1126. Character constants composed of single characters have type char. The value of 
  1127. a single character constant is the numerical value of the character in the 
  1128. ASCII character set. 
  1129.  
  1130. Character constants composed of multiple characters have type int. The value of 
  1131. a multiple character constant is implementation-dependent. 
  1132.  
  1133. Character constants with the prefix L, have type wchar_t (wide character). The 
  1134. wide character type is implementation-dependent and is defined in the C 
  1135. standard header file <stddef.h>, described in the IBM AIX for RISC System/6000 
  1136. Files Reference. 
  1137.  
  1138. Character constants with the prefix L, have type wchar_t (wide character). The 
  1139. wide character type is implementation-dependent and is defined in the C 
  1140. standard header file <stddef.h>. 
  1141.  
  1142. .* From heading: "Escape Sequences" Escape sequences can be used to represent 
  1143. specific nongraphic characters including \ (backslash ), ? (question mark), ' 
  1144. (single quotation mark), and " (double quotation mark). 
  1145.  
  1146.  
  1147. ΓòÉΓòÉΓòÉ 3.9.3. Floating Constants ΓòÉΓòÉΓòÉ
  1148.  
  1149. A floating constant consists of an integer part, a decimal point, a fractional 
  1150. part, an exponent part (an e or E and an optionally signed integer), and an 
  1151. optional suffix. Both the integral and fractional parts are made up of decimal 
  1152. digits. You can omit either the integral part or the fractional part but not 
  1153. both. You can omit either the decimal point or the exponent part but not both. 
  1154. Unless specified by a suffix, floating constants have type double. The suffixf 
  1155. or F indicates a type of float. The suffix l orL indicates a type of long 
  1156. double. The following table shows the three possible data types for floating 
  1157. constants: 
  1158.  
  1159. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1160. Γöé Floating Constant   Γöé Data Type           Γöé Value              Γöé
  1161. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1162. Γöé .5E1                Γöé double              Γöé 5.0                Γöé
  1163. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1164. Γöé 50e-1f              Γöé float               Γöé 5.0                Γöé
  1165. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1166. Γöé 5.0L                Γöé long double         Γöé 5.0                Γöé
  1167. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1168.  
  1169.  
  1170. ΓòÉΓòÉΓòÉ 3.9.4. String Literals ΓòÉΓòÉΓòÉ
  1171.  
  1172. A string literal contains a sequence of characters enclosed in double quotation 
  1173. marks. It has the data type array of char and has static storage duration. A 
  1174. string literal prefixed by the letter L is a wide character string literal. It 
  1175. has the data type array of wchar_t. This data type is implementation-dependent 
  1176. and is defined in the C standard header file <stddef.h>. 
  1177.  
  1178. For example, L"longstring" is a wide character string literal. 
  1179.  
  1180. To continue a string literal on the next line, place a \ (backslash) at the end 
  1181. of the line. The backslash is read as a line continuation symbol rather than as 
  1182. a character in the string literal. A carriage return must immediately follow 
  1183. this backslash. In the following example, the string literal second causes a 
  1184. compile-time error. 
  1185.  
  1186. char *first = "This string continues onto the next\
  1187.   line, where it ends.";             // compiles successfully.
  1188. char *second = "The comment makes the \ // continuation
  1189. symbol
  1190.   invisible to the compiler.";       // compilation error.
  1191.  
  1192. Another way to continue a string literal is to have two or more adjacent 
  1193. strings. Consecutive string literals are concatenated to produce a single 
  1194. string literal. Characters in concatenated strings remain distinct. For 
  1195. example, the strings "\xab" and "3" are concatenated to form "\xab3". However, 
  1196. the characters \xab and 3 remain distinct and are not merged to form the 
  1197. hexadecimal character \xab3. You cannot concatenate an ordinary string literal 
  1198. with a wide string literal. For example: 
  1199.  
  1200. "hello " "there"     // is equivalent to "hello there"
  1201. "hello " L"there"    // is illegal
  1202. "hello" "there"      // is equivalent to "hellothere"
  1203.  
  1204. Following any concatenation, \0 (a zero of type char) is appended at the end of 
  1205. each string. C++ programs find the end of a string by scanning for this value. 
  1206. For a wide character string literal, \0 of type wchar_t is appended. For 
  1207. example: 
  1208.  
  1209. char *first = "Hello ";            // stored as "Hello \0"
  1210. char *second = "there";            // stored as "there\0"
  1211. char *third = "Hello " "there";    // stored as "Hello
  1212. there\0"
  1213.  
  1214. Within a string literal, you must use the escape sequence \" to represent a 
  1215. double quotation mark. Use the \n escape sequence to represent the new line 
  1216. character as part of a string and the \\ to represent the backslash character. 
  1217. For example: 
  1218.  
  1219. #include <iostream.h>
  1220. void main ()
  1221. {
  1222.       char *s ="Hi there! \n";
  1223.       cout << s;
  1224.       char *p = "The backslash character \\.";
  1225.       cout << p << endl;
  1226.       char *q = "The double quotation mark \".\n";
  1227.       cout << q ;
  1228. }
  1229.  
  1230. This program produces the following output: 
  1231.  
  1232. Hi there!
  1233. The backslash character \.
  1234. The double quotation mark ".
  1235.  
  1236.  
  1237. ΓòÉΓòÉΓòÉ 3.10. Related Information ΓòÉΓòÉΓòÉ
  1238.  
  1239. "Type Specifiers" 
  1240.  
  1241.  
  1242. ΓòÉΓòÉΓòÉ 4. Chapter 4. Expressions and Operators ΓòÉΓòÉΓòÉ
  1243.  
  1244. This  chapter describes C++ expressions and operators.  It begins with general 
  1245. descriptions of the following topics: 
  1246.  
  1247. o Expressions 
  1248. o Operands 
  1249. o Objects 
  1250. o lvalues 
  1251.  
  1252. These general descriptions are followed by descriptions of the following 
  1253. specific types of expressions: 
  1254.  
  1255. o Primary expressions 
  1256.  
  1257. o Constant expressions 
  1258.  
  1259. o Postfix expressions 
  1260.  
  1261. o Cast expressions 
  1262.  
  1263. o Unary expressions 
  1264.  
  1265. o Binary expressions. 
  1266.  
  1267. These descriptions begin with a list of the operators that are used in that 
  1268. specific type of expression. 
  1269.  
  1270. You can also return to the table of contents. 
  1271.  
  1272.  
  1273. ΓòÉΓòÉΓòÉ 4.1. Expressions ΓòÉΓòÉΓòÉ
  1274.  
  1275. Expressions are sequences of operators, operands, and punctuators that specify 
  1276. a computation. The evaluation of expressions is based on the operators that the 
  1277. expressions contain and the context in which they are used. An expression can 
  1278. result in an lvalue, rvalue, or no value, and can produce side effects in each 
  1279. case. 
  1280.  
  1281. C++ operators can be defined to behave differently when applied to operands of 
  1282. class type. This is calledoperator overloading. See "Overloading Operators" for 
  1283. more details. 
  1284.  
  1285. You cannot change the behaviour of operators when they are applied to built-in 
  1286. types. The syntax specifications as outlined in this chapter are still 
  1287. applicable to built-in types. This chapter describes the behavior of operators 
  1288. that are not overloaded. 
  1289.  
  1290.  
  1291. ΓòÉΓòÉΓòÉ 4.1.1. Grouping and Evaluating Expressions ΓòÉΓòÉΓòÉ
  1292.  
  1293. Two operator characteristics determine how operands group with operators: 
  1294. precedence and associativity. Precedence is a priority system for grouping 
  1295. different types of operators with their operands. Associativity provides a 
  1296. left-to-right or right-to-left order for grouping operands to operators that 
  1297. have the same precedence. You can explicitly state the grouping of operands 
  1298. with operators by using parentheses. 
  1299.  
  1300. Consider the expression: 
  1301.  
  1302.       a + b * c / d
  1303.  
  1304. Here is the same expression with parentheses to show how the operands are 
  1305. grouped with operators: 
  1306.  
  1307.       a + ((b * c) / d)
  1308.  
  1309. The  + is evaluated last because it has lower precedence than * or /. The * is 
  1310. evaluated before the / because of associativity. 
  1311.  
  1312. The following table lists the C++ operators in their order of precedence and 
  1313. shows the direction of associativity for each operator. The operators are 
  1314. listed in order of precedence. The primary scope operator has the highest 
  1315. precedence, and the comma operator has the lowest. 
  1316.  
  1317.  
  1318. ΓòÉΓòÉΓòÉ 4.1.2. Operator Precedence and Associativity ΓòÉΓòÉΓòÉ
  1319.  
  1320. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  1321. Γöé Operator Type       Γöé Associativity       Γöé Operators          Γöé
  1322. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1323. Γöé Primary             Γöé left to right       Γöé : :                Γöé
  1324. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1325. Γöé Postfix             Γöé left to right       Γöé () [] . -> Γö╝+ - -  Γöé
  1326. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1327. Γöé Unary               Γöé right to left       Γöé Γö╝+ - - - + ! ~ & * Γöé
  1328. Γöé                     Γöé                     Γöé sizeof             Γöé
  1329. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1330. Γöé                     Γöé                     Γöé new delete         Γöé
  1331. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1332. Γöé Cast                Γöé left to right       Γöé (typename)         Γöé
  1333. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1334. Γöé Pointer to Member   Γöé left to right       Γöé                    Γöé
  1335. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1336. Γöé Multiplicative      Γöé left to right       Γöé                    Γöé
  1337. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1338. Γöé Additive            Γöé left to right       Γöé + -                Γöé
  1339. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1340. Γöé Bitwise Shift       Γöé left to right       Γöé << >>              Γöé
  1341. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1342. Γöé Relational          Γöé left to right       Γöé < > <= >=          Γöé
  1343. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1344. Γöé Equality            Γöé left to right       Γöé = = !=             Γöé
  1345. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1346. Γöé Bitwise Logical AND Γöé left to right       Γöé &                  Γöé
  1347. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1348. Γöé Bitwise Exclusive   Γöé left to right       Γöé ^                  Γöé
  1349. Γöé OR                  Γöé                     Γöé                    Γöé
  1350. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1351. Γöé Bitwise Inclusive   Γöé left to right       Γöé Γöé                  Γöé
  1352. Γöé OR                  Γöé                     Γöé                    Γöé
  1353. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1354. Γöé Logical AND         Γöé left to right       Γöé &&                 Γöé
  1355. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1356. Γöé Logical OR          Γöé left to right       Γöé ΓöéΓöé                 Γöé
  1357. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1358. Γöé Conditional         Γöé right to left       Γöé ? :                Γöé
  1359. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1360. Γöé Assignment          Γöé right to left       Γöé = Γö╝= -= *= /= <<=  Γöé
  1361. Γöé                     Γöé                     Γöé >>= %= &= ^= Γöé=    Γöé
  1362. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  1363. Γöé Comma               Γöé left to right       Γöé ,                  Γöé
  1364. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  1365.  
  1366. C++ does not specify the order of evaluation for function arguments or for the 
  1367. operands of binary operators. Exceptions are noted in the following section. 
  1368.  
  1369. The following are examples of ambiguous expressions: 
  1370.  
  1371. :id='51V01296'.
  1372. z = (x * ++y) / f(y);
  1373.  
  1374. ++y andf(y) may not be evaluated in the same order by all C++ compilers. 
  1375.  
  1376. f(++i, x[i]);
  1377.  
  1378. ++i andx[i] may not be evaluated in the same order by all C++ compilers. 
  1379.  
  1380.  
  1381. ΓòÉΓòÉΓòÉ 4.1.3. Exceptions ΓòÉΓòÉΓòÉ
  1382.  
  1383. C++ does not specify the order that operands are grouped with operators in an 
  1384. expression that contains more than one instance of an operator that has both 
  1385. associative and commutative properties. The &xcomp. can rearrange operands in 
  1386. such an expression. You can use parentheses to guarantee the order of grouping 
  1387. within the expression. The operators that have the same associative and 
  1388. commutative properties are: *, +, &, |, and ^. 
  1389.  
  1390. The order of evaluation for the operands of the && (logical AND ) and the | | 
  1391. (logical OR ) operators is always left to right. If the operand on the left 
  1392. side of the && operator evaluates to zero, the operator on the right side is 
  1393. not evaluated. If the operand on the left side of a | | operator evaluates to a 
  1394. nonzero value, the operator on the right side is not evaluated. 
  1395.  
  1396. The parentheses in the following expressions explicitly show how C++ groups 
  1397. operands and operators: 
  1398.  
  1399. total = (4 + (5 * 3));
  1400. total = (((8 * 5) / 10) / 3);
  1401. total = (10 + (5 / 3));
  1402.  
  1403. Because C++ does not specify the order of grouping operands with operators that 
  1404. are both associative and commutative, a compiler can group the operands and 
  1405. operators of the expression: 
  1406.  
  1407. total = price + prov_tax + city_tax;
  1408.  
  1409. in the following ways: 
  1410.  
  1411. total = (price + (prov_tax + city_tax));
  1412. total = ((price + prov_tax) + city_tax);
  1413. total = ((price + city_tax) + prov_tax);
  1414.  
  1415. If the values in this expression are integers, the grouping of operands and 
  1416. operators does not affect the result. Because intermediate values are rounded, 
  1417. different groupings of floating-point operators give different results. 
  1418.  
  1419. However, in certain expressions, the grouping of operands and operators can 
  1420. affect the result. In the following expression, each function call may be 
  1421. modifying the same variables: 
  1422.  
  1423. a = b() + c() + d();
  1424.  
  1425. If the expression contains operators that are both associative and commutative 
  1426. and the order of grouping operands with operators can affect the result of the 
  1427. expression, you can break the expression into several expressions. For example, 
  1428. the following expressions can replace the previous expression if the called 
  1429. functions do not produce any side effects affecting the variablea. 
  1430.  
  1431. a = b();
  1432. a += c();
  1433. a += d();
  1434.  
  1435. Integer overflows are ignored. Division by zero and floating-point exceptions 
  1436. are implementation specific. For more details on generating warning messages 
  1437. for division by constant zero, see the -qinfo compiler option described in 
  1438. "Summary of the C[++ ] Compiler/6000 Options" of the Programming Guide. 
  1439.  
  1440.  
  1441. ΓòÉΓòÉΓòÉ 4.2. Operands ΓòÉΓòÉΓòÉ
  1442.  
  1443. Most expressions can contain several different, but related, types of operands. 
  1444. The following list shows some of the different kinds of operands: 
  1445.  
  1446. o Integral: objects having type char, unsigned char, signed char, short, int, 
  1447.   long, unsigned short, unsigned int, or unsigned long 
  1448.  
  1449. o Enumeration:Objects having an enumeration type 
  1450.  
  1451. o Arithmetic: Integral objects and objects having type float, double, or long 
  1452.   double 
  1453.  
  1454. o Scalar: Arithmetic objects, references, and pointers to objects of any type 
  1455.  
  1456. o Arrays: Arrays 
  1457.  
  1458. o Classes: Unions, structures and classes. 
  1459.  
  1460. Many C++ operators cause implicit conversions from one data type to another. 
  1461. Implicit type conversions are described in "Type Conversions" 
  1462.  
  1463. For further details on data types, see "Type Specifiers" 
  1464.  
  1465.  
  1466. ΓòÉΓòÉΓòÉ 4.3. Objects ΓòÉΓòÉΓòÉ
  1467.  
  1468. An object is a region of storage that contains a value or group of values. Each 
  1469. value can be accessed using its identifier or a more complex expression that 
  1470. refers to the object. In addition, each object has a unique data type. Both the 
  1471. identifier and data type of an object are established in the object 
  1472. declaration. 
  1473.  
  1474. The data type of an object determines the initial storage allocation for that 
  1475. object and the interpretation of the values during subsequent access. It is 
  1476. also used in any type-checking operations. 
  1477.  
  1478. C++ has built-in or standard data types and user-defined data types. Standard 
  1479. data types include signed and unsigned integers, floating-point numbers, and 
  1480. characters. User-defined types include enumerations, structures, unions, and 
  1481. classes. 
  1482.  
  1483. An instance of a class type is commonly called a class object. The individual 
  1484. class members are also called objects. The set of all member objects comprises 
  1485. a class object. 
  1486.  
  1487.  
  1488. ΓòÉΓòÉΓòÉ 4.4. lvalues ΓòÉΓòÉΓòÉ
  1489.  
  1490. An lvalue is an expression that represents an object. A modifiable lvalue  is 
  1491. an expression representing an object that can be changed. If an lvalue is 
  1492. modifiable, it can be the left operand in an assignment expression. For 
  1493. example, array objects, array names, function names, and const objects are not 
  1494. modifiable lvalues, but a static int object is. 
  1495.  
  1496. All assignment operators evaluate their right operand and assign that value to 
  1497. their left operand. The left operand must be a modifiable lvalue or a reference 
  1498. to a modifiable object. The increment and the decrement operators also require 
  1499. a modifiable lvalue as an operand. 
  1500.  
  1501. The address operator requires an lvalue, a function name, or a qualified class 
  1502. name as an operand. The lvalue does not have to be modifiable. The following 
  1503. example shows two expressions and their corresponding lvalues. :id='162TO148d'. 
  1504. Expression    lvalue 
  1505.  
  1506. :id='162TO148e'.
  1507. x = 42;                   x
  1508. *ptr = newvalue;            *ptr
  1509.  
  1510.  
  1511. ΓòÉΓòÉΓòÉ 4.5. Primary Expressions ΓòÉΓòÉΓòÉ
  1512.  
  1513. Primary expressions are literals, names, and names qualified by the :: (scope) 
  1514. operator. The syntax of the primary expression is: 
  1515.  
  1516.       primary-expression:
  1517.             literal
  1518.             this
  1519.             ( expression )
  1520.             :: identifier
  1521.             :: qualified-name
  1522.             :: operator-function-name
  1523.             name
  1524.  
  1525. A literal is one of the following: 
  1526.  
  1527. o integer-constant 
  1528.  
  1529. o character-constant 
  1530.  
  1531. o floating-constant 
  1532.  
  1533. o string-literal. 
  1534.  
  1535. .* From heading: "The this Pointer" this  is a keyword used within the body of 
  1536. nonstatic member functions to name a pointer to the object for which the 
  1537. function was invoked. 
  1538.  
  1539. A parenthesized expression has the same type and value as the expression within 
  1540. the parentheses. 
  1541.  
  1542. The type of the primary expression represented by the :: (scope) operator 
  1543. followed by an identifier, qualified-name, or operator-function-name is 
  1544. specified by the declaration of the identifier, name, or 
  1545. operator-function-name. 
  1546.  
  1547. A name is a primary expression that can appear after the  . (dot) and -> 
  1548. (arrow) operators. The syntax for a name is: 
  1549.  
  1550.       name:
  1551.             identifier
  1552.             qualified-name
  1553.             operator-function-name
  1554.             conversion-function-name
  1555.             ~ class-name
  1556.       qualified-name:
  1557.             qualified-class-name :: name
  1558.  
  1559.       literal:
  1560.             integer-constant
  1561.             character-constant
  1562.             floating-constant
  1563.             string-literal
  1564.  
  1565. A qualified-name is a qualified-class-name  followed by the :: (scope) operator 
  1566. followed by a name that is either a member of the class or a base class of the 
  1567. class. 
  1568.  
  1569. An operator-function-name is an overloaded operator. 
  1570.  
  1571. A conversion-function-name is a conversion member function. 
  1572.  
  1573. A class-name preceded by ~ indicates a destructor for the class class-name. 
  1574.  
  1575.  
  1576. ΓòÉΓòÉΓòÉ 4.5.1. Scope Operator ΓòÉΓòÉΓòÉ
  1577.  
  1578. The :: (scope) operator is used to qualify hidden names so that you can still 
  1579. use them. You can use the unary scope operator if a file scope name is hidden 
  1580. by an explicit declaration of the same name in a block or class. You can use 
  1581. the hidden file scope name by qualifying it with the scope operator. For 
  1582. example: 
  1583.  
  1584. int i = 10;
  1585. int f(int i)
  1586. {
  1587.       return i ? i : :
  1588. :i; // return global i if local i
  1589. is zero
  1590. }
  1591.  
  1592. You can also use the class scope operator to qualify class names or class 
  1593. member names. If a class member name is hidden, you can use it by qualifying it 
  1594. with its class name and the class scope operator. Whenever a name is followed 
  1595. by a :: (scope) operator, the name is interpreted as a class name. Class names 
  1596. hidden by local variable names can be retrieved when followed by :: (scope) 
  1597. operator. In the following example, the declaration of the variable X hides the 
  1598. class type X but you can still use the static class member count by qualifying 
  1599. it with the class type X and the scope operator. 
  1600.  
  1601. #include <iostream.h>
  1602. class X
  1603. {
  1604. public:
  1605.       static int count;
  1606. };
  1607. int X::count = 10;      // define static data member
  1608. void main ()
  1609. {
  1610.       int X = 0; // hides class type X
  1611.       cout << X::count << endl; // use static
  1612. member of class X
  1613. }
  1614.  
  1615. The scope operator is also discussed in "Class Names" and in "Scope of Class 
  1616. Names" 
  1617.  
  1618.  
  1619. ΓòÉΓòÉΓòÉ 4.5.2. Parenthesized Expressions ΓòÉΓòÉΓòÉ
  1620.  
  1621. You can use parentheses to explicitly state how operands group with operators. 
  1622. The following expression does not contain any parentheses that group operands 
  1623. and operators. The parentheses surrounding weight and postcode form a function 
  1624. call. Notice how the operands and operators are grouped in this expression : 
  1625. Expression without Parentheses 
  1626.  
  1627. -discount * item + handling(weight, zipcode) > .10 * item
  1628.  
  1629. Artwork from Interleaf needs to be redrawn or included
  1630. from anencapsulated poststript file.
  1631.  
  1632. The following expression is similar, but contains parentheses that change the 
  1633. way the operands and operators are grouped: 
  1634. Expression with Parentheses 
  1635.  
  1636. :id='162TO1494'.
  1637. (-discount * (item + handling(weight, zipcode))) > (.10
  1638. * item)
  1639.  
  1640. Artwork from Interleaf needs to be redrawn or included
  1641. from anencapsulated poststript file.
  1642.  
  1643. In an expression that contains operators that are both associative and 
  1644. commutative, you can use parentheses to specify the grouping of operands with 
  1645. operators. The parentheses in the following expression guarantee the order of 
  1646. grouping: 
  1647.  
  1648. :id='51V012d2'.
  1649. x = f + (g + h);
  1650.  
  1651.  
  1652. ΓòÉΓòÉΓòÉ 4.6. Constant Expressions ΓòÉΓòÉΓòÉ
  1653.  
  1654. A constant-expression is an expression that evaluates to an integral constant. 
  1655. A constant-expression can contain the following: 
  1656.  
  1657. o sizeof expressions 
  1658.  
  1659. o literals, enumerators, and values of integral types declared constant and 
  1660.   initialized with constant expressions. 
  1661.  
  1662. The syntax for a constant expression is: 
  1663.  
  1664.       constant-expression:
  1665.             conditional-expression
  1666.  
  1667. Only type conversions to integral types are allowed in constant expressions. 
  1668. Functions, class objects, pointers, and references are not allowed unless they 
  1669. occur in sizeof expressions. Comma operators and assignment operators cannot 
  1670. appear in constant expressions. 
  1671.  
  1672. You can use a constant expression anywhere that you can use a constant. For 
  1673. example, you can use a constant expression as an array bound, in case 
  1674. expressions found in switch statements, as an initializer of an enumeration 
  1675. constant, as the size of a bit field, and as a template argument. 
  1676.  
  1677.  
  1678. ΓòÉΓòÉΓòÉ 4.7. Postfix Expressions ΓòÉΓòÉΓòÉ
  1679.  
  1680. Seven operators are used in postfix expressions: 
  1681.  
  1682. o Function call ( ) 
  1683.  
  1684. o Function style cast ( ) 
  1685.  
  1686. o Array subscript [ ] 
  1687.  
  1688. o Dot . 
  1689.  
  1690. o Arrow ->_ 
  1691.  
  1692. o Postfix increment ++ 
  1693.  
  1694. o Postfix decrement -- 
  1695.  
  1696. Postfix expressions group left-to-right.The syntax is: 
  1697.  
  1698.       postfix-expression:
  1699.             primary-expression
  1700.             postfix-expression
  1701. ([expression-list]
  1702. )
  1703.             simple-type-name
  1704. ([expression-list]
  1705. )
  1706.             postfix-expression [
  1707. expression
  1708. ]
  1709.             postfix-expression . name
  1710.             postfix-expression -> name
  1711.             postfix-expression ++
  1712.             postfix-expression --
  1713.  
  1714. The syntax for an expression-list is: 
  1715.  
  1716.       expression-list:
  1717.             assignment-expression
  1718.             expression-list ,
  1719. assignment-expression
  1720.  
  1721.  
  1722. ΓòÉΓòÉΓòÉ 4.7.1. Function Call ΓòÉΓòÉΓòÉ
  1723.  
  1724. The syntax is: 
  1725.  
  1726. postfix-expression (
  1727. [
  1728. expression-list ] )
  1729.  
  1730. A function call is a postfix expression or a simple type name followed by a 
  1731. parenthesized argument list. The argument list can contain any number of 
  1732. expressions separated by commas. It can also be empty. The number of actual 
  1733. arguments in a function call expression list must equal the number of formal 
  1734. arguments in the argument list of the function declaration. 
  1735.  
  1736. The following are examples of function calls: 
  1737.  
  1738. :id='51V012d6'.
  1739. stub()
  1740. overdue(account, date, amount)
  1741. notify(name, date + 5)
  1742. report(error, time, date, ++num)
  1743.  
  1744. The actual arguments are evaluated, and each formal argument is assigned the 
  1745. value of the corresponding actual argument. Assigning a value to a formal 
  1746. argument changes the value within the function but has no effect on the actual 
  1747. argument unless the formal argument is a reference to an object. 
  1748.  
  1749. The type of a function call expression is the return type of the function. The 
  1750. return value is determined by the return statement in the function definition. 
  1751. The result of a function call is an lvalue only if the function returns a 
  1752. reference. A function can call itself. 
  1753.  
  1754. Arguments that are arrays and functions are converted to pointers before they 
  1755. are passed to a function. 
  1756.  
  1757. The data types of the actual arguments of the calling function are compared 
  1758. with the data types of the formal arguments that the called function expects. 
  1759. The actual arguments are converted to the types of the formal arguments because 
  1760. the declaration is visible at the point where the function is called. 
  1761.  
  1762. For example, the declaration of func is a prototype. When functionfunc is 
  1763. called, the actual argumentf is converted to a double, and the actual argument 
  1764. c is converted to an int. 
  1765.  
  1766. :id='218TO1866'.
  1767. char* func (double d, int i);
  1768.       .
  1769.       .
  1770.       .
  1771. void main()
  1772. {
  1773.       float f;
  1774.       char c;
  1775.       func(f, c) // f is a double, c is an int
  1776. }
  1777.  
  1778. C++ does not define the order in which the &xcomp. evaluates parameters. 
  1779.  
  1780. For further details on functions and argument passing, see "Functions" For 
  1781. further details on overloading the function call operator, see "Function Call" 
  1782. in the section "Special Overloaded Operators" 
  1783.  
  1784.  
  1785. ΓòÉΓòÉΓòÉ 4.7.2. Function Style Cast ΓòÉΓòÉΓòÉ
  1786.  
  1787. The syntax is: 
  1788.  
  1789. simple-type-name (
  1790. [
  1791. expression-list ] )
  1792.  
  1793. Function style casts are described in "Cast Expressions" 
  1794.  
  1795.  
  1796. ΓòÉΓòÉΓòÉ 4.7.3. Array Subscript ΓòÉΓòÉΓòÉ
  1797.  
  1798. The syntax is: 
  1799.  
  1800.       postfix-expression [
  1801. expression
  1802. ]
  1803.  
  1804. A postfix expression followed by an expression in [ ] (square brackets) refers 
  1805. to an element of an array. One expression must be a pointer value, and the 
  1806. other must be an integral type. The result of an array subscript is an lvalue. 
  1807.  
  1808. The first element of an array has the subscript zero. Thus, the 
  1809. expressioncode[10] refers to the 11th element of the array code. 
  1810.  
  1811. By definition, the expression: 
  1812.  
  1813. *((exp1) + (exp2))
  1814.  
  1815. is identical to the expression: 
  1816.  
  1817. exp1[exp2]
  1818.  
  1819. which is also identical to: 
  1820.  
  1821. exp2[exp1]
  1822.  
  1823. For further details, see "Arrays" 
  1824.  
  1825.  
  1826. ΓòÉΓòÉΓòÉ 4.7.4. Dot ΓòÉΓòÉΓòÉ
  1827.  
  1828. The . (dot) operator is a class access member operator that is used to access 
  1829. class members using a class object. The syntax is: 
  1830.  
  1831.       postfix-expression . name
  1832.  
  1833. A postfix expression, followed by a operator, followed by a name, designates a 
  1834. member of a class object. The postfix expression must be a class object. Note 
  1835. that class objects can be of type class, struct, or union. The name must be a 
  1836. member of that class object. 
  1837.  
  1838. The value of the expression is the value of the selected member. If the postfix 
  1839. expression and the name are lvalues, the expression value is also an lvalue. 
  1840.  
  1841. For further details on class members, see "Class Members and Friends" 
  1842.  
  1843.  
  1844. ΓòÉΓòÉΓòÉ 4.7.5. Arrow ΓòÉΓòÉΓòÉ
  1845.  
  1846. (arrow). 
  1847.  
  1848. The -> (arrow) operator is a class access member operator that is used to 
  1849. access class members using a pointer. The syntax is: 
  1850.  
  1851.       postfix-expression -> name
  1852.  
  1853. A postfix expression, followed by an -> (arrow) operator, followed by a name, 
  1854. designates a member of the object to which the pointer points. The postfix 
  1855. expression must be a pointer to a class object. Note that class objects can be 
  1856. of type class, struct, or union. The name must be a member of that class 
  1857. object. 
  1858.  
  1859. The value of the expression is the value of the selected member. If the name is 
  1860. an lvalue, the expression value is also an lvalue. 
  1861.  
  1862. For further details on class members, see "Class Members and Friends" 
  1863.  
  1864.  
  1865. ΓòÉΓòÉΓòÉ 4.7.6. Postfix Increment ΓòÉΓòÉΓòÉ
  1866.  
  1867. The syntax for an expression containing the ++ (postfix increment) operator is: 
  1868.  
  1869.       postfix-expression ++
  1870.  
  1871. A postfix expression followed by ++ (increment) operator is used to increment 
  1872. the operand. The postfix expression is the operand, which must be a modifiable 
  1873. lvalue of arithmetic or pointer type. 
  1874.  
  1875. The value of the expression is the value of the postfix expression before the 
  1876. increment is applied. After evaluation, the operand is incremented by 1. The 
  1877. type of the result is the same as the type of the operand, but it is not an 
  1878. lvalue. 
  1879.  
  1880. The postfix increment, prefix increment, and unary plus are distinct operators. 
  1881. For further details, see also "Prefix Increment" and "Unary Plus" 
  1882.  
  1883.  
  1884. ΓòÉΓòÉΓòÉ 4.7.7. Postfix Decrement ΓòÉΓòÉΓòÉ
  1885.  
  1886. The syntax for an expression containing the - - (postfix decrement) operator 
  1887. is: 
  1888.  
  1889.       postfix-expression --
  1890.  
  1891. A postfix expression followed by the - - (decrement) operator is used to 
  1892. decrement the operand. The postfix decrement operator follows the same rules as 
  1893. the postfix increment operator except that the operand is decremented by 1. 
  1894.  
  1895. The postfix decrement, prefix decrement, and unary minus are distinct 
  1896. operators. For further details, see also "Prefix Decrement" and "Unary Minus" 
  1897.  
  1898.  
  1899. ΓòÉΓòÉΓòÉ 4.8. Cast Expressions ΓòÉΓòÉΓòÉ
  1900.  
  1901. The cast operator is used for explicit type conversions. The syntax for a cast 
  1902. expressions is: 
  1903.  
  1904.       cast-expression:
  1905.             unary-expression
  1906.             ( typename ) cast-expression
  1907.  
  1908. The ( ) (cast) operator converts the value of the cast-expression to the 
  1909. specified type. If the cast-expression has class type, the type-name can be any 
  1910. type for which the class has a user-defined conversion function. 
  1911.  
  1912. The result of a cast is not an lvalue unless the cast is to a reference type. 
  1913. When you cast to a reference type, no user-defined conversions are performed 
  1914. and the result is an lvalue. 
  1915.  
  1916. There are two types of casts that take one argument: 
  1917.  
  1918. o C-style casts, with the format (X)a 
  1919.  
  1920. o function-style casts with one arguments, such as X(a). 
  1921.  
  1922. Both types of casts convert the argument a to the type X. 
  1923.  
  1924. A function-style cast with no arguments, such as X(), creates a temporary 
  1925. object of type X. If X is a class with constructors, the default constructor X: 
  1926. is called. 
  1927.  
  1928. A function-style cast with more than one argument, such as X(a,b), creates a 
  1929. temporary object of type X. X must be a class with a constructor that takes two 
  1930. arguments of types compatible with the types of a and b. This constructor is 
  1931. called with a and b as arguments. 
  1932.  
  1933. For details on implicit conversions using constructors, see "Conversion by 
  1934. Constructor" 
  1935.  
  1936. Explicit conversions can also be done using conversion functions. For further 
  1937. details, see "Conversion Functions " 
  1938.  
  1939. Implicit conversions using standard types are described in "Type Conversions" 
  1940.  
  1941.  
  1942. ΓòÉΓòÉΓòÉ 4.9. Unary Expressions ΓòÉΓòÉΓòÉ
  1943.  
  1944. A unary expression contains one operand of arithmetic or pointer type and a 
  1945. unary operator. All unary operators have the same precedence and have right to 
  1946. left associativity. 
  1947.  
  1948. The operators used in unary expressions are: 
  1949.  
  1950. o Prefix increment 
  1951.  
  1952. o Prefix decrement 
  1953.  
  1954. o Unary plus 
  1955.  
  1956. o Unary minus 
  1957.  
  1958. o Logical negation 
  1959.  
  1960. o Bitwise negation 
  1961.  
  1962. o Address 
  1963.  
  1964. o Indirection 
  1965.  
  1966. o sizeof 
  1967.  
  1968. o new 
  1969.  
  1970. o delete and delete[] 
  1971.  
  1972. o throw . 
  1973.  
  1974. The syntax for expressions containing unary operators is: 
  1975.  
  1976. :id='CPLRexpUnarSynt'.
  1977.       unary-expression:
  1978.             postfix-expression
  1979.             ++ unary-expression
  1980.             -- unary-expression
  1981.             unary-operator cast-expression
  1982.             sizeof unary-expression
  1983.             sizeof ( type-name
  1984. )
  1985.             allocation-expression
  1986.             deallocation-expression
  1987.             throw-expression
  1988.  
  1989. The usual arithmetic conversions are performed on the operands of most unary 
  1990. expressions. For more details, see "Arithmetic Conversions" 
  1991.  
  1992.  
  1993. ΓòÉΓòÉΓòÉ 4.9.1. Prefix Increment ΓòÉΓòÉΓòÉ
  1994.  
  1995. The syntax for an expression containing the ++ (prefix increment) operator is: 
  1996.  
  1997.       ++ unary-expression
  1998.  
  1999. The ++ (increment) operator followed by a unary expression is used to increment 
  2000. the operand. The unary expression is the operand, which must be a modifiable 
  2001. lvalue of arithmetic or pointer type. 
  2002.  
  2003. Before evaluation, the operand is incremented by 1.The value of the expression 
  2004. is the value of the prefix expression after the increment is applied. 
  2005.  
  2006. The type of the result is the same as the type of the operand and is also a 
  2007. modifiable lvalue. 
  2008.  
  2009. See also "Postfix Increment" and "Unary Plus" 
  2010.  
  2011.  
  2012. ΓòÉΓòÉΓòÉ 4.9.2. Prefix Decrement ΓòÉΓòÉΓòÉ
  2013.  
  2014. The syntax for an expression containing the - - (prefix decrement) operator is: 
  2015.  
  2016.       -- unary-expression
  2017.  
  2018. The - - (decrement) operator followed by an unary expression is used to 
  2019. decrement the operand. 
  2020.  
  2021. The prefix decrement operator follows the same rules as the prefix increment 
  2022. operator, except that the operand is decremented by 1. 
  2023.  
  2024. See also "Postfix Decrement" and "Unary Minus" 
  2025.  
  2026.  
  2027. ΓòÉΓòÉΓòÉ 4.9.3. Unary Plus ΓòÉΓòÉΓòÉ
  2028.  
  2029. The syntax for an expression containing the + (unary plus) operator is: 
  2030.  
  2031.       +
  2032. cast-expression
  2033.  
  2034. The + (unary plus) operator maintains the value of the operand, which must have 
  2035. arithmetic or pointer type. 
  2036.  
  2037. Integral promotions are performed on the operand. For more details, see 
  2038. "Integral Promotions" 
  2039.  
  2040. The type of the result is the promoted type of the operand.The result is not an 
  2041. lvalue. 
  2042.  
  2043.  
  2044. ΓòÉΓòÉΓòÉ 4.9.4. Unary Minus ΓòÉΓòÉΓòÉ
  2045.  
  2046. The syntax for an expression containing the - (unary minus) operator is: 
  2047.  
  2048.       -
  2049. cast-expression
  2050.  
  2051. The - (unary minus) operator negates the value of the operand, which must have 
  2052. arithmetic type. Integral promotions are performed on the operand. For more 
  2053. details, see "Integral Promotions" 
  2054.  
  2055. The result of applying the unary minus operator to a signed operand is the 
  2056. negation of the operand. The result is not an lvalue. The negative of an 
  2057. unsigned value is determined by subtracting its value from 2[n], where n is the 
  2058. number of bits in the promoted operand. 
  2059.  
  2060.  
  2061. ΓòÉΓòÉΓòÉ 4.9.5. Logical Negation ΓòÉΓòÉΓòÉ
  2062.  
  2063. The syntax for an expression containing the ! (logical negation) operator is: 
  2064.  
  2065.       !
  2066. cast-expression
  2067.  
  2068. The ! (logical negation) operator yields a 1 (true) if its operand evaluates to 
  2069. a zero (false). If the value of its operand is nonzero, the result of the 
  2070. operation is zero. 
  2071.  
  2072. The operand must have an arithmetic or pointer type. The type of the result is 
  2073. int and is not an lvalue. For operands of integral type, integral promotions 
  2074. are performed on the operand. For more details, see "Integral Promotions" 
  2075.  
  2076.  
  2077. ΓòÉΓòÉΓòÉ 4.9.6. Bitwise Negation ΓòÉΓòÉΓòÉ
  2078.  
  2079. The syntax for an expression containing the ~ (bitwise negation) operator is: 
  2080.  
  2081.       ~
  2082. cast-expression
  2083.  
  2084. The ~ (bitwise negation) operator yields the ones complement of the operand. In 
  2085. the binary representation of the result, every bit has the opposite value of 
  2086. the same bit in the operand. The operand must have an integral type. The result 
  2087. is not an lvalue. 
  2088.  
  2089. Integral promotions are performed on the operand. For more details, see 
  2090. "Integral Promotions" 
  2091.  
  2092.  
  2093. ΓòÉΓòÉΓòÉ 4.9.7. Address ΓòÉΓòÉΓòÉ
  2094.  
  2095. The syntax for an expression containing the & (address) operator is: 
  2096.  
  2097.       &
  2098. cast-expression
  2099.  
  2100. The & (address) operator yields a pointer to the operand. The operand must be 
  2101. an lvalue, a function, or a qualified name.If the variableptr is defined as a 
  2102. pointer to an int, and y as an int, the following expression assigns the 
  2103. address of the variable y to the pointer ptr: 
  2104.  
  2105. ptr = &y; 
  2106.  
  2107. If the operand is an lvalue or function, the resulting type is a pointer to the 
  2108. expression type. For example, if the type of the expression is integer, then 
  2109. the result is a pointer to an object integer type. 
  2110.  
  2111. If the operand is a qualified name, and the member is not static, the result is 
  2112. a pointer to a member of class and has the same type as the member. 
  2113.  
  2114. The & operator can only be used with overloaded functions in an initialization 
  2115. or assignment and where the left side uniquely determines which version of the 
  2116. overloaded function is used. 
  2117.  
  2118.  
  2119. ΓòÉΓòÉΓòÉ 4.9.8. Indirection ΓòÉΓòÉΓòÉ
  2120.  
  2121. The syntax for an expression containing the * (indirection) operator is: 
  2122.  
  2123.       *
  2124. cast-expression
  2125.  
  2126. The operand must be a pointer type. The * (indirection) operator determines the 
  2127. value referred to by the operand. The operand cannot be a pointer to void. 
  2128.  
  2129. The result is an lvalue that refers to the object that the expression points 
  2130. to. The type of the pointer determines the type of the result. For example, if 
  2131. the operand is a pointer to an int, the result also has the int type. 
  2132.  
  2133. If the variable ptr is defined as a pointer to an int, and y as an int, the 
  2134. following expressions cause the value 3 to be assigned to the variable y: 
  2135.  
  2136. ptr = &y;
  2137. *ptr = 3;
  2138.  
  2139. See "Pointers" for more details on indirection. 
  2140.  
  2141.  
  2142. ΓòÉΓòÉΓòÉ 4.9.9. sizeof ΓòÉΓòÉΓòÉ
  2143.  
  2144. The syntax for an expression containing the sizeof operator is: 
  2145.  
  2146.       sizeof
  2147. unary-expression
  2148.       sizeof (
  2149. type-name
  2150. )
  2151.  
  2152. The sizeof operator yields the size, in bytes, of the operand. The operand can 
  2153. be either an expression or a parenthesized type name. If the operand is an 
  2154. expression, the expression is not evaluated. 
  2155.  
  2156. The sizeof operator cannot be applied to a function, a bit field, an undefined 
  2157. class, the type void, or an array with unspecified dimensions, but it can be 
  2158. applied to a pointer to a function. Types may not be defined in a sizeof 
  2159. expression.  The result of a sizeof expression depends on the type it is 
  2160. applied to: 
  2161.  
  2162. o When the sizeof operator is applied to an array, the result is the total 
  2163.   number of bytes in the array. For example, in an array with 10 elements, the 
  2164.   size is equal to 10 times the size of a single element. 
  2165.  
  2166. o When the sizeof operator is applied to a class, the result is always nonzero 
  2167.   and is equal to the number of bytes in an object of that class including any 
  2168.   padding required for placing class objects in an array. 
  2169.  
  2170. o When the sizeof operator is applied to a reference, the result is the size of 
  2171.   the referenced object. 
  2172.  
  2173. The result of the sizeof operator is a constant of type size_t, which is an 
  2174. unsigned integral type defined in the standard header file <stddef.h>. 
  2175.  
  2176.  
  2177. ΓòÉΓòÉΓòÉ 4.9.10. new ΓòÉΓòÉΓòÉ
  2178.  
  2179. The new operator provides dynamic storage allocation. The syntax for an 
  2180. allocation expression containing the new operator is: 
  2181.  
  2182.       allocation-expression:
  2183.             [::]
  2184. new
  2185. [placement] new-type-name
  2186. [new-initializer]
  2187.             [::]
  2188. new
  2189. [placement] (
  2190. type-name
  2191. )[new-initializer]
  2192.       placement:
  2193.             (
  2194. expression-list
  2195.  )
  2196.       new-type-name:
  2197.             type-specifier-list
  2198. [new-declarator]
  2199.       new-declarator:
  2200.             *[cv-qualifier-list]
  2201. [new-declarator]
  2202.             complete-class-name :: *
  2203. [cv-qualifier-list]
  2204.                                     [new-declarator]
  2205.             [new-declarator]
  2206. [
  2207. expression ]
  2208.       new-initializer:
  2209.             ([expression-list]
  2210. )
  2211.  
  2212. An allocation expression containing the new operator is used to find storage in 
  2213. free store for the object being created. The operator new returns a pointer to 
  2214. the object and can be used to initialize the object.  If the object is an 
  2215. array, a pointer to the initial element is returned. A pointer set to 0 by new 
  2216. indicates a failure to allocate memory as specified. You can use the routine 
  2217. set_new_handler  to change the default behaviour of new. See the Programming 
  2218. Guide for more details. 
  2219.  
  2220. You cannot use the new operator to allocate function types, void, and 
  2221. incomplete class types because these are not object types. However, you can 
  2222. allocate pointers to functions with the new operator. You cannot create a 
  2223. reference with the new operator. 
  2224.  
  2225. When the object being created is an array, only the first dimension can be a 
  2226. general expression. All subsequent dimensions must be constant expressions. The 
  2227. first dimension can be a general expression even when the type-name  is used. 
  2228. You can create an array object with the new operator without specifying a size. 
  2229. In this case, a pointer to a unique object is returned. 
  2230.  
  2231. An object created with new exists until the delete or delete[] operator is 
  2232. called to deallocate the object's memory, or until program termination. 
  2233.  
  2234. If parentheses are used within a new-type-name, parentheses should also 
  2235. surround the new-type-name to prevent syntax errors. In the following example, 
  2236. storage is allocated for an array of pointers to functions: 
  2237.  
  2238. void f();
  2239. void g();
  2240. void main()
  2241. {
  2242.       void (**p)(), (**q)();
  2243.       // declare p and q as pointers to pointers to void
  2244. functions
  2245.       p = new (void (*[3])());
  2246.       // p now points to an array of pointers to functions
  2247.       q = new void(*[3])(); // error
  2248.       // error - bound as 'q = (new void) (*[3])();'
  2249.       p[0] = f;  // p[0] to point to function
  2250. f
  2251.         q[2] = g;  // q[2] to point to
  2252. function g
  2253.         p[0]();    // call f()
  2254.        q[2]();    // call g()
  2255. }
  2256.  
  2257. However, the second use of new causes an erroneous binding of q = (new void) 
  2258. (*[3])(). 
  2259.  
  2260. The type-specifier-list cannot contain class declarations, enumeration 
  2261. declarations, or const or volatile types. The type-specifier-list can contain a 
  2262. pointer to a const or volatile object. For example, const char* is allowed, but 
  2263. char* const is not. 
  2264.  
  2265. Additional arguments can be supplied to new by using the placement syntax. If 
  2266. placement arguments are used, a declaration of operator new() with these 
  2267. arguments must exist. For example: 
  2268.  
  2269. #include <stddef.h>
  2270. class X
  2271. {
  2272. public:
  2273.       void* operator new(size_t,int, int){ /* ... */ }
  2274. };
  2275.       .
  2276.       .
  2277.       .
  2278. void main ()
  2279. {
  2280.       X* ptr = new(1,2) X;
  2281. }
  2282.  
  2283. Member Function and the Global operator new() 
  2284.  
  2285. When an object of a class type is created with the new operator, the member 
  2286. operator new() function is implicitly called with the size of the argument as 
  2287. its first argument. If you have not defined an operator new() function for the 
  2288. class, the global ::operator new() function defined in <new.h> is used. You can 
  2289. also define your own global ::operator new(). You can use theallocation 
  2290. expression of the form ::operator new() to ensure that the global new operator 
  2291. is called, rather than a class member operator new. 
  2292.  
  2293. When a nonclass object is created with the new operator, the global ::operator 
  2294. new() is used. 
  2295.  
  2296. The order of evaluation of a call to an operator new() is undefined in the 
  2297. evaluation of arguments to constructors. If operator new() returns 0, the 
  2298. arguments to a constructor may or may not have been evaluated. 
  2299. Initializing Objects Created with the new Operator 
  2300.  
  2301. You can initialize objects created with the new operator in several ways. For 
  2302. nonclass objects, or for class objects without constructors, a new-initializer 
  2303. expression can be provided in an allocation-expression by specifying ( 
  2304. expression ) or (). For example: 
  2305.  
  2306. double* pi = new double(3.1415926);
  2307. int* score = new int(89);
  2308. float* unknown = new float();
  2309.  
  2310. If a class has a constructor, the new-initializer must be provided when any 
  2311. object of that class is allocated. The arguments of the new-initializer must 
  2312. match the arguments of a class constructor, unless the class has a default 
  2313. constructor. 
  2314.  
  2315. You cannot specify an initializer for an array object created with the new 
  2316. operator. You can initialize an array of class objects if the class has a 
  2317. default constructor. The constructor is called to initialize each array element 
  2318. (class object). 
  2319.  
  2320. Initialization using the new-initializer is performed only if new successfully 
  2321. allocates storage. 
  2322.  
  2323. For more details on the class member operator new() function, see "new and 
  2324. delete" in "Special Overloaded Operators"  and "Free Store" For additional 
  2325. information on constructing and destructing class objects with new and delete, 
  2326. see "Constructors and Destructors" 
  2327.  
  2328.  
  2329. ΓòÉΓòÉΓòÉ 4.9.11. delete and delete [ ] ΓòÉΓòÉΓòÉ
  2330.  
  2331. The syntax for an expression containing the delete operator is: 
  2332.  
  2333.       deallocation-expression:
  2334.             [ :: ] delete
  2335. cast-expression
  2336.             [ :: ] delete
  2337. [] cast-expression
  2338.  
  2339. The delete operator destroys the object created with new by deallocating the 
  2340. memory associated with the object. The delete operator has a void return type. 
  2341. The pointer operand must be a pointer that was returned by new, and cannot be a 
  2342. pointer to constant. If an attempt to create an object with new fails, the 
  2343. pointer returned by new (which will have a zero value) can still be used with 
  2344. delete. Deleting a null pointer has no effect. 
  2345.  
  2346. delete[], rather than delete, is used to destroy objects created with new that 
  2347. are not arrays. The array dimensions are not specified with delete[]. 
  2348.  
  2349. An attempt to access a deleted object is undefined because the deletion of an 
  2350. object can change its value. 
  2351.  
  2352. If a destructor has been defined for a class, delete invokes that destructor. 
  2353. Whether a destructor exists or not, delete frees the storage pointed to by 
  2354. calling the function operator delete() of the class if one exists. 
  2355.  
  2356. The global ::operator delete() is used if: 
  2357.  
  2358. o The class has no operator delete() 
  2359.  
  2360. o The object is of a nonclass type 
  2361.  
  2362. o The object is deleted with the : expression. 
  2363.  
  2364. For more details on the class member operator delete() function, see "new and 
  2365. delete" in "Special Overloaded Operators"  and "Free Store" For additional 
  2366. information see "Constructors and Destructors" 
  2367.  
  2368.  
  2369. ΓòÉΓòÉΓòÉ 4.9.12. throw ΓòÉΓòÉΓòÉ
  2370.  
  2371. The syntax for the throw expression is: 
  2372.  
  2373.       throw-expression:
  2374.             throw
  2375. [assignment-expression]
  2376.  
  2377. A throw  expression is used to throw exceptions to exception-handlers. It 
  2378. causes control to be passed out of the block enclosing the throw statement to 
  2379. the first handler whose exception-declaration matches the throw's expression. A 
  2380. throw-expression is a unary-expression of type void. 
  2381.  
  2382. For more details on the throw expression, see "Exception Handling" 
  2383.  
  2384.  
  2385. ΓòÉΓòÉΓòÉ 4.10. Binary Expressions ΓòÉΓòÉΓòÉ
  2386.  
  2387. The operators used in binary expressions are: 
  2388.  
  2389. o Pointer to member 
  2390.  
  2391. o Multiplication 
  2392.  
  2393. o Additive 
  2394.  
  2395. o Bitwise shift 
  2396.  
  2397. o Relational 
  2398.  
  2399. o Equality 
  2400.  
  2401. o Bitwise logical 
  2402.  
  2403. o Logical 
  2404.  
  2405. o Conditional 
  2406.  
  2407. o Assignment 
  2408.  
  2409. o Comma. 
  2410.  
  2411.  
  2412. ΓòÉΓòÉΓòÉ 4.10.1. Pointer to Member Operators ΓòÉΓòÉΓòÉ
  2413.  
  2414. * (pointer to member). 
  2415.  
  2416. There are two pointer to member operators: .*and ->* . The syntax is: 
  2417.  
  2418.       pm-expression:
  2419.  
  2420. cast-expression
  2421.             pm-expression .*cast-expression
  2422.             pm-expression ->* cast-expression
  2423.  
  2424. The .*operator is used to dereference pointers to class members. The first 
  2425. operand must be a class type. If the type of the first operand is class type T, 
  2426. or is a class that has been derived from class type T, the second operand must 
  2427. be a pointer to a member of a class type T. 
  2428.  
  2429. The ->* operator is also used to dereference pointers to class members. The 
  2430. first operand must be a pointer to a class type. If the type of the first 
  2431. operand is a pointer to class type T, or is a pointer to a class derived from 
  2432. class type T, the second operand must be a pointer to a member of class type T. 
  2433.  
  2434. The .* and ->* operators bind the cast-expression to the pm-expression, 
  2435. resulting in an object or function of the type specified by the second operand. 
  2436.  
  2437. If the result of.* or ->* is a function, you can only use the result as the 
  2438. operand for the ( ) (function call) operator. If the second operand is an 
  2439. lvalue, the result of .* or ->* is an lvalue. 
  2440.  
  2441. For more details on pointer to member operators, see "Pointers to Members" in 
  2442. "Class Members and Friends" 
  2443.  
  2444.  
  2445. ΓòÉΓòÉΓòÉ 4.10.2. Multiplicative Operators ΓòÉΓòÉΓòÉ
  2446.  
  2447. There are three multiplicative operators: * (multiplication) , / (division) and 
  2448. % (modulo or remainder). The syntax is: 
  2449.  
  2450.       multiplicative-expression:
  2451.             pm-expression
  2452.             multiplicative-expression *
  2453. pm-expression
  2454.             multiplicative-expression /
  2455. pm-expression
  2456.             multiplicative-expression %
  2457. pm-expression
  2458.  
  2459. The operands for * (multiplication) and / (division) must have arithmetic type. 
  2460. The operands for % (modulo) must have integral type. The usual arithmetic 
  2461. conversions are applied to the operands, and determine the type of the result. 
  2462.  
  2463. The result of the *operator is the product of the two operands. 
  2464.  
  2465. The results of the / and % operators are the quotient and remainder of the 
  2466. division of the left operand by the right operand. You can use compiler options 
  2467. to detect compile-time division by zero errors (division by constant zero). 
  2468.  
  2469.  For more details on generating warning messages for division by constant zero, 
  2470. see the -qinfo compiler option described in the Programming Guide. 
  2471.  
  2472. For details on the standard conversion rules for multiplicative operators, see 
  2473. "Arithmetic Conversions" 
  2474.  
  2475.  
  2476. ΓòÉΓòÉΓòÉ 4.10.3. Additive Operators ΓòÉΓòÉΓòÉ
  2477.  
  2478. There are two additive operators: + (addition) and - (subtraction). The syntax 
  2479. is: 
  2480.  
  2481.       additive-expression:
  2482.             multiplicative-expression
  2483.             additive-expression +
  2484. multiplicative-expression
  2485.             additive-expression -
  2486. multiplicative-expression
  2487.  
  2488. The operands must have arithmetic or pointer type. 
  2489.  
  2490. The result of the + (addition) operator is the sum of the operands. If both 
  2491. operands are of arithmetic type, the standard arithmetic conversions are 
  2492. applied. 
  2493.  
  2494. A pointer to an object in an array can be added to a value having integral 
  2495. type. The result is a pointer having the same type as the pointer operand. The 
  2496. result refers to another element in the array, offset from the original element 
  2497. by the amount specified by the integral value. If the resulting pointer points 
  2498. to storage outside the array, other than the first location outside the array, 
  2499. the result is undefined. The &xcomp. &xcompos2. does not provide boundary 
  2500. checking on the pointers. 
  2501.  
  2502. The result of the - (subtraction) operator is the difference between the 
  2503. operands. If both operands are of arithmetic type the standard arithmetic 
  2504. conversions are applied. For further details on conversions, see "Arithmetic 
  2505. Conversions" 
  2506.  
  2507. If two pointer types that refer to elements of the same array are subtracted, 
  2508. the result is a signed integral value that represents the number of elements 
  2509. separating the two elements. Both pointer operands must point to the same 
  2510. array, or the result is undefined 
  2511.  
  2512. If one operand has a pointer type and the other has an integral type, only the 
  2513. first operand can be a pointer. You cannot subtract a pointer from an integral 
  2514. value. 
  2515.  
  2516.  
  2517. ΓòÉΓòÉΓòÉ 4.10.4. Bitwise Shift Operators ΓòÉΓòÉΓòÉ
  2518.  
  2519. There are two bitwise shift operators: << (shift left) and  (shift right). The 
  2520. syntax is: 
  2521.  
  2522.       shift-expression:
  2523.             additive-expression
  2524.             shift-expression << additive-expression
  2525.             shift-expression >> additive-expression
  2526.  
  2527. The operands must have integral type. Integral promotions are performed The 
  2528. result has the same type as the left operand. If the right operand is negative, 
  2529. or greater than or equal to the length (in bits) of the promoted left operand, 
  2530. the result is undefined. 
  2531.  
  2532. The value of the shift expression exp1 << exp2 is exp1 shifted left by exp2 
  2533. bits. The value of exp1 is interpreted as a bit pattern, and vacated bits are 
  2534. zero-filled. The value of exp1 >> exp2 is exp1 shifted right by exp2 bits. The 
  2535. right shift is guaranteed to be zero-filled if exp1 has an unsigned type or if 
  2536. exp1 has a non-negative value. Otherwise, the result is implementation 
  2537. dependent. For more details, see "Integers" in "Appendix C. 
  2538.  
  2539.  
  2540. ΓòÉΓòÉΓòÉ 4.10.5. Relational Operators ΓòÉΓòÉΓòÉ
  2541.  
  2542.  
  2543. ΓòÉΓòÉΓòÉ 5. Chapter 5. Declarations ΓòÉΓòÉΓòÉ
  2544.  
  2545. This chapter discusses the following topics: 
  2546.  
  2547. o Introduction to Declarations 
  2548. o Program linkage 
  2549. o Introduction to Specifiers 
  2550. o Storage-Class Specifiers 
  2551. o Type Specifiers 
  2552. o Function Specifiers 
  2553. o The typedef Specifier 
  2554. o Declarators 
  2555. o Type Names 
  2556. o Arrays 
  2557. o Pointers 
  2558. o References 
  2559. o Initialization. 
  2560.  
  2561.  
  2562. ΓòÉΓòÉΓòÉ 5.1. Introduction to Declarations ΓòÉΓòÉΓòÉ
  2563.  
  2564. A declaration introduces one or more identifiers into a program. There are 
  2565. three types of declarations: 
  2566.  
  2567. o Data object declarations 
  2568. o Type declarations 
  2569. o Function declarations. 
  2570.  
  2571. When you declare a data object and the declaration includes a definition, 
  2572. storage is allocated for that object. If a declared object is unused or is only 
  2573. used as the operand of sizeof, you do not need to define it. When you declare 
  2574. or define a type, storage is not allocated. 
  2575.  
  2576. A declaration establishes the names and type characteristics of data objects, 
  2577. functions, and types used in a program. The declaration of data objects, 
  2578. functions, and types can occur in local or block scope, file scope, or class 
  2579. scope. A declaration can specify a storage class, type, and linkage for an 
  2580. object or function. A definition is a declaration that allocates storage for a 
  2581. variable or specifies the code or body for a function. Each variable used in 
  2582. the program must be defined only once. In the statement where you define a 
  2583. variable you can also initialize it. 
  2584.  
  2585.  
  2586. ΓòÉΓòÉΓòÉ 5.1.1. Declaration Grammar ΓòÉΓòÉΓòÉ
  2587.  
  2588. A declaration has the following syntax: 
  2589.  
  2590.       declaration:
  2591.             [decl-specifiers][declarator-list]
  2592. ;
  2593.             function-definition
  2594.             template-declaration
  2595.             exception-declaration
  2596.             linkage-specification
  2597.  
  2598. Declaration syntax is recursive and allows for complete declarations. 
  2599.  
  2600. The details of specific kinds of declarations are described in the following 
  2601. sections: 
  2602.  
  2603. o decl-specifiers are specifiers that can be used in a declaration. . 
  2604.  
  2605. o function-definition is described in "Function Definitions" Function 
  2606.   Definitions. 
  2607.  
  2608. o template-declaration is described in Templates. 
  2609.  
  2610. o exception-declaration is described in Exception Handling. 
  2611.  
  2612. o linkage-specification is described in "Linkage Specifications" Linkage 
  2613.   Specifications - Linking to non-C++ Programs. 
  2614.  
  2615.  
  2616. ΓòÉΓòÉΓòÉ 5.2. Program Linkage ΓòÉΓòÉΓòÉ
  2617.  
  2618. The association, or lack of association, between two identical identifiers is 
  2619. known as linkage. Linkage is described here because the kind of linkage that an 
  2620. identifier has depends on the way that it is declared. 
  2621.  
  2622. A file scope identifier has one of the following kinds of linkage: 
  2623.  
  2624. Internal  Identical identifiers within a single source file refer to the same 
  2625.           data object. 
  2626.  
  2627. External  Identical identifiers in separately compiled files refer to the same 
  2628.           data object. 
  2629.  
  2630. No linkage Each identical identifier refers to a unique object. 
  2631.  
  2632. You can use a linkage specification to link to non-C++ declarations. Linkage 
  2633. Specifications - Linking to non-C++ Programs for further details. 
  2634.  
  2635.  
  2636. ΓòÉΓòÉΓòÉ 5.2.1. Internal Linkage ΓòÉΓòÉΓòÉ
  2637.  
  2638. The following kinds of identifiers have internal linkage: 
  2639.  
  2640. o Identifiers with file or block scope that have the keyword static  in their 
  2641.   declarations. Functions with static storage class are visible only in the 
  2642.   source file in which you define them. 
  2643.  
  2644. o Inline functions 
  2645.  
  2646. o Identifiers declared at file scope with the specifier const and not 
  2647.   explicitly declared extern. 
  2648.  
  2649. A variable that has static storage class can be defined within a block or 
  2650. outside of a function. If the definition occurs within a block, the variable 
  2651. has internal linkage and is only visible within the block after its declaration 
  2652. is seen. If the definition occurs outside of a function, the variable has 
  2653. internal linkage and is available from the point where it is defined to the end 
  2654. of the current source file. 
  2655.  
  2656. A class name that has no static members or noninline member functions, and that 
  2657. has not been used in the declaration of an object or function is local to its 
  2658. translation unit. 
  2659.  
  2660. If the declaration of an identifier has the keyword extern and if a previous 
  2661. declaration of the identifier is visible at file scope, the identifier has the 
  2662. same linkage as the first declaration. 
  2663.  
  2664.  
  2665. ΓòÉΓòÉΓòÉ 5.2.2. External Linkage ΓòÉΓòÉΓòÉ
  2666.  
  2667. The following kinds of identifiers have external linkage: 
  2668.  
  2669. o Identifiers with file or block scope that have the keyword extern  in their 
  2670.   declarations. If a previous declaration of the identifier is visible at file 
  2671.   scope, the identifier has the same linkage as the first declaration. For 
  2672.   example, a variable or function that is first declared with the keyword 
  2673.   static and later declared with the keyword extern has internal linkage. 
  2674.  
  2675. o Function identifiers declared without storage-class specifiers. 
  2676.  
  2677. o Object identifiers that have file scope declared without a storage-class 
  2678.   specified.  Storage is allocated for such object identifiers. 
  2679.  
  2680. o Static class members and noninline member functions. 
  2681.  
  2682. Identifiers declared with the keyword extern can be defined in other 
  2683. translation units. 
  2684.  
  2685.  
  2686. ΓòÉΓòÉΓòÉ 5.2.3. No Linkage ΓòÉΓòÉΓòÉ
  2687.  
  2688. The following kinds of identifiers have no linkage: 
  2689.  
  2690. o Identifiers that do not represent an object or a function, including labels, 
  2691.   enumerators, typedef names, type names, and template names. 
  2692.  
  2693. o Identifiers that represents a function argument. 
  2694.  
  2695. o Identifier declared inside a block without the keyword extern. 
  2696.  
  2697.  
  2698. ΓòÉΓòÉΓòÉ 5.2.4. Name Demangling ΓòÉΓòÉΓòÉ
  2699.  
  2700. When the &xcomp. &xcompos2. compiles a program, it encodes all function names 
  2701. and certain other identifiers to include type and scope information. This 
  2702. encoding process is called mangling, and the mangled names are used in the 
  2703. object files and final executable file. 
  2704.  
  2705. You may find it difficult to read the mangled names, so two utilities are 
  2706. provided to demangle the encoded names back to their original names. 
  2707.  
  2708.  
  2709. ΓòÉΓòÉΓòÉ 5.3. :id='pJK21d0antl'.Introduction to Specifiers ΓòÉΓòÉΓòÉ
  2710.  
  2711. The following sections describe the specifiers that can be used in a 
  2712. declaration. Specifiers are used to indicate the storage class, data type, and 
  2713. other properties of the object or function you are declaring. The syntax is: 
  2714.  
  2715.       decl-specifier:
  2716.             storage-class-specifier
  2717.             type-specifier
  2718.             fct-specifier
  2719.             template-specifier
  2720.             friend
  2721.             typedef
  2722.  
  2723.       decl-specifiers:
  2724.             [decl-specifiers]
  2725. decl-specifier
  2726.  
  2727. The details of specific kinds of specifiers are described in the following 
  2728. sections: 
  2729.  
  2730. o storage-class-specifier is described in 
  2731.  
  2732. o type-specifier is described in Type Specifiers. 
  2733.  
  2734. o fct-specifier is described in Function Specifiers. 
  2735.  
  2736. o The template-specifier is described in Templates. 
  2737.  
  2738. o The friend specifier is described in Friends 
  2739.  
  2740. o The typedef specifier is described in "The typedef Specifier" The typedef. 
  2741.  
  2742.  
  2743. ΓòÉΓòÉΓòÉ 5.4. Storage-Class Specifiers ΓòÉΓòÉΓòÉ
  2744.  
  2745. The syntax is: 
  2746.  
  2747.       storage-class-specifier:
  2748.  
  2749. auto
  2750.  
  2751. register
  2752.  
  2753. extern
  2754.  
  2755. static
  2756.  
  2757. Declarations with the auto or register storage-class specifier result in 
  2758. automatic storage. Those with the extern or static storage-class specifier 
  2759. result in static storage. 
  2760.  
  2761. Most local declarations that do not include the extern storage-class specifier 
  2762. allocate storage; however, function declarations and type declarations do not 
  2763. allocate storage. 
  2764.  
  2765. The only storage-class specifiers you can place in a global or file scope 
  2766. declaration are static and extern. 
  2767.  
  2768.  
  2769. ΓòÉΓòÉΓòÉ 5.4.1. auto and register ΓòÉΓòÉΓòÉ
  2770.  
  2771. auto enables you to define variables with automatic storage whose use is 
  2772. restricted to the current block or to blocks enclosed in the current block. 
  2773. The storage-class keyword auto is optional in block scope definitions and 
  2774. argument declarations. A variable having the auto storage class cannot be 
  2775. redeclared. Its first declaration is seen as its definition. 
  2776.  
  2777. register enables you to indicate within a block scope definition or an argument 
  2778. declaration that the variable is heavily used (such as a loop control 
  2779. variable). If possible, the compiler places the variable into a machine 
  2780. register for faster access. A variable having the register storage class must 
  2781. be defined within a block or declared as an argument to a function. 
  2782.  
  2783. If the compiler does not allocate a machine register for a register variable, 
  2784. that variable is treated as having storage class auto. Because of the limited 
  2785. size and number of registers available on the system, few variables can be 
  2786. stored in registers at the same time. 
  2787.  
  2788. You can initialize any auto variable or any register variable except arguments. 
  2789. If you do not provide an initial value, it is undefined. If you provide an 
  2790. initial value, the initializer representing the initial value can be an 
  2791. expression. The variable is then set to that initial value each time the 
  2792. program block that contains the variable definition is entered. 
  2793.  
  2794. Unlike C, C++ allows you to take the address of an object with storage class 
  2795. register. For example: 
  2796.  
  2797. register i;
  2798. int* b = &i;            // valid in C++, not in C
  2799.  
  2800.  
  2801. ΓòÉΓòÉΓòÉ 5.4.2. extern ΓòÉΓòÉΓòÉ
  2802.  
  2803. Using extern declarations enables you to reference variables and functions 
  2804. defined in other files. An extern declaration does not replace the definition. 
  2805. It describes the variable or function that is externally defined. 
  2806.  
  2807. An extern declaration can appear outside a function or at any point in a block. 
  2808. In a block, an extern declaration must contain the keyword extern. If the 
  2809. declaration describes a function or appears outside a function and describes a 
  2810. variable, the keyword extern is optional. 
  2811.  
  2812. All identifiers with an external definition have static storage. 
  2813.  
  2814. An extern declaration cannot appear in class scope. 
  2815.  
  2816. You can initialize any extern variable. If an extern declaration contains an 
  2817. initializer, it is a definition. extern objects are initialized before the 
  2818. first use of any function or object defined in that file. extern objects that 
  2819. are not explicitly initialized will be initialized to 0 (zero) at load time. 
  2820. Objects initialized with constant values are initialized first, before dynamic 
  2821. initialization takes place. Beyond this, the order of initialization of objects 
  2822. from different files is undefined. 
  2823.  
  2824. You cannot initialize a variable in a block scope declaration that has the 
  2825. extern storage-class specifier. 
  2826.  
  2827.  
  2828. ΓòÉΓòÉΓòÉ 5.4.3. static ΓòÉΓòÉΓòÉ
  2829.  
  2830. static enables you to define variables or functions that retain storage 
  2831. throughout the program. A variable or function defined with static is only 
  2832. visible within the file in which it is defined. The keyword static must appear 
  2833. in all static variable definitions and static function definitions. A variable 
  2834. or function that is declared with extern after it has been declared with static 
  2835. has static storage. 
  2836.  
  2837. All identifiers with a static storage class have static storage. 
  2838.  
  2839. You can initialize any staticvariable with an expression. 
  2840.  
  2841. Nonlocal staticobjects in a file are initialized before the first use of any 
  2842. function or object defined in that file. These objects are initialized before 
  2843. the first statement of main() or at any point before a function or object 
  2844. defined in that file is first used. Staticobjects that are not explicitly 
  2845. initialized will be initialized to 0 (zero) at load time. Objects initialized 
  2846. with constant values are initialized first, before dynamic initialization takes 
  2847. place. Beyond this, the order of initialization of objects from different files 
  2848. is undefined. 
  2849.  
  2850. Static variables that are local to a block are initialized only when control 
  2851. passes through their definitions for the first time. They retain their value 
  2852. from one execution of a block statement to the next. If the local static 
  2853. variable is a class object with constructors and destructors, the object will 
  2854. be constructed when control passes through its definition for the first time. 
  2855. If a local class object is created by a constructor, its destructor is called 
  2856. immediately before or as part of the calls of the atexit() functions. 
  2857.  
  2858.  
  2859. ΓòÉΓòÉΓòÉ 5.5. Type Specifiers ΓòÉΓòÉΓòÉ
  2860.  
  2861. Type specifiers are used to indicate the type of the object or function being 
  2862. declared. Their syntax is: 
  2863.  
  2864.       type-specifier:
  2865.             simple-type-name
  2866.             class-specifier
  2867.             enum-specifier
  2868.             elaborated-type-specifier
  2869.             const
  2870.             volatile
  2871.  
  2872. class-specifiers are described in "C++ Classes" -- Reference bfx1270antl not 
  2873. found -- 
  2874.  
  2875. class-specifiers are described in "C++ Classes" 
  2876.  
  2877. The syntax for a simple-type-name is: 
  2878.  
  2879.       simple-type-name:
  2880.             complete-class-name
  2881.             qualified-type-name
  2882.             char
  2883.             short
  2884.             int
  2885.             long
  2886.             signed
  2887.             unsigned
  2888.             float
  2889.             double
  2890.             void
  2891.  
  2892. For more details, on complete-class-name , and on qualified-type-name 
  2893.  
  2894. The syntax for an elaborated-type-specifier is: 
  2895.  
  2896.       elaborated-type-specifier:
  2897.             class-key complete-class-name
  2898.             class-key identifier
  2899.             enum qualified-class-name
  2900. :: enum-name
  2901.             enum enum-name
  2902.  
  2903.       class-key:
  2904.             class
  2905.             struct
  2906.             union
  2907.  
  2908.       enum-specifier:
  2909.             enum[identifier]
  2910. { [enum-list]
  2911. }
  2912.  
  2913.       enum-list:
  2914.             enumerator
  2915.             enum-list , enumerator
  2916.  
  2917.       enumerator:
  2918.             identifier
  2919.             identifier = constant-expression
  2920.  
  2921. If you specify a storage class, you can omit the type specifier. When you omit 
  2922. the type specifier, all variables declared receive the type int. 
  2923.  
  2924. Type specifiers are described in detail in the following sections: 
  2925.  
  2926. o "Fundamental Types" 
  2927. o "Derived Types" 
  2928. o "volatile and const Attributes" 
  2929.  
  2930.  
  2931. ΓòÉΓòÉΓòÉ 5.5.1. Fundamental Types ΓòÉΓòÉΓòÉ
  2932.  
  2933. The fundamental data types are: 
  2934.  
  2935. o Characters 
  2936. o Integers 
  2937. o Floating-point numbers 
  2938. o Void 
  2939. o Enumerations. 
  2940.  
  2941. The integral types are char and int of all sizes. Floating-point numbers can 
  2942. have types float, double, or long double. In C++, enumerations are not an 
  2943. integral type. Integral and floating point types are collectively called 
  2944. arithmetic types. 
  2945.  
  2946. You can give names to both fundamental and derived types by using the typedef 
  2947. construct. 
  2948.  
  2949.  
  2950. ΓòÉΓòÉΓòÉ 5.5.2. Characters ΓòÉΓòÉΓòÉ
  2951.  
  2952. The three character data types are char, signed char, and unsigned char. They 
  2953. provide enough storage to hold any member of the ASCII character set. 
  2954.  
  2955. The amount of storage allocated for a char is implementation dependent. For 
  2956. further details, see "Characters" in "Appendix C. 
  2957.  
  2958. For the purposes of distinguishing overloaded functions, char is a distinct 
  2959. type from signed char and unsigned char. The default type of char is unsigned 
  2960. char.To change this default, use #pragma chars  or #pragma options 
  2961. respectively. The -qchars option of the compiler also lets you change the 
  2962. default sign specification for a char object. 
  2963.  
  2964. To define or declare a data object having a character data type, place the 
  2965. keyword char in the type specifier position of the definition or declaration. 
  2966.  
  2967. The declarator for a simple character definition or declaration is an 
  2968. identifier. You can initialize a simple character with a character constant or 
  2969. with an expression that evaluates to an integer. 
  2970.  
  2971. The following example defines the const char variable end_of_string with the 
  2972. initial value '\0' (the null character): 
  2973.  
  2974. const char end_of_string = '\0';
  2975.  
  2976. For further details, see "Character Constants" 
  2977.  
  2978. The following example defines the unsigned char variable switches with the 
  2979. initial value 3. Note that the value of switches is the decimal representation 
  2980. of 3 and not the character `3'. 
  2981.  
  2982. unsigned char switches = 3;
  2983.  
  2984. You can use the char specifier in variable definitions to define such complex 
  2985. variables as arrays of characters, pointers to characters, and arrays of 
  2986. pointers to characters. 
  2987.  
  2988. The following example defines string_pointer as a pointer to a character: 
  2989.  
  2990. char *string_pointer;
  2991.  
  2992. The following example defines name as a pointer to a character. Initially, name 
  2993. points to the first letter in the character string "Johnny". 
  2994.  
  2995. char *name = "Johnny";
  2996.  
  2997. For further details, see "Pointers" 
  2998.  
  2999. The following example defines a one-dimensional array of pointers to 
  3000. characters. The array has three elements. Initially, they are a pointer to the 
  3001. string "Venus", a pointer to the string "Jupiter", and a pointer to "Saturn": 
  3002.  
  3003. static char *planets[ ] = { "Venus", "Jupiter",
  3004. "Saturn"
  3005. };
  3006.  
  3007. For further details, see "Arrays" 
  3008.  
  3009.  
  3010. ΓòÉΓòÉΓòÉ 5.5.3. Integers ΓòÉΓòÉΓòÉ
  3011.  
  3012. C++ has the following six groups of integer variables: 
  3013.  
  3014. o short int or short or signed short int or signed short 
  3015.  
  3016. o signed int or int 
  3017.  
  3018. o long int or long or signed long int or signed long 
  3019.  
  3020. o unsigned short int or unsigned short 
  3021.  
  3022. o unsigned or unsigned int 
  3023.  
  3024. o unsigned long int or unsigned long. 
  3025.  
  3026. Note:  When the arguments in overloaded functions and overloaded operators are 
  3027. integer types, two integer types that both come from the same group are not 
  3028. treated as distinct types. For example, you cannot overload an int argument 
  3029. against a signed int argument. Overloading and argument matching is described 
  3030. in "C++ Overloading" 
  3031.  
  3032. The default integer type for a bit field is unsigned. 
  3033.  
  3034. The amount of storage allocated for an int, a short, or a long is 
  3035. implementation dependent. For further details, see "Integers" in "Appendix C. 
  3036.  
  3037. The unsigned prefix causes a variable to be treated as a nonnegative integer. 
  3038. Each unsigned type provides the same size storage as its signed equivalent. For 
  3039. example, int reserves the same storage as unsigned int. Because a signed type 
  3040. reserves a sign bit, an unsigned type can hold a larger positive integer than 
  3041. the equivalent signed type. 
  3042.  
  3043. To define or declare a data object having an integer data type, use 
  3044. combinations of one or more of the keywords long, short, signed, unsigned, and 
  3045. int, as shown above, in the type specifier position of the definition or 
  3046. declaration. 
  3047.  
  3048. The declarator for a simple integer definition or declaration is an identifier. 
  3049. You can initialize a simple integer definition with an integer constant or with 
  3050. an expression that evaluates to a value that can be assigned to an integer. 
  3051.  
  3052. The following example defines the unsigned long int variable ss_number as 
  3053. having the initial value 438888834: 
  3054.  
  3055. unsigned long ss_number = 438888834ul;
  3056.  
  3057. The following example defines the int variable sum. The initial value of sum is 
  3058. the result of the expression a + b. 
  3059.  
  3060. int a = 1;
  3061. int b = 2;
  3062. int sum = a + b;
  3063.  
  3064. The example would be valid in either block or file scope. 
  3065.  
  3066.  
  3067. ΓòÉΓòÉΓòÉ 5.5.4. Floating Point ΓòÉΓòÉΓòÉ
  3068.  
  3069. Numbers 
  3070.  
  3071. There are three types of floating-point numbers: float, double, and long 
  3072. double. 
  3073.  
  3074. The amount of storage allocated for a float, a double, or a long double is 
  3075. implementation dependent. For more details, see "Floating-Point Types" in 
  3076. "Appendix C. &ugos2. . 
  3077.  
  3078. To define or declare a data object having a float data type, use the keywords 
  3079. float, double, or long double in the type specifier position of the definition 
  3080. or declaration. 
  3081.  
  3082. The declarator for a simple floating-point definition or declaration is an 
  3083. identifier. You can initialize a simple floating-point variable with a float 
  3084. constant or with a variable or expression that evaluates to an integer or 
  3085. floating-point number. 
  3086.  
  3087.  
  3088. ΓòÉΓòÉΓòÉ 5.5.5. void ΓòÉΓòÉΓòÉ
  3089.  
  3090. C++ provides a data type that always represents an empty set of values. The 
  3091. keyword for this type is void.The only object you can declare with the type 
  3092. specifier void is a pointer. You cannot declare a variable of type void. 
  3093.  
  3094. When a function does not return a value, use void as the type specifier in the 
  3095. function definition and declaration. An argument list for a function taking no 
  3096. arguments is void. 
  3097.  
  3098. You can explicitly convert any expression to type void, but the resulting 
  3099. expression can only be used as one of the following: 
  3100.  
  3101. o An expression statement 
  3102. o The left operand of a comma expression 
  3103. o The second or third operand in a conditional expression. 
  3104.  
  3105.  
  3106. ΓòÉΓòÉΓòÉ 5.5.6. Enumerations ΓòÉΓòÉΓòÉ
  3107.  
  3108. The syntax for an enumeration name is: 
  3109.  
  3110.       enum-name:
  3111.             identifier
  3112.  
  3113. Note:  Unlike C, an enumeration data type in C++ has a distinct type that is 
  3114. not an integral type. 
  3115.  
  3116. Each enumeration has a set of named constants associated with it. You can 
  3117. define an enumeration data type and all variables that have that enumeration 
  3118. type in one statement, or you can separate the definition of the enumeration 
  3119. data type from all variable definitions. 
  3120.  
  3121. An enumeration type declaration contains the keyword enum followed by an 
  3122. identifier (the enumeration name) and a brace-enclosed list of enumerators in 
  3123. which a comma separates each enumerator. 
  3124.  
  3125. The identifier in an enumerator is called an enumeration constant. You can use 
  3126. it in any place where values of the enumeration type can be used. Enumeration 
  3127. constants can be promoted to signed or unsigned integral constants when used in 
  3128. an expression. The &xcomp. &xcompos2. determines the integer representation of 
  3129. an enumerator (and its corresponding enumeration constant) by the following 
  3130. rules (an earlier rule has precedence over a later one): 
  3131.  
  3132.  1. If an = (equal sign) and a constant expression follow the enumeration 
  3133.     constant, the enumeration constant represents the value of the constant 
  3134.     expression. 
  3135.  
  3136.  2. If the enumerator is the leftmost value in the list and is not followed by 
  3137.     an = and a constant expression, the enumeration constant represents 0. 
  3138.  
  3139.  3. If the enumeration constant is notthe leftmost value in the list and isnot 
  3140.     followed by an = and a constant expression, the enumeration constant 
  3141.     represents the integer value that is one greater than the value represented 
  3142.     by the preceding enumerator. 
  3143.  
  3144.     The following example defines the enumeration data type status. 
  3145.  
  3146.         enum status { run, create, delete=5, suspend };
  3147.  
  3148.     The data type status represents the following values only: Enumeration 
  3149.     Constant    Integer Representation 
  3150.  
  3151.    run       0 
  3152.  
  3153.    create    1 
  3154.  
  3155.    delete    5 
  3156.  
  3157.    suspend   6 
  3158.  
  3159.     Each enumeration constant must have a unique name within the block or the 
  3160.     file where the enumeration data type is defined. In the following example, 
  3161.     the redefinition of average on line 4 and of poor on line 5 cause 
  3162.     compilation error messages: 
  3163.  
  3164.         1      func()
  3165.         2      {
  3166.         3            enum score { poor, average, good };
  3167.         4            enum rating { below, average, above };
  3168.         5            int poor;
  3169.         6      }
  3170.  
  3171.     An enumeration variable definition contains an optional storage-class 
  3172.     specifier, a type specifier, a declarator, and an optional initializer. The 
  3173.     type specifier contains the keyword enum, followed by the name of the 
  3174.     enumeration data type. You must define the enumeration data type before you 
  3175.     define a variable having that type. The keyword enum is optional in a 
  3176.     declaration using a predefined enumeration type. 
  3177.  
  3178.     The initializer for an enumeration variable contains the symbol =, followed 
  3179.     by an enumeration constant of the associated enumeration type. For example: 
  3180.  
  3181.         enum      grain { oats, wheat, barley, corn, rice };
  3182.         enum      grain g_food = barley;
  3183.               grain cob_food = corn;
  3184.  
  3185.     The first line of the previous example defines the enumeration data type 
  3186.     grain. The second line defines the enumeration constant g_food and gives it 
  3187.     the initial value of barley. The type specifier enum grain indicates that 
  3188.     the value of g_food has the enumerated data type grain. The third line 
  3189.     defines the variable cob_food and gives it the initial value of corn. The 
  3190.     enum is optional in lines 2 and 3. Line 3 omits it. 
  3191.  
  3192.     You can place a type definition and a variable declaration in one statement 
  3193.     by placing a declarator and an optional initializer after the type 
  3194.     definition. To specify a storage class for the variable, you can place the 
  3195.     storage-class specifier at the beginning of the statement or before the 
  3196.     declarator. For example, either of the following definitions: 
  3197.  
  3198.         register enum score { poor=1, average, good } rating =
  3199.         good;
  3200.         enum score { poor = 1, average, good } register rating
  3201.         = good;
  3202.  
  3203.     is equivalent to the following two statements: 
  3204.  
  3205.         enum score { poor=1, average, good };
  3206.         register enum score rating = good;
  3207.  
  3208.     Both examples define the enumeration data type score and the variable 
  3209.     rating. rating has the storage class register, the data type enum score, 
  3210.     and the initial value good. 
  3211.  
  3212.     If you combine a data-type definition with the definitions of all variables 
  3213.     having that data type, you can leave the data type unnamed. The following 
  3214.     example defines the variable weekday, which can be assigned any of the 
  3215.     specified enumeration constants: 
  3216.  
  3217.         enum { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday,
  3218.               Saturday } weekday;
  3219.  
  3220.     For more details, see "Constant Expressions" and "Identifiers" 
  3221.  
  3222.  
  3223. ΓòÉΓòÉΓòÉ 5.5.7. Derived Types ΓòÉΓòÉΓòÉ
  3224.  
  3225. From the fundamental types, you can derive: 
  3226.  
  3227. o Arrays 
  3228. o Functions 
  3229. o Pointers 
  3230. o References 
  3231. o Constants 
  3232. o Structures 
  3233. o Unions 
  3234. o Classes 
  3235. o Pointers to  Members 
  3236.  
  3237.  
  3238. ΓòÉΓòÉΓòÉ 5.5.8. volatile and const Attributes ΓòÉΓòÉΓòÉ
  3239.  
  3240. The volatile attribute is meant to be used when you are optimizing code. See 
  3241. "Qualifiers" in "Appendix C. for details on how volatile affects  memory access 
  3242. to data objects. 
  3243.  
  3244. The const attribute explicitly declares a data object as a data item that 
  3245. cannot be changed. Its value is set at initialization. Do not use const data 
  3246. objects in expressions requiring a modifiable lvalue. For example, a const data 
  3247. object cannot appear on the left-hand side of an assignment statement. 
  3248.  
  3249. For a volatile or const pointer, you must place the keyword between the * and 
  3250. the identifier. For example: 
  3251.  
  3252. int z = 10;
  3253. int * volatile x;      // x is a volatile pointer to an
  3254. int
  3255. int * const y;      // y is a const pointer to an int
  3256.  
  3257. For a pointer to a volatile or const data object, you must place the keyword 
  3258. before the *. For example: 
  3259.  
  3260. volatile int *x;      // x is a pointer to a volatile int
  3261. const int *y;            // y is a pointer to a const int
  3262.  
  3263. The expression: *y = z; is allowed in the first example, but not in the second. 
  3264. The expression: y = &z; is allowed in the second example, but not in the first. 
  3265.  
  3266. For other types of volatile and const variables, the position of the keyword 
  3267. within the definition (or declaration) is not important. For example: 
  3268.  
  3269. volatile struct omega
  3270. {
  3271.       int limit;
  3272.       char code;
  3273. } group;
  3274.  
  3275. provides the same attributes as: 
  3276.  
  3277. struct omega
  3278. {
  3279.       int limit;
  3280.       char code;
  3281. } volatile group;
  3282.  
  3283. In both examples, only the structure variable group receives the volatile 
  3284. attribute. When applied to a class object, the const and volatile attributes 
  3285. also apply to the members of that class. 
  3286.  
  3287. The keywords enum, struct, and union cannot be separated from their tags by the 
  3288. keywords volatile or const. 
  3289.  
  3290. You can declare or define a volatile or const function , provided such a 
  3291. function is a member function. You can define or declare any function that 
  3292. returns a pointer or reference to a volatile or const object. 
  3293.  
  3294. If you place a type definition in the same statement as a definition of a 
  3295. variable having the volatile or const attribute, the attribute applies to that 
  3296. variable only. For example: 
  3297.  
  3298. enum shape { round, square, triangular, oblong }
  3299. volatile
  3300. object;
  3301. enum shape appearance;
  3302.  
  3303. Only the variable object has the volatile attribute. Similarly, if you specify 
  3304. the const keyword instead of volatile, only the variable object receives the 
  3305. const attribute. 
  3306.  
  3307. The following code fragments show examples of declarators: 
  3308.  
  3309. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  3310. Γöé Example                        Γöé Description                   Γöé
  3311. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3312. Γöé int owner;                     Γöé owner is an int data object   Γöé
  3313. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3314. Γöé int* node;                     Γöé node is a pointer to an int   Γöé
  3315. Γöé                                Γöé data object                   Γöé
  3316. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3317. Γöé int names[126];                Γöé names is an array of 126 int  Γöé
  3318. Γöé                                Γöé elements                      Γöé
  3319. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3320. Γöé int *action( );                Γöé action is a function          Γöé
  3321. Γöé                                Γöé returning a pointer to an int Γöé
  3322. Γöé                                Γöé and taking no arguments       Γöé
  3323. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3324. Γöé volatile int min;              Γöé min is an int that has the    Γöé
  3325. Γöé                                Γöé volatile attribute            Γöé
  3326. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3327. Γöé int* volatile volume;          Γöé volume is a volatile pointer  Γöé
  3328. Γöé                                Γöé to an int                     Γöé
  3329. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3330. Γöé volatile int* next;            Γöé next is a pointer to a vola-  Γöé
  3331. Γöé                                Γöé tile int                      Γöé
  3332. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3333. Γöé volatile int* sequence[5];     Γöé sequence is an array of five  Γöé
  3334. Γöé                                Γöé pointers to volatile int      Γöé
  3335. Γöé                                Γöé objects                       Γöé
  3336. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  3337. Γöé extern const volatile int      Γöé op_system_clock is an extern  Γöé
  3338. Γöé op_system_clock;               Γöé int that has the volatile and Γöé
  3339. Γöé                                Γöé const attributes              Γöé
  3340. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  3341.  
  3342.  
  3343. ΓòÉΓòÉΓòÉ 5.6. Function Specifiers ΓòÉΓòÉΓòÉ
  3344.  
  3345. Function specifiers are used only in function declarations. For further 
  3346. details, see "Function Declarations" 
  3347.  
  3348. The syntax is: 
  3349.  
  3350.       fct-specifier:
  3351.             inline
  3352.             virtual
  3353.  
  3354. The function specifier inline is used to make a suggestion to the compiler to 
  3355. incorporate the code of a function into the code at the point of the call. For 
  3356. more details, see  "Inline Functions" 
  3357.  
  3358. The function specifier virtual can only be used in nonstatic member function 
  3359. declarations. For further details, see "Virtual Functions" 
  3360.  
  3361.  
  3362. ΓòÉΓòÉΓòÉ 5.7. The typedef ΓòÉΓòÉΓòÉ
  3363.  
  3364. Specifier 
  3365.  
  3366. typedef declarations allow you to define your own identifiers that can be used 
  3367. in place of type specifiers such as int, float, and double. The data types you 
  3368. define using typedef are not new data types. They are synonyms for the types 
  3369. that they represent. A typedef definition does not reserve storage. 
  3370.  
  3371. When you define an object using a typedef identifier, the properties of the 
  3372. defined object are exactly the same as if you had defined it by explicitly 
  3373. listing the data type associated with the typedef.  For example, the following 
  3374. statements declare LENGTH as a synonym for int, and then uses this typedef to 
  3375. declare length, width, and height as int variables: 
  3376.  
  3377. typedef int LENGTH;
  3378. LENGTH length, width, height;
  3379.  
  3380. The following declarations are equivalent to the above declaration: 
  3381.  
  3382. int length, width, height;
  3383.  
  3384. Similarly, typedef can define class types. For example, 
  3385.  
  3386. typedef struct
  3387. {
  3388.       int kilos;
  3389.       int grams;
  3390. } WEIGHT;
  3391.  
  3392. The structure WEIGHT can then be used in the following declarations: 
  3393.  
  3394. WEIGHT chicken, cow, horse, whale;
  3395.  
  3396. A class defined in a typedef without being named is given a dummy name and the 
  3397. typedef name for linkage. Such a class cannot have constructors or destructors. 
  3398. For example, 
  3399.  
  3400. typedef class
  3401. {
  3402.       Trees();
  3403. } Trees;
  3404.  
  3405. Here the function Trees() is an ordinary member function of a class whose type 
  3406. name is unspecified. In the above example, Trees is an alias for the unnamed 
  3407. class, not the class type name itself, so Trees() cannot be a constructor for 
  3408. that class. 
  3409.  
  3410.  
  3411. ΓòÉΓòÉΓòÉ 5.8. Declarators ΓòÉΓòÉΓòÉ
  3412.  
  3413. A declaration can consist of a specifier followed by a list of declarators. A 
  3414. declarator designates the name of a data object or function. In a declarator, 
  3415. you can specify the type of an object to be an array, a pointer, or a 
  3416. reference. You can specify that the return type of a function is a pointer or a 
  3417. reference. You can also perform initialization in a declarator. The following 
  3418. sections describe each of these topics: 
  3419.  
  3420. o "Type Names" 
  3421. o "Arrays" 
  3422. o "Pointers" 
  3423. o "References" 
  3424. o "Initializers" 
  3425.  
  3426. The syntax for a declarator list is : 
  3427.  
  3428.       declarator-list:
  3429.             init-declarator
  3430.             declarator-list , init-declarator
  3431.       init-declarator:
  3432.             declarator [initializer]
  3433.  
  3434. The syntax for a declarator is: 
  3435.  
  3436.       declarator:
  3437.             dname
  3438.             ptr-operator declarator
  3439.             declarator
  3440. (argument-declaration-list)
  3441.                   [cv-qualifier-list]
  3442. [exception-specification]
  3443.             declarator [
  3444. [constant-expression]
  3445. ]
  3446.             (declarator)
  3447.       ptr-operator:
  3448.             *[cv-qualifier-list]
  3449.             &[cv-qualifier-list]
  3450.             complete-class-name :: *
  3451. [cv-qualifier-list]
  3452.       cv-qualifier-list:
  3453.             cv-qualifier
  3454. [cv-qualifier-list]
  3455.       cv-qualifier:
  3456.             const
  3457.             volatile
  3458.       dname:
  3459.             name
  3460.             class-name
  3461.             ~ class-name
  3462.             typedef-name
  3463.             qualified-type-name
  3464.  
  3465. The grammar for qualified-type-name  above applies to types at file scope. 
  3466.  
  3467.  
  3468. ΓòÉΓòÉΓòÉ 5.9. Type Names ΓòÉΓòÉΓòÉ
  3469.  
  3470. Type names are used to explicitly specify type conversions and as an argument 
  3471. to the operators sizeof  and new . A type name looks like a declaration for an 
  3472. object or function except that the actual name of the object or function does 
  3473. not appear. 
  3474.  
  3475. The syntax is: 
  3476.  
  3477.       type-name
  3478.             type-specifier-list
  3479.       [abstract-declarator]
  3480.       type-specifier-list
  3481.             type-specifier
  3482.       [type-specifier-list]
  3483.       abstract-declarator
  3484.             ptr-operator
  3485.       [abstract-declarator]
  3486.             [abstract-declarator]
  3487. (argument-declaration-list)
  3488.                                                 [cv-qualifier-list]
  3489.             [abstract-declarator]
  3490. [[constant-expression]]
  3491.             (abstract-declarator)
  3492.  
  3493.       argument-declaration-list:
  3494.             [arg-declaration-list]
  3495. [...]
  3496.             [arg-declaration-list] , ...
  3497.  
  3498.       arg-declaration-list:
  3499.             argument-declaration
  3500.             arg-declaration-list ,
  3501. argument-declaration
  3502.       argument-declaration:
  3503.             decl-specifiers declarator
  3504.             decl-specifiers declarator =
  3505. expression
  3506.             decl-specifiers
  3507. [abstract-declarator]
  3508.             decl-specifiers
  3509. [abstract-declarator]
  3510. = expression
  3511.  
  3512. In the following example, N and arraytype are both type names. 
  3513.  
  3514. class N {int i};
  3515. typedef int arraytype [5];
  3516.  
  3517.  
  3518. ΓòÉΓòÉΓòÉ 5.10. Arrays ΓòÉΓòÉΓòÉ
  3519.  
  3520. An array contains an ordered group of adjacent data objects. Each of these 
  3521. objects is called an element. All elements within an array have the same data 
  3522. type. 
  3523.  
  3524. Arrays can be of any data type, except function or reference. You can, however, 
  3525. declare an array of pointers to functions. 
  3526.  
  3527. A subscript declarator has the form: 
  3528.  
  3529.       declarator [
  3530. [constant-expression]
  3531. ]
  3532.  
  3533. The declarator contains an identifier followed by a subscript declarator. The 
  3534. identifier can be preceded by an * (asterisk), making the variable an array of 
  3535. pointers. The subscript declarator describes the number of dimensions in the 
  3536. array and the number of elements in each dimension. 
  3537.  
  3538. Each bracketed expression describes a different dimension. If the brackets 
  3539. contain a constant expression, the constant expression must have a positive 
  3540. integral value. The value of the constant expression determines the number of 
  3541. elements in that dimension. The following example defines a one-dimensional 
  3542. array that contains four elements having type char: 
  3543.  
  3544. char list[4];
  3545.  
  3546. The first subscript of each dimension is 0 (zero). Thus, the array list 
  3547. contains the elements: 
  3548.  
  3549. list[0]
  3550. list[1]
  3551. list[2]
  3552. list[3]
  3553.  
  3554. The following example defines the two-dimensional array roster containing six 
  3555. elements of type int. 
  3556.  
  3557. int roster[3][2];
  3558.  
  3559. In multidimensional arrays, when elements are referenced in order of increasing 
  3560. storage location, the last subscript varies the fastest. Thus, the array roster 
  3561. contains the elements: 
  3562.  
  3563. roster[0][0]
  3564. roster[0][1]
  3565. roster[1][0]
  3566. roster[1][1]
  3567. roster[2][0]
  3568. roster[2][1]
  3569.  
  3570. You can leave the first (and only the first) set of subscript brackets empty 
  3571. in: 
  3572.  
  3573. o Array definitions that contain initializations 
  3574. o extern declarations 
  3575. o Argument declarations. 
  3576.  
  3577. In array definitions that leave the first set of subscript brackets empty, the 
  3578. initializer determines the number of elements in the first dimension. In a 
  3579. one-dimensional array, the number of initialized elements becomes the total 
  3580. number of elements. In a multidimensional array, the initializer is compared to 
  3581. the subscript declarator to determine the number of elements in the first 
  3582. dimension. In a multidimensional array, every dimension except the first must 
  3583. be specified as a constant expression. 
  3584.  
  3585. An unsubscripted array name (for example, region instead of region[4]) 
  3586. represents a pointer whose value is the address of the first element of the 
  3587. array, provided the array has previously been declared. An unsubscripted array 
  3588. name with square brackets (for example, region[]) is allowed only when 
  3589. declaring arrays at file scope or in the argument list of a function 
  3590. declaration. In declarations, only the first dimension can be left empty; you 
  3591. must specify the sizes of additional dimensions. 
  3592.  
  3593. The following example shows an argument declaration for a one-dimensional 
  3594. array: 
  3595.  
  3596. test(int y[ ])
  3597. { /* ... */ }
  3598.  
  3599. The array subscript operator is described in "Array Subscript" 
  3600.  
  3601. See also "Array Initialization" 
  3602.  
  3603.  
  3604. ΓòÉΓòÉΓòÉ 5.11. Pointers ΓòÉΓòÉΓòÉ
  3605.  
  3606. This section discusses the following topics: 
  3607.  
  3608. o Pointer types 
  3609. o Pointer assignment 
  3610. o Using pointers 
  3611. o Pointer arithmetic 
  3612. o Pointer type compatibility. 
  3613.  
  3614. Using pointers to functions is described in "Pointers to Functions". 
  3615.  
  3616.  
  3617. ΓòÉΓòÉΓòÉ 5.11.1. Pointer Types ΓòÉΓòÉΓòÉ
  3618.  
  3619. A pointer type variable holds the address of a data object or a function. A 
  3620. pointer can refer to an object of any one data type except to a bit field, or 
  3621. to a reference. Some common uses for pointers are: 
  3622.  
  3623. o To pass the address of a variable to a function (you can also use a reference 
  3624.   to do this). By referencing the address of a variable, a function can change 
  3625.   the contents of that variable. See "Calling Functions and Argument Passing". 
  3626.  
  3627. o To access dynamic data structures such as linked lists, trees, and queues. 
  3628.  
  3629. o To access elements of an array or members of a class. 
  3630.  
  3631. o To access an array of characters as a string. 
  3632.  
  3633. A pointer can have any storage class. The following example declares pcoat as a 
  3634. pointer to an object having type long: 
  3635.  
  3636. extern long *pcoat;
  3637.  
  3638. If the keyword volatile appears before the *, the declarator describes a 
  3639. pointer to a volatile object. If the keyword volatile comes between the * and 
  3640. the identifier, the declarator describes a volatile pointer. 
  3641.  
  3642. The keyword const operates the same way as the volatile keyword. In the 
  3643. following example, pvolt is a constant pointer to an object having type short: 
  3644.  
  3645. short * const pvolt;
  3646.  
  3647. The following example declares pnut as a pointer to an int object having the 
  3648. volatile attribute: 
  3649.  
  3650. extern int volatile *pnut;
  3651.  
  3652. The following example defines (and declares) psoup as a volatile pointer to an 
  3653. object having type float: 
  3654.  
  3655. float * volatile psoup;
  3656.  
  3657. The following example defines (and declares) phen as a pointer to an 
  3658. enumeration object of type bird: 
  3659.  
  3660. enum bird *phen;
  3661.  
  3662. The next example declares pvish as a pointer to a function that takes no 
  3663. arguments and that returns a char value: 
  3664.  
  3665. char (*pvish)();
  3666.  
  3667.  
  3668. ΓòÉΓòÉΓòÉ 5.11.2. Pointer Assignment ΓòÉΓòÉΓòÉ
  3669.  
  3670. When you use a pointer in an assignment operation, you must ensure that the 
  3671. types on both sides of the assignment operator are compatible. For example: 
  3672.  
  3673. int a=3;
  3674. float b=4.0;
  3675. int* ptra;
  3676. float* ptrb;
  3677.  
  3678. void main()
  3679. {
  3680.       ptra=&a;      // int* ptra points to int a
  3681.       ptrb=&b;      // float* ptrb points to float b
  3682.       ptra=&b;      // error, an int* can't point to a float
  3683.       ptrb=&a;      // error, a float* can't point to an
  3684. int
  3685.       ptra=ptrb;      // error, can't convert from float*
  3686. to int*
  3687. }
  3688.  
  3689. The first two assignment operations are correct. The third and fourth are 
  3690. errors because you cannot assign the address of a variable of one type to a 
  3691. pointer of a different type. The final assignment fails because the address 
  3692. contained in a pointer to float cannot be assigned to a pointer to int. 
  3693.  
  3694.  
  3695. ΓòÉΓòÉΓòÉ 5.11.3. Using Pointers ΓòÉΓòÉΓòÉ
  3696.  
  3697. Two operators are commonly used in working with pointers. The * (indirection) 
  3698. operator accesses the object pointed to by a pointer. The & (address) operator 
  3699. obtains a pointer to its operand. 
  3700.  
  3701. For example, the following statement assigns the address of x to the variable 
  3702. p_to_x. The variable p_to_x has been defined as a pointer. 
  3703.  
  3704. int x, *p_to_x;
  3705. p_to_x = &x;
  3706.  
  3707. The following statement assigns to y the value of the object to which p_to_x 
  3708. points: 
  3709.  
  3710. float y,*p_to_x;
  3711. // ...
  3712. y = *p_to_x;
  3713.  
  3714. The following statement assigns the value of y to the variable that *p_to_x 
  3715. references: 
  3716.  
  3717. char y,*p_to_x;
  3718. // ...
  3719. *p_to_x = y;
  3720.  
  3721. You cannot use pointers to address bit fields or objects of reference type. 
  3722.  
  3723.  
  3724. ΓòÉΓòÉΓòÉ 5.11.4. Pointer Arithmetic ΓòÉΓòÉΓòÉ
  3725.  
  3726. You can perform a limited number of arithmetic operations on pointers. They 
  3727. are: 
  3728.  
  3729. o Increment and decrement 
  3730. o Addition and subtraction 
  3731. o Comparison 
  3732. o Assignment. 
  3733.  
  3734. The ++ (increment) operator increases the value of a pointer by the size of the 
  3735. data object to which the pointer refers. If the pointer refers to the second 
  3736. element in an array, the ++ operator makes the pointer refer to the third 
  3737. element in the array. 
  3738.  
  3739. The - - (decrement) operator decreases the value of a pointer by the size of 
  3740. the data object to which the pointer refers. If the pointer refers to the 
  3741. second element in an array, the - - operator makes the pointer refer to the 
  3742. first element in the array. 
  3743.  
  3744. If the pointer p points to the first element in an array, the following 
  3745. expression causes the pointer to point to the third element in the same array: 
  3746.  
  3747. p = p + 2;
  3748.  
  3749. If you have two pointers that point to the same array, you can subtract one 
  3750. pointer from the other. This operation yields the number of elements in the 
  3751. array that separate the two addresses to which the pointers refer. 
  3752.  
  3753. You can compare two pointers with the following operators: ==, !=, <, >, <=, 
  3754. and >=. 
  3755.  
  3756. Pointer comparisons using relational operators are defined only when the 
  3757. pointers point to elements of the same array. Pointer comparisons using the == 
  3758. and != operators can be performed even when the pointers point to elements of 
  3759. different arrays. 
  3760.  
  3761. You can assign to a pointer the address of a data object, the value of another 
  3762. pointer of compatible type, or any constant expression that evaluates to 0 
  3763. (zero). 
  3764.  
  3765.  
  3766. ΓòÉΓòÉΓòÉ 5.11.5. Pointer Type Compatibility ΓòÉΓòÉΓòÉ
  3767.  
  3768. A pointer to a type has the type type*. Once a pointer has been declared for a 
  3769. given type, it cannot be assigned the address of a variable of a different type 
  3770. except with an explicit type cast. 
  3771.  
  3772. Both an assignment of the address of a variable of one type to a pointer of 
  3773. another type, and an assignment of a pointer of one type to a pointer of 
  3774. another type, are flagged as compile time errors. 
  3775.  
  3776. For further details on pointer operators, see  "Address" 
  3777.  
  3778. See also "Pointer Initialization" 
  3779.  
  3780.  
  3781. ΓòÉΓòÉΓòÉ 5.12. References ΓòÉΓòÉΓòÉ
  3782.  
  3783. A reference is an alias or an alternative name for an object. All operations 
  3784. applied to a reference act on the object to which the reference refers. The 
  3785. address of a reference is the address of the aliased object. 
  3786.  
  3787. A reference type is defined by placing the & after the type specifier. You must 
  3788. initialize a reference when it is defined. 
  3789.  
  3790. Because arguments are passed by value, a function call does not modify the 
  3791. actual values of the arguments. If a function needs to modify the actual value 
  3792. of an argument, the argument must be passed "by reference" (as opposed to being 
  3793. passed by value). This can be done using either references or pointers. In C++ 
  3794. this is accomplished transparently. Unlike C, C++ does not force you to use 
  3795. pointers if you want to pass arguments "by reference". For example: 
  3796.  
  3797. int f(int&);
  3798. void main()
  3799. {
  3800.       extern int i;
  3801.       f(i);
  3802. }
  3803.  
  3804. You cannot tell from the function call f(i) that the argument is being passed 
  3805. by reference. 
  3806.  
  3807. NULL references are not allowed. 
  3808.  
  3809. For more details on passing by reference, see "Passing Arguments by Reference" 
  3810. See "Reference Initialization" for more details on the initialization of 
  3811. references. 
  3812.  
  3813.  
  3814. ΓòÉΓòÉΓòÉ 5.13. Initialization ΓòÉΓòÉΓòÉ
  3815.  
  3816. This section discusses initializers and initialization of the following: 
  3817.  
  3818. o Scalar objects 
  3819. o Arrays 
  3820. o Pointers 
  3821. o References 
  3822. o Aggregate objects. 
  3823.  
  3824. Initialization of class objects using constructors is described in 
  3825. "Initialization by Constructor". 
  3826.  
  3827.  
  3828. ΓòÉΓòÉΓòÉ 5.13.1. Initializers ΓòÉΓòÉΓòÉ
  3829.  
  3830. An initializer is an optional part of a data definition that specifies an 
  3831. initial value of a data object. 
  3832.  
  3833. An initializer has the form: 
  3834.  
  3835.       initializer:
  3836.             = expression
  3837.             = { [ initializer-list
  3838. ,
  3839. ] }
  3840.             (expression-list)
  3841.       initializer-list:
  3842.             expression
  3843.             initializer-list , expression
  3844.             [ initializer-list , ]
  3845.  
  3846. An initializer of the form (expression-list ) can be used to initialize 
  3847. classes. For more details on initializing classes, see "Initialization by 
  3848. Constructor" You can also use this form to initialize fundamental types. For 
  3849. example, the following two initializations are identical: 
  3850.  
  3851. int x = 1;
  3852.  
  3853. int x(1);
  3854.  
  3855. The initializer may consist of the = symbol followed by an initial expression, 
  3856. which evaluates to the initial value of the data object. Unlike, ANSI C, you 
  3857. can initialize variables at file scope with nonconstant expressions. 
  3858.  
  3859. An attempt to jump past declarations that contain initializations will produce 
  3860. a compilation error. For example, the following is not valid in C++ : 
  3861.  
  3862. goto skiplabel;
  3863. int i=3            // error, jumped over declaration of i
  3864.                   // with initializer
  3865. skiplabel: i=4;
  3866.  
  3867.  
  3868. ΓòÉΓòÉΓòÉ 5.13.2. Scalar Initialization ΓòÉΓòÉΓòÉ
  3869.  
  3870. To assign a value to a scalar data object, you can either: 
  3871.  
  3872. o Use the simple initializer = expression. 
  3873.  
  3874. o Use parentheses. 
  3875.  
  3876. For example, the following two data definitions set the initial values of both 
  3877. group and combo to 3: 
  3878.  
  3879. int group = 3;
  3880. int combo(3);
  3881.  
  3882.  
  3883. ΓòÉΓòÉΓòÉ 5.13.3. Array Initialization ΓòÉΓòÉΓòÉ
  3884.  
  3885. You can initialize array definitions. The initializer contains the = symbol 
  3886. followed by a brace-enclosed comma-separated list of expressions. You do not 
  3887. need to initialize all elements in an array. In extern and static array 
  3888. definitions, all elements are initialized with the value 0 (zero). In partially 
  3889. initialized arrays, elements that are not initialized receive the value 0 
  3890. (zero). 
  3891.  
  3892. The following definition shows a completely initialized one-dimensional array: 
  3893.  
  3894. static int number[3] = { 5, 7, 2 };
  3895.  
  3896. The array number contains the following values: Element       Value 
  3897.  
  3898. number[0] 5 
  3899.  
  3900. number[1] 7 
  3901.  
  3902. number[2] 2 
  3903.  
  3904. The following definition shows a partially initialized one-dimensional array: 
  3905.  
  3906. static int number1[3] = { 5, 7 };
  3907.  
  3908. The values of number1 are: Element       Value 
  3909.  
  3910. number1[0] 5 
  3911.  
  3912. number1[1] 7 
  3913.  
  3914. number1[2] 0 
  3915.  
  3916. Instead of defining the number of elements with an expression in the subscript 
  3917. declarator, the following one-dimensional array definition defines one element 
  3918. for each initializer specified: 
  3919.  
  3920. static int item[ ] = { 1, 2, 3, 4, 5 };
  3921.  
  3922. The &xcomp. &xcompos2. gives item the five initialized elements: Element 
  3923. Value 
  3924.  
  3925. item[0]   1 
  3926.  
  3927. item[1]   2 
  3928.  
  3929. item[2]   3 
  3930.  
  3931. item[3]   4 
  3932.  
  3933. item[4]   5 
  3934.  
  3935. You can initialize a one-dimensional character array by specifying either of: 
  3936.  
  3937. o A brace-enclosed comma-separated list of character constants 
  3938.  
  3939. o A string literal. Braces surrounding the string literal are optional. 
  3940.  
  3941. Initializing an array with a string literal places the character '\0'  at the 
  3942. end of the string. You cannot have more initializers than there are array 
  3943. elements. 
  3944.  
  3945. The following character array initialization produces an error: 
  3946.  
  3947. static char name3[3] = "Jan"; // error
  3948.  
  3949. You must have an element available to contain the '\0' that is appended to the 
  3950. string. 
  3951.  
  3952. static char name4[4] = "Jan"; // legal
  3953.  
  3954.  
  3955. ΓòÉΓòÉΓòÉ 5.13.4. Pointer Initialization ΓòÉΓòÉΓòÉ
  3956.  
  3957. A pointer initializer is an = (equal sign) followed by the address the pointer 
  3958. is to contain. The following example defines the variables time and speed as 
  3959. having type double and amount as having type pointer to a double. The pointer 
  3960. amount is initialized to point to total: 
  3961.  
  3962. double total, speed, *amount = &total;
  3963.  
  3964. An unsubscripted array name is refers to a pointer to the first element in the 
  3965. array. To assign the address of the first element of an array to a pointer, 
  3966. specify the name of the array. The following two sets of definitions are 
  3967. equivalent. Both define the pointer student and initialize student to the 
  3968. address of the first element in class: 
  3969.  
  3970. int class[80];
  3971. int *student = class;
  3972.  
  3973. This is equivalent to: 
  3974.  
  3975. int class[80];
  3976. int *student = &class[0];
  3977.  
  3978. You can assign the address of the first character in a string literal to a 
  3979. pointer by specifying the string literal in the initializer. The following 
  3980. example defines the pointer variable string and the string literal "abcd". The 
  3981. pointer string is initialized to point to the character 'a' in the string 
  3982. "abcd". 
  3983.  
  3984. char *string = "abcd";
  3985.  
  3986. The following example defines weekdays as an array of pointers to string 
  3987. literals. Each element points to a different string. The object weekdays[2], 
  3988. for example, points to the string "Tuesday". 
  3989.  
  3990. static char *weekdays[ ] =
  3991. {
  3992.       "Sunday", "Monday", "Tuesday", "Wednesday",
  3993.       "Thursday", "Friday", "Saturday"
  3994. };
  3995.  
  3996. A pointer can also be initialized to the integer constant 0 (zero). Such a 
  3997. pointer is called a null pointer. It does not point to any object. 
  3998.  
  3999.  
  4000. ΓòÉΓòÉΓòÉ 5.13.5. Reference Initialization ΓòÉΓòÉΓòÉ
  4001.  
  4002. The object that you use to initialize a reference must be of the same type as 
  4003. the reference, or it must be of a type that is convertible to the reference 
  4004. type. If you initialize a constant reference using an object that requires 
  4005. conversion, a temporary object is created. In the following example, a 
  4006. temporary object of type float is created: 
  4007.  
  4008. int i;
  4009. const float& f = i;
  4010.  
  4011. Once a reference has been initialized, it cannot be modified to refer to 
  4012. another object. For example: 
  4013.  
  4014. int num1 = 10;
  4015. int num2 = 20;
  4016. int &RefOne = num1;            // valid
  4017. int &RefOne = num2;            // error, two definitions
  4018. of RefOne
  4019. RefOne = num2;            // assign num2 to num1
  4020. int &RefTwo;             // error, uninitialized reference
  4021. int &RefTwo = num2;            // valid
  4022.  
  4023. Note that the initialization of a reference is not the same as an assignment to 
  4024. a reference. Initialization operates on the actual reference by initializing 
  4025. the reference with the object it is an alias for. Assignment operates through 
  4026. the reference on the object referred to. 
  4027.  
  4028. A reference can be declared without an initializer: 
  4029.  
  4030. o When it is used in an argument declaration 
  4031.  
  4032. o In the declaration of a return type for a function call 
  4033.  
  4034. o In the declaration of class memberwithin its class declaration 
  4035.  
  4036. o When the extern specifier is explicitly used. 
  4037.  
  4038. You cannot have references to references, references to bit fields, arrays of 
  4039. references, or pointers to references. 
  4040.  
  4041.  
  4042. ΓòÉΓòÉΓòÉ 5.13.6. Aggregate Initialization ΓòÉΓòÉΓòÉ
  4043.  
  4044. An aggregate is an array or an object of a class with no private or protected 
  4045. members, no constructors, no base classes, and no virtual functions. 
  4046.  
  4047. For aggregate classes, the set of initial expressions must be enclosed in { } 
  4048. (braces) unless the initializer is a string literal. Individual expressions 
  4049. must be separated by commas. Groups of expressions can be enclosed in braces 
  4050. and separated by commas. 
  4051.  
  4052. The number of initializers must be less than or equal to the number of objects 
  4053. being initialized. If the set of initial expressions contains fewer 
  4054. initializers than the aggregate contains subscripts or members, the trailing 
  4055. members are initialized to zero of the appropriate type. The order of 
  4056. initializers must match the order of the aggregate's subscripts or members. If 
  4057. the aggregate contains subaggregates, the order of subaggregate initialization 
  4058. must match the subaggregate member or subscript order. 
  4059.  
  4060. You can initialize classes in external, static, and automatic definitions. The 
  4061. initializer contains an = (equal sign) followed by a brace-enclosed, 
  4062. comma-separated list of values. You do not need to initialize all members of a 
  4063. class. 
  4064.  
  4065. The following definition shows a completely initialized structure: 
  4066.  
  4067. struct address
  4068. {
  4069.       int street_no;
  4070.       char *street_name;
  4071.       char *city;
  4072.       char *prov;
  4073.       char *postal_code;
  4074. };
  4075. static struct address perm_address =
  4076.       { 9876, "Goto St.", "Cville", "Ontario", "X9X
  4077. 1A1"};
  4078.  
  4079. The values of perm_address are: 
  4080.  
  4081. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  4082. Γöé Member                         Γöé Value                         Γöé
  4083. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4084. Γöé perm_address.street_no         Γöé 9876                          Γöé
  4085. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4086. Γöé perm_address.street_name       Γöé address of string "Goto St."  Γöé
  4087. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4088. Γöé perm_address.city              Γöé address of string "Cville"    Γöé
  4089. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4090. Γöé perm_address.prov              Γöé address of string "Ontario"   Γöé
  4091. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  4092. Γöé perm_address.postal_code       Γöé address of string "X9X 1A1"   Γöé
  4093. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  4094.  
  4095. You can only initialize the first member of a union. 
  4096.  
  4097. The following example shows how to initialize the first union member birthday 
  4098. of the union variable people: 
  4099.  
  4100. union
  4101. {
  4102.       char birthday[9];
  4103.       int age;
  4104.       float weight;
  4105. }      people = {"23/07/57"};
  4106.  
  4107.  
  4108. ΓòÉΓòÉΓòÉ 5.14. Related Information ΓòÉΓòÉΓòÉ
  4109.  
  4110. "Expressions and Operators" 
  4111.  
  4112. "C++ Classes" 
  4113.  
  4114.  
  4115. ΓòÉΓòÉΓòÉ 6. Chapter 6. Standard Conversions ΓòÉΓòÉΓòÉ
  4116.  
  4117. There are two kinds of type conversions: standard conversions and user-defined 
  4118. conversions. This chapter describes standard conversions. User-defined 
  4119. conversion are discussed in  "User-Defined Conversions" Explicit type 
  4120. conversions are discussed under "Cast Expressions" 
  4121.  
  4122. This chapter begins with a discussion of integral promotions. It then describes 
  4123. the following implicit standard type conversions : 
  4124.  
  4125. o Signed integer conversions 
  4126. o Unsigned integer conversions 
  4127. o Floating-point conversions 
  4128. o Pointer conversions 
  4129. o Reference conversions 
  4130. o Pointer to member conversions. 
  4131.  
  4132. The chapter concludes with a discussion of arithmetic conversions. Arithmetic 
  4133. conversions are used for matching operands of arithmetic operators. 
  4134.  
  4135. The implementation of type conversions is described in "Type Conversions" in 
  4136. "Appendix C. 
  4137.  
  4138. You can also return to the table of contents 
  4139.  
  4140.  
  4141. ΓòÉΓòÉΓòÉ 6.1. Integral Promotions ΓòÉΓòÉΓòÉ
  4142.  
  4143. Certain fundamental types can be used wherever an integer may be used. The 
  4144. fundamental types that can be converted through integral promotion are: 
  4145.  
  4146. o char 
  4147. o short int 
  4148. o enumerators 
  4149. o objects of enumeration type 
  4150. o bit-fields (both signed and unsigned). 
  4151.  
  4152. In integral promotions the value is converted to an int, or an unsigned int if 
  4153. the value cannot be represented by an int. 
  4154.  
  4155.  
  4156. ΓòÉΓòÉΓòÉ 6.2. Type Conversions ΓòÉΓòÉΓòÉ
  4157.  
  4158. Many C++ language operators cause implicit type conversions, which change the 
  4159. type of a value. When you add values having different data types, both values 
  4160. are first converted to the same type. For example, when a short int value and 
  4161. an int value are added together, the short int value is converted to the int 
  4162. type. 
  4163.  
  4164. For example, implicit type conversions can occur when: 
  4165.  
  4166. o An operand is prepared for an arithmetic or logical operation. 
  4167.  
  4168. o An assignment is made to an lvalue that has a different type than the 
  4169.   assigned value. 
  4170.  
  4171. o A function is provided a value that has a different type than the parameter. 
  4172.  
  4173. o The value specified in the return  statement of a function has a different 
  4174.   type than the defined return type for the function. 
  4175.  
  4176. You can perform explicit type conversions using the cast operator or the 
  4177. function style cast. For more details on explicit type conversions, see "Cast 
  4178. Expressions" 
  4179.  
  4180.  
  4181. ΓòÉΓòÉΓòÉ 6.2.1. Signed Integer Conversions ΓòÉΓòÉΓòÉ
  4182.  
  4183. C++ converts a signed integer to a shorter integer by truncating the high-order 
  4184. bits and converting the variable to a longer signed integer by sign-extension. 
  4185. Conversion of signed integers to floating-point values takes place without loss 
  4186. of information except when an int value is converted to a float, in which case 
  4187. some precision may be lost. To convert a signed integer to an unsigned integer, 
  4188. the signedinteger is converted to the size of the unsigned integer and the 
  4189. result is interpreted as an unsigned value. 
  4190.  
  4191.  
  4192. ΓòÉΓòÉΓòÉ 6.2.2. Unsigned Integer Conversions ΓòÉΓòÉΓòÉ
  4193.  
  4194. An unsigned integer is converted to a shorter unsigned or signed integer by 
  4195. truncating the high-order bit. An unsigned integer is converted to a longer 
  4196. unsigned or signed integer by zero-extending. Zero-extending pads the longer 
  4197. integer's leftmost bits with binary zeros. 
  4198.  
  4199. When an unsigned integer is converted to a signed integer of the same size, no 
  4200. change in the bit pattern occurs. However, the value changes if the sign bit is 
  4201. set. 
  4202.  
  4203.  
  4204. ΓòÉΓòÉΓòÉ 6.2.3. Floating Point Conversions ΓòÉΓòÉΓòÉ
  4205.  
  4206. A float value converted to a double undergoes no change in value. A double 
  4207. converted to a float is represented exactly, if possible. If C++ cannot exactly 
  4208. represent the double value as a float, the value loses precision. If the value 
  4209. is too large to fit into a float, the result is undefined. 
  4210.  
  4211. When a floating-point value is converted to an integer value, the decimal 
  4212. fraction portion of the floating-point value is discarded in the conversion. If 
  4213. the result is too large for the given integer type, the result of the 
  4214. conversion is undefined. 
  4215.  
  4216.  
  4217. ΓòÉΓòÉΓòÉ 6.2.4. Pointer Conversions ΓòÉΓòÉΓòÉ
  4218.  
  4219. Pointer conversions are performed when pointers are used, including pointer 
  4220. assignment, initialization, and comparison. 
  4221.  
  4222. A constant expression that evaluates to zero can be converted to a pointer. 
  4223. This pointer will be a null pointer (pointer with a zero value) and is 
  4224. guaranteed not to point to any object. 
  4225.  
  4226. Any pointer to an object that is not a const or volatile object can be 
  4227. converted to a void*. You can also convert any pointer to a function to a 
  4228. void*, provided that a void* has sufficient bits to hold it. 
  4229.  
  4230. You can convert an expression with type array of some type to a pointer to the 
  4231. initial element of the array except when the expression is used as the operand 
  4232. of the & (address) operator or the sizeof operator. 
  4233.  
  4234. You can convert an expression with a type of function returning T to a pointer 
  4235. to a function returning T except when the expression is used as the operand of 
  4236. the & (address) operator, the () (function call) operator, or the sizeof 
  4237. operator. 
  4238.  
  4239. You can convert a pointer to a class A to a pointer to an accessible base class 
  4240. B of that class, as long as the conversion is not ambiguous. The conversion is 
  4241. ambiguous if the expression for the accessible base class can refer to more 
  4242. than one distinct class. The resulting value points to the base class subobject 
  4243. of the derived class object. A null pointer (pointer with a zero value) is 
  4244. converted into itself. 
  4245.  
  4246. Note:  You cannot convert a pointer to a class into a pointer to its base class 
  4247. if the base class is a virtual base class of the derived class. 
  4248.  
  4249. You can convert an integer value to an address offset. 
  4250.  
  4251. For more details on pointer conversions, see "Pointer Arithmetic" 
  4252.  
  4253.  
  4254. ΓòÉΓòÉΓòÉ 6.2.5. Reference Conversions ΓòÉΓòÉΓòÉ
  4255.  
  4256. A reference conversion can be performed wherever a reference initialization 
  4257. occurs, including reference initialization done in argument passing and 
  4258. function return values. A reference to a class can be converted to a reference 
  4259. to an accessible base class of that class as long as the conversion is not 
  4260. ambiguous. The result of the conversion is a reference to the base class 
  4261. subobject of the derived class object. 
  4262.  
  4263. Reference conversion is allowed if the corresponding pointer conversion is 
  4264. allowed. 
  4265.  
  4266.  
  4267. ΓòÉΓòÉΓòÉ 6.2.6. Pointer to Member Conversions ΓòÉΓòÉΓòÉ
  4268.  
  4269.  Pointer to member conversion can occur when pointers to members are 
  4270. initialized, assigned, or compared. 
  4271.  
  4272. A constant expression that evaluates to zero is converted to a distinct pointer 
  4273. to a member. 
  4274.  
  4275. A pointer to a member of a base class can be converted to a pointer to a member 
  4276. of a derived class if the following conditions are true: 
  4277.  
  4278. o The conversion is not ambiguous. The conversion is ambiguous if there are 
  4279.   multiple instances of the base class in the derived class. 
  4280.  
  4281. o The reverse conversion from a pointer to the derived class to a pointer to 
  4282.   the base class is accessible. 
  4283.  
  4284. Note:  A pointer to a member is not the same as a pointer to an object or a 
  4285. pointer to a function. 
  4286.  
  4287.  
  4288. ΓòÉΓòÉΓòÉ 6.2.7. Other Conversions ΓòÉΓòÉΓòÉ
  4289.  
  4290. By definition the void type has no value. Therefore, it cannot be converted to 
  4291. any other type, and no other value can be converted to void by assignment. 
  4292. However, a value can be explicitly cast to void. 
  4293.  
  4294. You can convert from an enum  to any integral type but not from an integral 
  4295. type to an enum. 
  4296.  
  4297. No conversions between structure or union types are allowed. There are no 
  4298. standard conversions between class types. 
  4299.  
  4300.  
  4301. ΓòÉΓòÉΓòÉ 6.3. Arithmetic Conversions ΓòÉΓòÉΓòÉ
  4302.  
  4303. Most C++ operators perform type conversions to bring the operands of an 
  4304. expression to a common type or to extend short values to the integer size used 
  4305. in RISC System/6000 operations. The conversions depend on the specific operator 
  4306. and the type of the operand or operands. However, many operators perform 
  4307. similar conversions on operands of integer and floating-point types. These 
  4308. standard conversions are known as the arithmetic conversions because they apply 
  4309. to the types of values ordinarily used in arithmetic. 
  4310.  
  4311. The implementation of type conversions on arithmetic types is described in 
  4312. "Type Conversions" in "Appendix C. 
  4313.  
  4314. Arithmetic conversion follows this order of precedence: 
  4315.  
  4316.  1. If one operand has long double type, the other operand is converted to long 
  4317.     double type. 
  4318.  
  4319.  2. If one operand has double type, the other operand is converted to double. 
  4320.  
  4321.  3. If one operand has float type, the other operand is converted to float. 
  4322.  
  4323.  4. If one operand has unsigned long int type, the other operand is converted 
  4324.     to unsigned long int. 
  4325.  
  4326.  5. If one operand has unsigned int type and the other operand has long int 
  4327.     type and the value of the unsigned int can be represented in a long int, 
  4328.     the operand with unsigned int type is converted to long int. 
  4329.  
  4330.  6. If one operand has unsigned int type and the other operand has long int 
  4331.     type and the value of the unsigned int cannot be represented in a long int, 
  4332.     both operands are converted to unsigned long int. 
  4333.  
  4334.  7. If one operand has long int type, the other operand is converted to long 
  4335.     int. 
  4336.  
  4337.  8. If one operand has unsigned int type, the other operand is converted to 
  4338.     unsigned int. 
  4339.  
  4340.  9. Lastly, both operands are converted to have int type and the result is of 
  4341.     type int. 
  4342.  
  4343.  
  4344. ΓòÉΓòÉΓòÉ 6.4. Related Information ΓòÉΓòÉΓòÉ
  4345.  
  4346. "Expressions and Operators" 
  4347.  
  4348. "Functions" 
  4349.  
  4350.  
  4351. ΓòÉΓòÉΓòÉ 7. Chapter 7. C++ Statements ΓòÉΓòÉΓòÉ
  4352.  
  4353. This chapter describes statement syntax and the following C++ language 
  4354. statements: 
  4355.  
  4356. o Statement  grammar 
  4357. o Labeled statements 
  4358. o Compound statements 
  4359. o Expression and declaration statements 
  4360. o Selection statements 
  4361. o Iteration statements 
  4362. o Jump statements 
  4363. o Null statement. 
  4364.  
  4365. You can also return to the table of contents 
  4366.  
  4367.  
  4368. ΓòÉΓòÉΓòÉ 7.1. Statement Grammar ΓòÉΓòÉΓòÉ
  4369.  
  4370. The syntax for a statement is: 
  4371.  
  4372.       statement:
  4373.             labeled-statement
  4374.             expression-statement
  4375.             compound-statement
  4376.             selection-statement
  4377.             iteration-statement
  4378.             jump-statement
  4379.             declaration-statement
  4380.             try-block
  4381.  
  4382. The syntax and description for a try-block are described in "Chapter 15. 
  4383. Exception Handling" beginning on page -- Reference CPLRexcHardCopy not found 
  4384. --. 
  4385.  
  4386.  
  4387. ΓòÉΓòÉΓòÉ 7.2. Labeled Statements ΓòÉΓòÉΓòÉ
  4388.  
  4389. A label is an identifier that allows your program to transfer control to other 
  4390. statements within the same function. A label is the only identifier that has 
  4391. function scope. Labels cannot be redeclared within a function. Control is 
  4392. transferred to the statement following the label by means of the goto  or 
  4393. switch  statements. You can use a label in a goto statement before the label 
  4394. has been defined. 
  4395.  
  4396. The syntax is: 
  4397.  
  4398.       labeled-statement:
  4399.             identifier : statement
  4400.             case constant-expression
  4401. : statement
  4402.             default :
  4403. statement
  4404.  
  4405. The case and default labels are restricted to use within switch  statements. 
  4406.  
  4407. For further details on function scope, see "Function Scope" 
  4408.  
  4409.  
  4410. ΓòÉΓòÉΓòÉ 7.3. Compound Statements ΓòÉΓòÉΓòÉ
  4411.  
  4412. A statement can be either a single statement or a compound statement. A 
  4413. compound statementor block lets you group any number of data definitions, 
  4414. declarations, and statements into one statement. All definitions, declarations, 
  4415. and statements enclosed within a single set of braces are treated as a single 
  4416. statement. You can place a compound statement wherever a single statement is 
  4417. allowed. 
  4418.  
  4419. The syntax is: 
  4420.  
  4421.       compound-statement:
  4422.             {[statement-list]
  4423. }
  4424.       statement-list:
  4425.             statement
  4426.             statement-list statement
  4427.  
  4428. Definitions and declarations can occur anywhere a statement can occur. 
  4429.  
  4430. If you redefine a data object inside a nested block, the inner object hides the 
  4431. outer object while the inner block is processed. Defining several variables in 
  4432. different scopes with the same name can make a program difficult to understand 
  4433. and maintain. You should avoid redefinitions of identifiers within nested 
  4434. blocks. 
  4435.  
  4436. If a data object is usable within a block and its identifier is not redefined, 
  4437. all nested blocks can use that data object. 
  4438.  
  4439.  
  4440. ΓòÉΓòÉΓòÉ 7.3.1. Initialization within Compound Statements ΓòÉΓòÉΓòÉ
  4441.  
  4442. Initialization of an auto  or register  variable occurs each time the statement 
  4443. is executed. Initialization of static  variables in a block occurs the first 
  4444. time the statement containing the initialization is executed. You cannot 
  4445. initialize an extern  variable within a block. 
  4446.  
  4447. Note:  Unlike ANSI C, in C++ it is an error to jump over a declaration or 
  4448. definition containing an initializer. 
  4449.  
  4450. The following code produces an error in C++ : 
  4451.  
  4452. goto skiplabel;
  4453. int i=3      // error, jumped over decl. of i with initializer
  4454. skiplabel: i=4;
  4455.  
  4456. The following example shows how the values of data objects change in nested 
  4457. blocks: 
  4458.  
  4459. 1 #include <iostream.h>
  4460. 2
  4461. 3 void main()
  4462. 4 {
  4463. 5   int x = 1;    // initialize x to 1
  4464. 6   int y = 3;
  4465. 7
  4466. 8   if (y > 0)
  4467. 9   {
  4468. 10      int x = 2;   // initialize x to 2
  4469. 11      cout << "second x = " << x <<
  4470. endl;
  4471. 12   }
  4472. 13   cout << "first x = " << x <<
  4473. endl;
  4474. 14 }
  4475.  
  4476. The example produces the following output: 
  4477.  
  4478. second x = 2
  4479. first x = 1
  4480.  
  4481. Two variables named x are defined in main(). The definition of x on line 5 
  4482. retains storage throughout the execution of main(). Because the definition of x 
  4483. on line 10 occurs within a nested block, line 11 recognizes x as the variable 
  4484. defined on line 10. Line 13 is not part of the nested block. Thus, line 13 
  4485. recognizes x as the variable defined on line 5. 
  4486.  
  4487. When control exits from a block, all objects with destructors that are defined 
  4488. in the block are destroyed. 
  4489.  
  4490.  
  4491. ΓòÉΓòÉΓòÉ 7.4. Expression and Declaration Statements ΓòÉΓòÉΓòÉ
  4492.  
  4493.  
  4494. ΓòÉΓòÉΓòÉ 7.4.1. Expression Statement ΓòÉΓòÉΓòÉ
  4495.  
  4496. An expression statement evaluates the given expression. Expressions are 
  4497. described in "Expressions and Operators" 
  4498.  
  4499. The syntax is: 
  4500.  
  4501.       expression-statement:
  4502.             [expression]
  4503. ;
  4504.  
  4505. Typically, an expression statement assigns the value of an expression to a 
  4506. variable or calls a function. For example: 
  4507.  
  4508. cout << "Account number:" << endl;      //
  4509. a call to cout
  4510. marks = dollars * exch_rate;            // an assignment
  4511. to marks
  4512. (difference < 0) ? ++losses : ++gain;   // a conditional
  4513. increment
  4514. switches = flags | BIT_MASK;            // an assignment
  4515. to
  4516.                                         // switches
  4517.  
  4518.  
  4519. ΓòÉΓòÉΓòÉ 7.4.2. Declaration Statement ΓòÉΓòÉΓòÉ
  4520.  
  4521. A declaration statement introduces a new identifier into a block. 
  4522.  
  4523. The syntax is: 
  4524.  
  4525.       declaration-statement:
  4526.             declaration
  4527.  
  4528. When an identifier introduced by a declaration has previously been declared in 
  4529. an outer block, the outer declaration remains hidden in the inner block. In the 
  4530. following example, i has the value 100 before and after the for statement; the 
  4531. i within the for statement does not affect the i outside it. 
  4532.  
  4533. #include <iostream.h>
  4534. void main()
  4535. {
  4536.    int i=100;
  4537.     cout << i << endl;
  4538.     for ( int a=0 ; a<3 ; a++ )
  4539.     {
  4540.        int i;
  4541.         i = a + 5;
  4542.         cout << i << endl;
  4543.     }
  4544.    cout << i << endl;
  4545. }
  4546.  
  4547. This program generates the following output: 
  4548.  
  4549. 100
  4550. 5
  4551. 6
  4552. 7
  4553. 100
  4554.  
  4555. auto and register  variables are initialized each time the declaration 
  4556. statement containing them is executed. Local variables declared in a block are 
  4557. destroyed on exit from that block. auto variables defined in a loop are 
  4558. destroyed at each iteration. For example: 
  4559.  
  4560. class A { /* ... */ };
  4561. for (int a=0; a<3; a++)
  4562.       {
  4563.       A myobj;
  4564.       }
  4565.  
  4566. In this example, myobj is an auto variable because it has a block scope 
  4567. definition.  Because of this, myobj is created and destroyed at each iteration 
  4568. of the loop. 
  4569.  
  4570. As long as you do not jump past a declaration with an initializer you can 
  4571. transfer into a block. If the declaration is in an inner block that is not 
  4572. entered or if the variable has already been initialized before the jump, this 
  4573. restriction does not apply. For example: 
  4574.  
  4575. class X { /* ... */ };
  4576. void func()
  4577. {
  4578.    goto skip1;    // error - skipped over p and myobject
  4579. init.
  4580. noskip:
  4581.     X myobject(1);
  4582.     int p=3;
  4583.     return;
  4584. skip1:
  4585.     goto noskip;
  4586.    X yourobject(myobject);
  4587. }
  4588.  
  4589. A static  local object is initialized only once, when control passes through 
  4590. its declaration for the first time. A static variable initialized with an 
  4591. expression other than a constant expression is initialized to 0 before its 
  4592. block is first entered. 
  4593.  
  4594. The destructor for a static local object is called only if the object was 
  4595. constructed. The destructor must be called before or as part of the atexit() 
  4596. function. The atexit() function allows you to specify a function to which 
  4597. control can be passed at program termination. It is defined in the standard C 
  4598. header file <stdlib.h>. 
  4599.  
  4600. For further details, see "Constructors and Destructors". 
  4601.  
  4602.  
  4603. ΓòÉΓòÉΓòÉ 7.4.3. Ambiguity Resolution ΓòÉΓòÉΓòÉ
  4604.  
  4605. There are situations where a statement can be parsed as both a declaration and 
  4606. as an expression. Specifically, a function declaration can look like a function 
  4607. call in certain cases. The compiler resolves these ambiguities by applying the 
  4608. following rules: 
  4609.  
  4610. o If the statement can be parsed as a declaration but there are no 
  4611.   decl-specifiers in the declaration and the statement is inside the body of a 
  4612.   function, the statement is assumed to be an expression.  The following 
  4613.   statement, for example is a declaration at file scope of the function f() 
  4614.   that returns type int.  There is no decl-specifier and int is the default, 
  4615.   but at function scope this is a call to f(): 
  4616.  
  4617.           f();
  4618.  
  4619. o If the statement can be parsed as a declaration up to the end of the first 
  4620.   declarator, it is assumed to be a declaration even if subsequent parsing 
  4621.   reveals that the statement is only valid as an expression. The following 
  4622.   statement, for example, looks like a declaration with a syntax error at + +. 
  4623.   Because it is a valid declaration for the first declarator (x), this 
  4624.   statement is parsed as a declaration even though it could be parsed as a 
  4625.   valid expression: 
  4626.  
  4627.           int (x), y++;
  4628.  
  4629. o In every other case, if the statement can be parsed as a declaration, it is 
  4630.   assumed to be a declaration.  The following statement, for example, is a 
  4631.   declaration of x with redundant parentheses around the declarator, not a 
  4632.   function-style cast of x to type int: 
  4633.  
  4634.       int (x);
  4635.  
  4636. In some cases the C++ grammar does not disambiguate between expression 
  4637. statements and declaration statements. The ambiguity arises when an expression 
  4638. statement has a function-style cast as its leftmost subexpression. In some 
  4639. cases, the ambiguity can be resolved by examining the entire statement 
  4640. containing the expression or declaration. If the statement can be interpreted 
  4641. both as a declaration and as an expression, the statement is interpreted as a 
  4642. declaration statement. 
  4643.  
  4644. The following expressions disambiguate into expression statements because the 
  4645. ambiguous subexpression is followed by an assignment or an operator. T in the 
  4646. expressions can be any type specifier: 
  4647.  
  4648. T(i)++;
  4649. T(i,3)<<d;
  4650. T(i)->l=24;
  4651.  
  4652. In the following examples, the ambiguity cannot be resolved so the statements 
  4653. are interpreted as declarations. T is any type specifier: 
  4654.  
  4655. T(*i)(int);
  4656. T(j)[5];
  4657. T(*k) (float(3));
  4658.  
  4659. The last statement above causes a compile-time error because you cannot 
  4660. initialize a pointer with a float value. 
  4661.  
  4662. Any statement whose ambiguity is not resolved by the above rules is by default 
  4663. a declaration statement. All of the following are declaration statements: 
  4664.  
  4665. T(a);
  4666. T(*b)();
  4667. T(c)=23;
  4668. T(d),e,f,g=0;
  4669. T(h)(e,3);
  4670.  
  4671. The ambiguity is resolved only on a syntactic level. The disambiguation does 
  4672. not use the meaning of the names, except to assess whether or not they are type 
  4673. names. 
  4674.  
  4675. Another C++ ambiguity between expression statements and declaration statements 
  4676. is resolved by requiring a type name for function declarations within a block: 
  4677.  
  4678. a();         // declaration of a function returning int
  4679. and
  4680.              // taking no arguments
  4681. void func()
  4682. {
  4683.    int a();  // declaration of a function
  4684.    int b;    // declaration of a variable
  4685.    a();      // expression-statement calling function a()
  4686.    b;        // expression-statement referring to a
  4687. variable
  4688. }
  4689.  
  4690. The last statement above does not produce any action. It is semantically 
  4691. equivalent to a null statement. However it is a valid C++ statement. 
  4692.  
  4693.  
  4694. ΓòÉΓòÉΓòÉ 7.5. Selection Statements ΓòÉΓòÉΓòÉ
  4695.  
  4696. A selection statement is used to control program flow. 
  4697.  
  4698. The syntax is: 
  4699.  
  4700.       selection-statement:
  4701.             if (
  4702. expression
  4703. ) statement
  4704.             if (
  4705. expression
  4706. ) statement else
  4707. statement
  4708.             switch (
  4709. expression ) statement
  4710.  
  4711. Each selection statement defines a local scope. A variable defined in the 
  4712. statement passes out of scope once control passes out of the selection 
  4713. statement. For example: 
  4714.  
  4715. if (tries <= max)
  4716.     for (int i = tries ; ; ) { /* ... */ }
  4717.  
  4718. is equivalent to: 
  4719.  
  4720. if (tries <= max)
  4721. {
  4722.    for (int i = tries ; ; ) { /* ... */ }
  4723. }
  4724.  
  4725. In either of the above, i passes out of scope after the if statement. 
  4726.  
  4727.  
  4728. ΓòÉΓòÉΓòÉ 7.5.1. if ΓòÉΓòÉΓòÉ
  4729.  
  4730. An if statement allows you to process a statement on the condition that the 
  4731. specified test expression evaluates to a nonzero value. The expression must 
  4732. evaluate to an integral type, or a type that can be converted to an integral 
  4733. type. You can optionally specify an else clause for the if statement. If the 
  4734. test expression evaluates to 0 (zero), and an else clause exists, the statement 
  4735. in the else clause is performed. If the test expression evaluates to a nonzero 
  4736. value, the statement following the expression is performed and the else clause 
  4737. is ignored. 
  4738.  
  4739. When if statements are nested and else clauses are present, a given else is 
  4740. associated with the closest preceding if statement within the same block. 
  4741.  
  4742. The following example causes grade to receive the value A if the value of score 
  4743. is greater than or equal to 90. 
  4744.  
  4745. if (score >= 90)
  4746.   grade = 'A';
  4747.  
  4748. The following example prints "Number is positive" to standard output if the 
  4749. value of score is greater or equal to 0 (zero). Otherwise, the example prints 
  4750. "Number is negative". 
  4751.  
  4752. if (number >= 0)
  4753.   cout << "Number is positive" << endl;
  4754. else
  4755.   cout << "Number is negative" << endl;
  4756.  
  4757. The following example shows a nested if statement: 
  4758.  
  4759. if (paygrade == 7)
  4760.   if (level >= 0 && level <=8)
  4761.     salary *= 1.05;
  4762.   else
  4763.     salary *= 1.04;
  4764. else
  4765.  salary *= 1.06;
  4766. cout << "Salary is " << salary <<
  4767. endl;
  4768.  
  4769. The following example shows a nested if statement that does not have an else 
  4770. clause. Because an else clause always associates with the closest if statement, 
  4771. you may need to use braces to force a particular else clause to associate with 
  4772. the correct if statement. In this example, omitting the braces would cause the 
  4773. else clause to associate with the nested if statement. 
  4774.  
  4775. if (gallons > 0)
  4776. {
  4777.  if (miles > gallons)
  4778.     mpg = miles/gallons;
  4779. }
  4780. else
  4781.   mpg = 0;
  4782.  
  4783. The following example shows an if statement nested within an else clause. This 
  4784. example tests multiple conditions. The tests are made in order of their 
  4785. appearance. If one test evaluates to a nonzero value, an action statement runs 
  4786. and the entire if statement ends. 
  4787.  
  4788. if (value > 0)
  4789.    ++increase;
  4790. else if (value == 0)
  4791.    ++break_even;
  4792. else
  4793.    ++decrease;
  4794.  
  4795.  
  4796. ΓòÉΓòÉΓòÉ 7.5.2. switch ΓòÉΓòÉΓòÉ
  4797.  
  4798. A switch statement enables you to transfer control to different statements 
  4799. within the switch body depending on the value of the switch expression. The 
  4800. body of the switch statement contains case labels to which execution is 
  4801. transferred if the switch expression evaluates to the given value. The switch 
  4802. expression must evaluate to an integral type. If none of the values matches and 
  4803. there is a default label, control is transferred to the default label. If none 
  4804. of the values matches and there is no default label, control is transferred to 
  4805. the first statement immediately following the switch. The value of each case 
  4806. expression must represent a different value. Only one default label can occur 
  4807. in each switch statement. 
  4808.  
  4809. The switch statement passes control to the statement following one of the case 
  4810. labels or to the statement following the switch body. The value of the 
  4811. expression that precedes the switch body determines the statement that receives 
  4812. control. This expression is called the switch expression. 
  4813.  
  4814. If control passes to a statement in the switch body, control does not pass from 
  4815. the switch body to the statement directly following the switch body until a 
  4816. break statement is encountered or until the last statement in the switch body 
  4817. is processed. 
  4818.  
  4819. If necessary, a conversion to integer is performed on the controlling 
  4820. expression, and all expressions in the case statements are converted to the 
  4821. same type as the controlling expression. 
  4822.  
  4823. You can have declarations in the body of the switch statement. You cannot 
  4824. transfer control over a declaration containing an initializer, unless the 
  4825. declaration is located in an inner block that is completely bypassed by the 
  4826. transfer of control. All declarations within the body of the switch statement 
  4827. that contain initializers must be contained in an inner block. 
  4828.  
  4829. The following switch statement contains several case clauses and one default 
  4830. clause. Each clause contains a function call and a break statement. The break 
  4831. statements prevent control from passing down through each statement in the 
  4832. switch body. For instance, if the switch expression evaluates to '/', the 
  4833. switch statement calls the function divide. Control then passes to the 
  4834. statement following the switch body. 
  4835.  
  4836. char key;
  4837. cout << "Enter an arithmetic operator\n";
  4838. cin >> key
  4839. switch (key)
  4840. {
  4841.  case '+':
  4842.     add();
  4843.     break;
  4844.   case '-':
  4845.     subtract();
  4846.     break;
  4847.   case '*':
  4848.     multiply();
  4849.     break;
  4850.   case '/':
  4851.     divide();
  4852.     break;
  4853.   default:
  4854.     cout << "The key you pressed is not valid\n";
  4855.     break;
  4856. } // end of switch body
  4857.  
  4858. If the switch expression matches a case expression, the statements following 
  4859. the case expression are processed until a break statement is encountered or 
  4860. until the end of the switch body is reached. In the following example, break 
  4861. statements are not present. If the value of text is equal to 'A', all three 
  4862. counters are incremented. If the value of text is equal to 'a', lettera and 
  4863. total are increased. If text is not equal to 'A' or 'a', only total is 
  4864. increased. 
  4865.  
  4866. int capa=0, lettera=0, total=0, i;
  4867. char text[100];
  4868. for (i=0; i<sizeof(text); i++)
  4869.   {
  4870.  // Switch statement with no break statements
  4871.     switch (text[i])
  4872.     {
  4873.      case 'A':     // No break statement - 'A' increments
  4874. all of
  4875.         capa++;     // capa, lettera and total
  4876.       case 'a':     // No break statement - 'a' increments
  4877. both
  4878.         lettera++;  // lettera and total
  4879.       default:
  4880.       total++;
  4881.     }
  4882.  }
  4883.  
  4884. The following switch statement executes the same statements for more than one 
  4885. case label: 
  4886.  
  4887. int month;
  4888. switch (month)
  4889. {
  4890.  case 12:
  4891.   case 1:
  4892.   case 2:
  4893.     cout << "month " << month <<
  4894. " is a winter month" << endl;
  4895.     break;
  4896.   case 3:
  4897.   case 4:
  4898.   case 5:
  4899.     cout << "month " << month <<
  4900. " is a spring month" << endl;
  4901.     break;
  4902.   case 6:
  4903.   case 7:
  4904.   case 8:
  4905.     cout << "month " << month <<
  4906. " is a summer month" << endl;
  4907.     break;
  4908.   case 9:
  4909.   case 10:
  4910.   case 11:
  4911.     cout << "month " << month <<
  4912. " is a fall month" << endl;
  4913.     break;
  4914.  
  4915.   default:
  4916.     cout << "not a valid month" << endl;
  4917.     break;
  4918. } // end of switch body
  4919.  
  4920. If the expression month has the value 3, control passes to the statement: 
  4921.  
  4922. cout << "month " << month << "
  4923. is a spring month" << endl;
  4924.  
  4925. The break statement then passes control to the statement following the switch 
  4926. body. For more details, see "break" 
  4927.  
  4928.  
  4929. ΓòÉΓòÉΓòÉ 7.6. Iteration Statements ΓòÉΓòÉΓòÉ
  4930.  
  4931. An iteration statement specifies that the statement or block following it is to 
  4932. be repeated until the condition is met. 
  4933.  
  4934. The syntax is: 
  4935.  
  4936.       iteration-statement:
  4937.             while (
  4938. expression ) statement
  4939.             do statement
  4940. while
  4941. ( expression )
  4942. ;
  4943.             for ( for-init-statement
  4944. [expression]
  4945. ;
  4946.                          [expression]
  4947. ) statement
  4948.  
  4949.       for-init-statement:
  4950.             expression-statement
  4951.             declaration-statement
  4952.  
  4953. The statement of an iteration-statement defines a local scope. A variable 
  4954. defined in the statement passes out of scope once control passes out of the 
  4955. iteration statement. For example, 
  4956.  
  4957. while (tries <= max)
  4958.     for (int i = tries ; ; ) { /* ... */ }
  4959.  
  4960. is equivalent to: 
  4961.  
  4962. while (tries <= max)
  4963. {
  4964.    for (int i = tries ; ; ) { /* ... */ }
  4965. }
  4966.  
  4967. In either of the above, i passes out of scope after the while statement. 
  4968.  
  4969.  
  4970. ΓòÉΓòÉΓòÉ 7.6.1. while ΓòÉΓòÉΓòÉ
  4971.  
  4972. A while statement enables you to repeatedly run the body of a loop until the 
  4973. controlling expression evaluates to zero. 
  4974.  
  4975. The expression is evaluated to determine whether or not the body of the loop is 
  4976. processed. The expression must be convertible to a scalar type. If the 
  4977. expression evaluates to zero, the body of the loop never runs. If the 
  4978. expression evaluates to nonzero, the body is processed. After the body has run, 
  4979. control passes back to the expression. Further processing depends on the value 
  4980. of the condition. 
  4981.  
  4982. A break, return, or goto statement can cause the processing of a while 
  4983. statement to end, even when the condition does not evaluate to 0. 
  4984.  
  4985. In the following program, item[index] triples each time the value of the 
  4986. expression ++index is less than MAX_INDEX. When index evaluates to MAX_INDEX, 
  4987. the while statement ends. 
  4988.  
  4989. #include <iostream.h>
  4990. void main()
  4991.  {
  4992.   int item[5] = { 12, 55, 62, 85, 102 };
  4993.    int index = 0;
  4994.    const MAX_INDEX = 5;
  4995.    while (index < MAX_INDEX)
  4996.    {
  4997.     item[index] *= 3;
  4998.      cout << "item " << index  <<
  4999. " = " << item[index] << endl;
  5000.      ++index;
  5001.    }
  5002. }
  5003.  
  5004. For more details, see "break" , "continue" , "return" , and "goto" 
  5005.  
  5006.  
  5007. ΓòÉΓòÉΓòÉ 7.6.2. do ΓòÉΓòÉΓòÉ
  5008.  
  5009. A do statement repeatedly executes a statement until a test expression 
  5010. evaluates to 0. Because of this order of processing, the statement is processed 
  5011. at least once. 
  5012.  
  5013. The body of the loop is run before the controlling while clause is evaluated. 
  5014. Further processing of the do statement depends on the value of the while 
  5015. clause. If the while clause does not evaluate to 0, the statement runs again. 
  5016. Otherwise, processing of the statement ends. The controlling expression must 
  5017. evaluate to a scalar type. 
  5018.  
  5019. A break, return, goto, or continue statement can cause the processing of a do 
  5020. statement to end, even when the while clause does not evaluate to 0. 
  5021.  
  5022. The following example prompts the user to enter a 1. If the user does, the do 
  5023. statement ends execution. If the user does not, the statement displays another 
  5024. prompt. The example contains error-checking code to verify that the user 
  5025. entered an integer value and to clear the input stream if an error occurs. 
  5026.  
  5027. #include <iostream.h>
  5028. void main()
  5029. {
  5030.  int reply1;
  5031.   char c;
  5032.   do
  5033.   {
  5034.    cout << "Enter a 1: ";
  5035.     cin >> reply1;
  5036.      if (cin.fail())
  5037.        {
  5038.        cerr << "Not a valid number." <<
  5039. endl;
  5040.           // Clear the error flag.
  5041.         cin.clear(cin.rdstate() & ~ios::failbit);
  5042.           // Purge garbage input.
  5043.         cin.ignore(cin.rdbuf()->in_avail());
  5044.        }
  5045.   }
  5046.   while (reply1 != 1);
  5047.  }
  5048.  
  5049. For more details, see "break" , "return" , and "goto" 
  5050.  
  5051.  
  5052. ΓòÉΓòÉΓòÉ 7.6.3. for ΓòÉΓòÉΓòÉ
  5053.  
  5054. A for statement has the following syntax: 
  5055.  
  5056.       for ( for-init-statement
  5057. [expression]
  5058. ;
  5059.                    [expression]
  5060. )
  5061. statement
  5062.  
  5063. A for statement enables you to: 
  5064.  
  5065. o Evaluate a for-init-statement prior to the first iteration of the statement 
  5066.   (initialization) 
  5067.  
  5068. o Specify an expression to determine whether or not the statement should be 
  5069.   processed (controlling part) 
  5070.  
  5071. o Evaluate an expression after each iteration of the statement 
  5072.  
  5073. o Process the statement if the controlling part does not evaluate to zero. 
  5074.  
  5075. For a statement of the form: 
  5076.  
  5077. for (state1; exp2; exp3) statement
  5078.  
  5079. state1    is evaluated only before the statement is processed for the first 
  5080.           time. You can use this statement to declare and initialize a 
  5081.           variable. If you declare a variable in state1, the variable has the 
  5082.           same scope as the for statement and is not local to the for 
  5083.           statement. If you do not want to execute this statement prior to the 
  5084.           first iteration of the for statement, you can omit state1. 
  5085.  
  5086. exp2      is evaluated before each iteration of the statement. The expression 
  5087.           must evaluate to a scalar type. If it evaluates to 0 (zero), the 
  5088.           statement is not processed and control moves to the next statement 
  5089.           following the for statement. If exp2 does not evaluate to 0, the 
  5090.           statement is processed. If you omit exp2, it is as if the expression 
  5091.           had been replaced by a nonzero constant and the for statement is not 
  5092.           terminated by failure of this condition. 
  5093.  
  5094. exp3      is evaluated after each execution of the statement. You can use this 
  5095.           expression to increase, decrease, or reinitialize a variable. If you 
  5096.           do not want to evaluate an expression after each iteration of the 
  5097.           statement, you can omit this expression. 
  5098.  
  5099. A break, return, or goto statement can cause the processing of a for statement 
  5100. to end, even when the second expression does not evaluate to 0 (zero). If you 
  5101. omit exp2, you should use a break, return, or goto statement to stop the for 
  5102. statement from running. 
  5103.  
  5104. The following for statement prints the value of count 20 times. The for 
  5105. statement initially sets the value of count to 1. After each iteration of the 
  5106. statement, count is incremented. 
  5107.  
  5108. for (count = 1; count <= 20; count++)
  5109.   cout << "count = " << count <<
  5110. endl;
  5111.  
  5112. The following sequence of statements accomplishes the same task. Note the use 
  5113. of the while statement instead of the for statement. 
  5114.  
  5115. int count = 1;
  5116. while (count <= 20)
  5117. {
  5118.  cout << "count = " << count <<
  5119. endl;
  5120.   count++;
  5121. }
  5122.  
  5123. The following for statement does not contain an initialization expression. 
  5124.  
  5125. int index = 20;
  5126. for (; index > 10; --index)
  5127. {
  5128.  list[index] = var1 + var2;
  5129.   cout << "list " << index << "
  5130. = " << list[index] << endl;
  5131. }
  5132.  
  5133. The following for statement iterates until cin receives the letter e: 
  5134.  
  5135. char letter;
  5136. //      .
  5137. //      .
  5138. //      .
  5139. for (;;)
  5140. {
  5141.  cin >> letter;
  5142.   if (letter == 'e')
  5143.      break;
  5144.   cout << "You entered the letter " <<
  5145. letter << endl;
  5146. }
  5147.  
  5148. The following for statement contains compound initializations and increments. 
  5149. The first comma in the for expression is a punctuator for a declaration; that 
  5150. is, it declares and initializes two integers, i and j. The second comma, a 
  5151. comma operator, allows both i and j to be incremented at each step through the 
  5152. loop. 
  5153.  
  5154. for (int i = 0, j = 50; i < 10; ++i, j += 50)
  5155. {
  5156.  cout << "i = " << i << " and
  5157. j = " << j << endl;
  5158. }
  5159.  
  5160. The following example shows a nested for statement. The outer statement is 
  5161. performed as long as the value of row is less than 5. Each time the outer for 
  5162. statement is processed, the inner for statement sets the initial value of 
  5163. column to zero and the statement of the inner for statement is run three times. 
  5164. The inner statement is run as long as the value of column is less than 3. This 
  5165. example prints the values of a 5 by 3 array in a 5 row by 3 column table: 
  5166.  
  5167. for (row = 0; row < 5; row++)
  5168. {
  5169.       for (column = 0; column < 3; column++)
  5170.                 cout << table[row][column] <<
  5171. " ";
  5172.         cout endl;
  5173. }
  5174.  
  5175. For more details, see "break" , "continue" , and "Comma Operator" 
  5176.  
  5177.  
  5178. ΓòÉΓòÉΓòÉ 7.7. Jump Statements ΓòÉΓòÉΓòÉ
  5179.  
  5180. Jump statements transfer control unconditionally. 
  5181.  
  5182. The syntax is: 
  5183.  
  5184.       jump-statement:
  5185.             break ;
  5186.             continue ;
  5187.             return[expression]
  5188. ;
  5189.             goto identifier ;
  5190.  
  5191.  
  5192. ΓòÉΓòÉΓòÉ 7.7.1. break ΓòÉΓòÉΓòÉ
  5193.  
  5194. A break statement enables you to end an iterative (do, for, while) or switch 
  5195. statement and exit from it at any point other than the logical end. 
  5196.  
  5197. In an iterative statement, the break statement ends the loop and moves control 
  5198. to the next statement outside the iterative statement. In a switch body, the 
  5199. break statement ends the processing of the switch body and gives control to the 
  5200. statement after the switch statement. Within nested statements, the break 
  5201. statement ends only the nearest enclosing do, for, switch, or while statement. 
  5202.  
  5203. You should place a break statement only in the body of an iterative statement 
  5204. or in the body of a switch statement. 
  5205.  
  5206. The following example shows a break statement in a for statement. If the i th 
  5207. element of the array string is equal to '\0', the break statement causes the 
  5208. for statement to end. 
  5209.  
  5210. for (i = 0; i < 5; i++)
  5211. {
  5212.       if (string[i] == '\0')
  5213.             break;
  5214.       length++;
  5215. }
  5216.  
  5217. The following example shows a break statement in a nested iterative statement. 
  5218. The outer loop goes through an array of pointers to strings. The inner loop 
  5219. examines each character of the string. When the break statement is processed, 
  5220. the inner loop ends and control returns to the outer loop. 
  5221.  
  5222. /**************************************************************
  5223. ** This program counts the characters in the strings that
  5224.    **
  5225. ** are part of an array of pointers to characters.
  5226.       **
  5227. ** The count stops when one of the digits 0 (zero)
  5228.       **
  5229. ** through 9 is encountered and resumes at the beginning
  5230.     **
  5231. ** of the next string.
  5232.       */
  5233. #include <iostream.h>
  5234. void main()
  5235. {
  5236.       static char *strings[3] = { "ab", "c5d",
  5237. "e5" };
  5238.       int letter_count = 0;
  5239.       for (int i=0; i<3; i++)             // for each
  5240. string
  5241.       {                              // for each
  5242. character
  5243.             for (char *pointer=strings[i]; *pointer !=
  5244. '\0';++pointer)
  5245.              {
  5246.                                           // if a number
  5247.                    if (*pointer >= '0' && *pointer <=
  5248. '9')
  5249.                           break;
  5250.                    letter_count++;
  5251.              }
  5252.             cout << "Letter count = " <<
  5253. letter_count << endl;
  5254.       }
  5255. }
  5256.  
  5257. The program produces the following output: 
  5258.  
  5259. Letter count = 4
  5260.  
  5261. The following example is a switch statement that contains several break 
  5262. statements. Each break statement indicates the end of a specific clause and 
  5263. ends the processing of the switch statement. 
  5264.  
  5265. switch (timeofday)
  5266. {
  5267.       case (morning):
  5268.             cout << "Good Morning\n";
  5269.             break;
  5270.       case (evening):
  5271.             cout << "Good Evening\n";
  5272.             break;
  5273.       default:
  5274.             cout << "Good Day\n";
  5275.             break;
  5276. }
  5277.  
  5278. For more details, see "switch" , "while" , "do" , and "for" 
  5279.  
  5280.  
  5281. ΓòÉΓòÉΓòÉ 7.7.2. continue ΓòÉΓòÉΓòÉ
  5282.  
  5283. A continue statement enables you to stop the current iteration of a loop. 
  5284. Program control is passed from the continue statement to the condition part of 
  5285. the loop. You can only have a continue statement in an iterative statement. 
  5286.  
  5287. The continue statement ends the execution of the action part of a do, for, or 
  5288. while statement and moves control to the condition part of the statement. If 
  5289. the iterative statement is a for statement, control moves to the third 
  5290. expression in the condition part of the statement, and then to the second 
  5291. expression (the test) in the condition part of the statement. Within nested 
  5292. statements, the continue statement ends only the current iteration of the do, 
  5293. for, or while statement immediately enclosing it. 
  5294.  
  5295. The following example shows a continue statement in a for statement. The 
  5296. continue statement causes the system to skip over those elements of the integer 
  5297. array rates that have values less than or equal to 1. 
  5298.  
  5299. #include <iostream.h>
  5300. void main()
  5301. {
  5302.       static float rates[5] = { 1.45, 0.05, 1.88,
  5303. 2.03,
  5304. 0.75 };
  5305.       cout << "Rates over 1.00\n";
  5306.        for (int i = 0; i < 5; i++)
  5307.         {
  5308.                 if (rates[i] <= 1.00) /* skip rates
  5309. <= 1.00 */
  5310.                    continue;
  5311.                  cout << "rate = " << rates[i]
  5312. << endl;
  5313.       }
  5314. }
  5315.  
  5316. The program produces the following output: 
  5317.  
  5318. Rates over 1.00
  5319. rate = 1.45
  5320. rate = 1.88
  5321. rate = 2.03
  5322.  
  5323. The following example shows a continue statement in a nested loop. When the 
  5324. inner loop encounters a number in the array strings, that iteration of the loop 
  5325. is stopped. Processing continues with the third expression of the inner loop. 
  5326. The inner loop is ended when the '\0' escape sequence is encountered. 
  5327.  
  5328. /**************************************************************
  5329. ** This program counts the characters in strings that
  5330.       **
  5331. ** are part of an array of pointers to characters.
  5332.       **
  5333. ** The count excludes the digits 0 (zero) through 9.
  5334.       **
  5335. **************************************************************/
  5336. #include <iostream.h>
  5337. void main()
  5338. {
  5339.       static char *strings[3] = { "ab", "c5d",
  5340. "e5" };
  5341.       int letter_count = 0;
  5342.       for (int i = 0; i < 3; i++)   // for each string
  5343.                                     // for each each character
  5344.        for (char *pointer = strings[i]; *pointer !=
  5345. '\0';
  5346. ++pointer)
  5347.        {                       // if a number
  5348.             if (*pointer >= '0' && *pointer <= '9')
  5349.                    continue;
  5350.              letter_count++;
  5351.        }
  5352.       cout << "letter count = " << letter_count
  5353. << endl;
  5354. }
  5355.  
  5356. The program produces the following output: 
  5357.  
  5358. letter count = 5
  5359.  
  5360. For more details, see "while" , "do" , and "for" 
  5361.  
  5362.  
  5363. ΓòÉΓòÉΓòÉ 7.7.3. return ΓòÉΓòÉΓòÉ
  5364.  
  5365. A return statement ends the execution of the current function and returns 
  5366. control to the caller of the function. 
  5367.  
  5368. A return statement in a function is optional. The &xcomp. &xcompos2. issues a 
  5369. warning if a return statement is not found in a function declared with a return 
  5370. type. If the end of a function is reached without encountering a return 
  5371. statement, control is passed to the caller as if a return statement without an 
  5372. expression were encountered. A function can contain multiple return statements. 
  5373.  
  5374. If an expression is present on a return statement, the value of the expression 
  5375. is returned to the caller. If the data type of the expression is different from 
  5376. the function return type, conversion of the return value takes place as if the 
  5377. value of the expression were used to initialize an object with the same 
  5378. function return type. 
  5379.  
  5380. If an expression is not present in a return statement, the value of the return 
  5381. statement is undefined. If the function is declared with a nonvoid return type 
  5382. a warning is generated, and the result of calling the function is 
  5383. unpredictable. For example, 
  5384.  
  5385. #include <iostream.h>
  5386. int func1() {
  5387.  return;
  5388. }
  5389. int func2() {
  5390.  return (4321);
  5391. }
  5392.  
  5393. void main() {
  5394. int a=func1(); // result unpredictable!
  5395. int b=func2();
  5396. }
  5397.  
  5398. You cannot use a return statement in an expression when the function is 
  5399. declared as returning type void. 
  5400.  
  5401. If a function returns a class object with constructors, a temporary class 
  5402. object may be constructed. The temporary object is not in the scope of  the 
  5403. function returning the temporary object but is local to the caller of the 
  5404. function. 
  5405.  
  5406. When a function returns, all temporary local variables are destroyed. If local 
  5407. class objects with destructors exist, destructors are called. For more details, 
  5408. see "Temporary Objects" 
  5409.  
  5410. The following function searches through an array of integers to determine if a 
  5411. match exists for the variable number. If a match exists, the function match 
  5412. returns the value of i. If a match does not exist, the function match returns 
  5413. the value -1. 
  5414.  
  5415. int match(int number, int array[], int n)
  5416. {
  5417. int i;
  5418. for (i = 0; i < n; i++)
  5419.       if (number == array[i])
  5420.             return (i);
  5421. return(-1);
  5422. }
  5423.  
  5424. For more details, see "Chapter 8. Functions" , and specifically "Return Values" 
  5425. , and specifically "Return Values" 
  5426.  
  5427.  
  5428. ΓòÉΓòÉΓòÉ 7.7.4. goto ΓòÉΓòÉΓòÉ
  5429.  
  5430. A goto statement causes your program to unconditionally transfer control to the 
  5431. statement associated with the label specified on the goto statement. The label 
  5432. must appear in the same function as the goto statement. 
  5433.  
  5434. Because the goto statement can interfere with the normal top-to-bottom sequence 
  5435. of processing, it makes a program more difficult to read and maintain. Often, a 
  5436. break statement, a continue statement, or a function call can eliminate the 
  5437. need for a goto statement. 
  5438.  
  5439. If you use a goto statement to transfer control to a statement inside of a loop 
  5440. or block, initializations of automatic storage for the loop do not take place, 
  5441. and an error is generated. 
  5442.  
  5443. If an active block is exited using a goto statement, any local variables are 
  5444. destroyed when control is transferred from that block. 
  5445.  
  5446. The following example shows a goto statement that is used to jump out of a 
  5447. nested loop. This function could be written without using a goto statement. 
  5448.  
  5449. void display(int matrix[3][3])
  5450. {
  5451.       int i, j;
  5452.       for (i = 0; i < 3; i++)
  5453.       {
  5454.             for (j = 0; j < 3; j++)
  5455.                   {
  5456.                      if ( (matrix[i][j] < 1) ||
  5457. (matrix[i][j]
  5458. > 6) )
  5459.                             goto out_of_bounds;
  5460.                             cout << "matrix " <<
  5461. i << "," << j << " = "
  5462.                         cout << matrix[i][j] <<
  5463. endl;
  5464.             }
  5465.       }
  5466.       return;
  5467.       out_of_bounds: cout << "Number must be 1 through
  5468. 6" << endl;
  5469. }
  5470.  
  5471.  
  5472. ΓòÉΓòÉΓòÉ 7.8. Null Statement ΓòÉΓòÉΓòÉ
  5473.  
  5474. The null statement performs no operation. 
  5475.  
  5476. A null statement can hold the label of a labeled statement or show a 
  5477. nonexistent action in an iterative (do, for, while) statement. 
  5478.  
  5479. The following example initializes the elements of the array price: 
  5480.  
  5481. for (i = 0; i < 3; price[i++] = 0)
  5482.   ;    // null statement
  5483.  
  5484. Because the initializations occur in the for expressions, a statement is only 
  5485. needed to complete the for syntax; no operations are required. 
  5486.  
  5487.  
  5488. ΓòÉΓòÉΓòÉ 7.9. Related Information ΓòÉΓòÉΓòÉ
  5489.  
  5490. "Expressions and Operators" 
  5491.  
  5492.  
  5493. ΓòÉΓòÉΓòÉ 8. Chapter 8. Functions ΓòÉΓòÉΓòÉ
  5494.  
  5495. This chapter describes the structure and use of functions in C++.  The 
  5496. following features of C++ functions are described in this chapter: 
  5497.  
  5498. o Introduction to Functions 
  5499. o C++ enhancements to C functions 
  5500. o Function declarations 
  5501. o Function definitions 
  5502. o The main() Function 
  5503. o Calling functions and argument passing 
  5504. o Default arguments 
  5505. o Return values 
  5506. o Pointers to functions 
  5507. o Inline functions 
  5508. o Special C++ functions. 
  5509.  
  5510. You can also return to the table of contents 
  5511.  
  5512.  
  5513. ΓòÉΓòÉΓòÉ 8.1. Introduction to Functions ΓòÉΓòÉΓòÉ
  5514.  
  5515. Functions specify the logical structure of a program and define how particular 
  5516. operations are to be implemented. A function declaration consists of a return 
  5517. type, a name, and an argument list. It is used to declare the format and 
  5518. existence of a function prior to its use. C++ uses the style of declaration 
  5519. called prototyping. A prototype refers to the return type, name, and argument 
  5520. list components of a function. It is used by the &xcomp. &xcompos2. for 
  5521. argument type checking and argument conversions. Prototypes can appear several 
  5522. times in a program provided the declarations are compatible. A function 
  5523. definition contains a function declaration and the body of the function. A 
  5524. function can only have one definition. Function prototypes are usually placed 
  5525. in header files, while function definitions appear in source files. 
  5526.  
  5527.  
  5528. ΓòÉΓòÉΓòÉ 8.2. C++ Enhancements to C Functions ΓòÉΓòÉΓòÉ
  5529.  
  5530. The C++ language provides many enhancements to C functions. These are: 
  5531.  
  5532. o Default arguments 
  5533.  
  5534. o Reference arguments 
  5535.  
  5536. o Reference return types 
  5537.  
  5538. o Inline functions 
  5539.  
  5540. o Member functions 
  5541.  
  5542. o Overloaded functions 
  5543.  
  5544. o Operator  functions 
  5545.  
  5546. o Constructor and destructor functions 
  5547.  
  5548. o Conversion functions 
  5549.  
  5550. o Virtual  functions 
  5551.  
  5552. o Function templates. 
  5553.  
  5554.  
  5555. ΓòÉΓòÉΓòÉ 8.3. Function Declarations ΓòÉΓòÉΓòÉ
  5556.  
  5557. A function declaration gives the return type of the function, the function 
  5558. name, and the number and type of the arguments that must be passed to the 
  5559. function when the function is called. You can specify the qualifiers volatile 
  5560. and const  in member function declarations. You can also specify exception 
  5561. specifications in function declarations. Functions must be declared before they 
  5562. can be called. 
  5563.  
  5564. Types cannot be defined in return or argument types. For example, the following 
  5565. declarations are not valid in C++ : 
  5566.  
  5567. void print(struct X { int i;} x);      //error
  5568. enum count{one, two, three} counter();      //error
  5569.  
  5570. This example attempts to declare a function print() that takes an object x of 
  5571. class X as its argument. However the class definition is not allowed within the 
  5572. argument list. In the attempt to declare counter(), the enumeration type 
  5573. definition cannot appear in the return type of the function declaration. The 
  5574. two function declarations and their corresponding type definitions can be 
  5575. rewritten as follows: 
  5576.  
  5577. struct X { int i;};
  5578. void print(X x);
  5579. enum count {one, two, three};
  5580. count counter();
  5581.  
  5582.  
  5583. ΓòÉΓòÉΓòÉ 8.3.1. Function Declaration Grammar ΓòÉΓòÉΓòÉ
  5584.  
  5585. The syntax is: 
  5586.  
  5587.       decl-specifier declarator
  5588.  
  5589. where declarator has the form: 
  5590.  
  5591.       declarator (
  5592. argument-declaration-list
  5593. ) [cv-qualifier]
  5594.             [exception-specification]
  5595.  
  5596. and argument-declaration-list has the form: 
  5597.  
  5598.       argument-declaration-list:
  5599.             [arg-declaration-list]
  5600. [...]
  5601.             [arg-declaration-list] , ...
  5602.  
  5603.       arg-declaration-list:
  5604.             argument-declaration
  5605.             arg-declaration-list ,
  5606. argument-declaration
  5607.       argument-declaration:
  5608.             decl-specifiers declarator
  5609.             decl-specifiers declarator =
  5610. expression
  5611.             decl-specifiers
  5612. [abstract-declarator]
  5613.             decl-specifiers
  5614. [abstract-declarator]
  5615. = expression
  5616.  
  5617. The complete syntax for declarators is given in "Declaration Grammar" 
  5618.  
  5619. cv-qualifiers are described in "volatile and const Attributes" and 
  5620. exception-specifications are described in "Exception Specifications" 
  5621.  
  5622. An ellipsis at the end of an argument-declaration-list indicates that the 
  5623. number of arguments is equal to, or greater than, the number of specified 
  5624. argument types. Where it is permitted, an ellipsis preceded by a comma is 
  5625. equivalent to a simple ellipsis. 
  5626.  
  5627. An empty argument declaration list or the argument declaration list of (void) 
  5628. indicates a function that takes no arguments. void cannot be used as an 
  5629. argument type, although types derived from void (such as pointers to void) can 
  5630. be used. 
  5631.  
  5632. The default return type of a function is int. 
  5633.  
  5634.  
  5635. ΓòÉΓòÉΓòÉ 8.3.2. Multiple Function Declarations ΓòÉΓòÉΓòÉ
  5636.  
  5637. All function declarations for a particular function must have the same number 
  5638. and type of arguments, and must have the same return type. These return and 
  5639. argument types are part of the function type, although the default arguments 
  5640. are not. The ellipsis is considered a part of the function type. If the only 
  5641. difference between the argument types in two declarations is in the use of 
  5642. typedef names or unspecified argument array bounds, the declarations are the 
  5643. same. A cv-qualifier is also part of the function type, but can only be part of 
  5644. a declaration or definition of a nonstatic member function. 
  5645.  
  5646. If you declare two functions differing only in return type, it is not valid 
  5647. function overloading and is flagged as an error. For example: 
  5648.  
  5649. void f();
  5650. int f();      // error, two definitions differ only in
  5651.             // return type
  5652. int g()
  5653. {
  5654.    return f();
  5655. }
  5656.  
  5657.  
  5658. ΓòÉΓòÉΓòÉ 8.3.3. Checking Function Calls ΓòÉΓòÉΓòÉ
  5659.  
  5660. The &xcomp. &xcompos2. checks function calls by comparing the number and type 
  5661. of the actual arguments used in the function call with the number and type of 
  5662. the formal arguments in the function declaration. Implicit type conversion is 
  5663. performed when necessary. 
  5664.  
  5665.  
  5666. ΓòÉΓòÉΓòÉ 8.3.4. Argument Names in Function Declarations ΓòÉΓòÉΓòÉ
  5667.  
  5668. You can supply argument names in a function declaration but the &xcomp. 
  5669. &xcompos2. ignores them except in the following two situations: 
  5670.  
  5671.  1. If two argument names have the same name within a single declaration. This 
  5672.     is an error. 
  5673.  
  5674.  2. If an argument name is the same as a name outside the function. In this 
  5675.     case the name outside the function is hidden and cannot be used in the 
  5676.     argument declaration.  In the following example, it is intended that the 
  5677.     third argument intersects has enumeration type subway_line, but this name 
  5678.     is hidden by the name of the first argument.  The declaration of the 
  5679.     function subway() causes a compile-time error because subway_line is not a 
  5680.     valid type name in the context of the argument declarations. 
  5681.  
  5682.               enum subway_line {yonge, university, spadina,
  5683.         bloor};
  5684.               int subway(char * subway_line, int stations,
  5685.                           subway_line intersects);
  5686.  
  5687.  
  5688. ΓòÉΓòÉΓòÉ 8.3.5. Examples of Functions Declarations ΓòÉΓòÉΓòÉ
  5689.  
  5690. You can declare a function with no arguments in two ways: 
  5691.  
  5692.       int f(void);      // ANSI C Standard
  5693.  
  5694. or 
  5695.  
  5696.       int f();      // C++ enhancement
  5697.  
  5698. A function can also be declared with a variable number of arguments. To declare 
  5699. this type of function, use an ellipsis in the argument list in the function 
  5700. declaration as shown in the following example, 
  5701.  
  5702.       int f(int,...);
  5703.  
  5704. Note:  The comma before the ellipsis in the above declaration is optional. 
  5705.  
  5706. No type checking is performed on the variable arguments. 
  5707.  
  5708. The following code fragments show several function declarations. The first 
  5709. declares a function f that takes two integer arguments and has a return type of 
  5710. void: 
  5711.  
  5712.       void f(int, int);
  5713.  
  5714. The following fragment declares a function f1 that takes an integer argument, 
  5715. and returns a pointer to a function that takes an integer argument and returns 
  5716. an integer: 
  5717.  
  5718.       int (*f1(int))(int);
  5719.  
  5720. Alternatively, a typedef can be used for the complicated return type of 
  5721. function f1: 
  5722.  
  5723.       typedef int pf1(int);
  5724.       pf1* f1(int);
  5725.  
  5726. The following fragment declares a pointer p1 to a function that takes a pointer 
  5727. to a constant character and returns an integer: 
  5728.  
  5729.       int (*p1) (const char*);
  5730.  
  5731. The following declaration is of an external function f2 that takes a constant 
  5732. integer as its first argument, can have a variable number and variable types of 
  5733. other arguments, and returns type int. 
  5734.  
  5735.       int extern f2(const int ...);
  5736.  
  5737. Function f3 takes an int argument with a default value that is the value 
  5738. returned from function f2, and that has a return type of int: 
  5739.  
  5740.       const int j = 5;
  5741.       int f3( int x = f2(j) );
  5742.  
  5743. Function f6 is a constant class member function of class X with no arguments, 
  5744. and with an int return type: 
  5745.  
  5746. class X
  5747. {
  5748. public:
  5749.       int f6() const;
  5750. };
  5751.  
  5752. Function f4 takes no arguments, has return type void, and can throw class 
  5753. objects of types X and Y. 
  5754.  
  5755. class X;
  5756. class Y;
  5757. //      .
  5758. //      .
  5759. //      .
  5760. void f4() throw(X,Y);
  5761.  
  5762. Function f5 takes no arguments, has return type void and cannot throw an 
  5763. exception. 
  5764.  
  5765. void f5() throw();
  5766.  
  5767. See  "Exception Specifications" for more details on throw(). 
  5768.  
  5769.  
  5770. ΓòÉΓòÉΓòÉ 8.4. Function Definitions ΓòÉΓòÉΓòÉ
  5771.  
  5772. Every function that is called must be defined exactly once in a program. A 
  5773. function definition is composed of the declaration and the body of the 
  5774. function. 
  5775.  
  5776.  
  5777. ΓòÉΓòÉΓòÉ 8.4.1. Function Definition Grammar ΓòÉΓòÉΓòÉ
  5778.  
  5779. The syntax for a function definition is the same as for a declaration except 
  5780. that the declaration is followed by the function body. 
  5781.  
  5782.       function-definition:
  5783.             [decl-specifiers]
  5784. declarator
  5785. [ctor-initializer]
  5786.                         fct-body
  5787.       fct-body:
  5788.             compound-statement
  5789.  
  5790. where fct-body (function body) is a compound statement. For further details, 
  5791. see "Compound Statements" 
  5792.  
  5793. The following example shows a function declaration and definition: 
  5794.  
  5795. #include<math.h>
  5796. extern double root(double value, double base); // declaration
  5797.       .
  5798.       .
  5799.       .
  5800. double root(double value, double base) // definition
  5801. {
  5802.   double temp = exp(log(value)/base);
  5803.    return temp;
  5804. }
  5805.  
  5806. The argument names value and base are optional in the declaration. If the two 
  5807. arguments have the same name, an error occurs. If an argument name is the same 
  5808. as a name outside the function, the outside name is hidden. See "Argument Names 
  5809. in Function Declarations" for more details. 
  5810.  
  5811.  
  5812. ΓòÉΓòÉΓòÉ 8.5. The main() Function ΓòÉΓòÉΓòÉ
  5813.  
  5814. Every program must have exactly one external function named main(). This 
  5815. function marks the entry point for the program. main() is extern  by default. 
  5816. The return type for main() can be void or int. The default type is int. The 
  5817. function main() can be defined with or without arguments. These arguments pass 
  5818. program parameters and environment settings to the program, and are discussed 
  5819. in Appendix C. 
  5820.  
  5821. You cannot use the specifiers inline or static when declaring main(). You 
  5822. cannot call main() from within a program. You cannot take the address of 
  5823. main(). 
  5824.  
  5825.  
  5826. ΓòÉΓòÉΓòÉ 8.6. Calling Functions and Argument Passing ΓòÉΓòÉΓòÉ
  5827.  
  5828. A function is called by applying the function call operator ( ) to the name of 
  5829. the function. The actual arguments are placed inside the call operator. When a 
  5830. function is called, the actual arguments are used to initialize the formal 
  5831. arguments. 
  5832.  
  5833. The type of an actual argument is checked against the type of the corresponding 
  5834. formal argument in the function prototype. All standard and user-defined type 
  5835. conversions are applied as necessary. For example, 
  5836.  
  5837. #include<iostream.h>
  5838. #include<math.h>
  5839. extern double root(double, double); // declaration
  5840. double root(double value, double base) // definition
  5841. {
  5842.       double temp = exp(log(value)/base);
  5843.       return temp;
  5844. }
  5845. void main()
  5846. {
  5847.       int value = 144;
  5848.       int base = 2;
  5849.       // Call function root and print return value
  5850.       cout << "The root is: " << root(value,base)
  5851. << endl;
  5852. }
  5853.  
  5854. The output is The root is: 12 
  5855.  
  5856. In the above example, because the functionroot is expecting arguments of type 
  5857. double, the two int arguments value and base are implicitly converted to type 
  5858. double when the function is called. 
  5859.  
  5860.  
  5861. ΓòÉΓòÉΓòÉ 8.6.1. Passing Array Arguments to Functions ΓòÉΓòÉΓòÉ
  5862.  
  5863. When a function argument is an array, it is converted to a pointer to the first 
  5864. element of the array. An array cannot be passed by value to a function. Any 
  5865. assignment to an element of the array within the function modifies the actual 
  5866. value of the element. 
  5867.  
  5868.  
  5869. ΓòÉΓòÉΓòÉ 8.6.2. Passing Function Arguments to Functions ΓòÉΓòÉΓòÉ
  5870.  
  5871. When a function argument is itself a function, it is converted to a pointer to 
  5872. the function. When a function argument is a nonstatic member function, it is 
  5873. converted to a pointer to member. 
  5874.  
  5875.  
  5876. ΓòÉΓòÉΓòÉ 8.6.3. Passing Class Arguments to Functions ΓòÉΓòÉΓòÉ
  5877.  
  5878. It is an error when a function argument is a class and all of the following 
  5879. properties hold: 
  5880.  
  5881. o The class needs a copy constructor 
  5882.  
  5883. o The class does not have a user defined copy constructor 
  5884.  
  5885. o A copy constructor cannot be generated for that class. 
  5886.  
  5887.  
  5888. ΓòÉΓòÉΓòÉ 8.6.4. Passing Arguments by Reference ΓòÉΓòÉΓòÉ
  5889.  
  5890. If you use a reference type as a formal argument, you can make a 
  5891. pass-by-reference call to a function. In a pass-by-reference call, the values 
  5892. of arguments in the calling function can be modified in the called function. In 
  5893. pass-by-value calls, only copies of the arguments are passed to the function. 
  5894.  
  5895. Note:  The term pass by reference describes a general method of passing 
  5896. arguments from a calling routine to a called routine. The term reference in the 
  5897. context of C++ refers to a specific way of declaring objects and functions. 
  5898.  
  5899. The following example shows how arguments are passed by reference: 
  5900.  
  5901. #include <iostream.h>
  5902. void swapnum(int &i, int &j)
  5903. {
  5904.       // Note that reference formal arguments are initialized
  5905. with
  5906.       // the actual arguments when the function is called
  5907.       //
  5908.       int temp = i;
  5909.       i = j;
  5910.       j = temp;
  5911. }
  5912.       .
  5913.       .
  5914.       .
  5915. main()
  5916. {
  5917.       int       a = 10,   // a is 10
  5918.             b = 20;   // b is 20
  5919.       swapnum(a,b);    // now a is 20 and b is 10
  5920.       cout << "A is : " << a <<
  5921. " and B is : " << b << endl;
  5922. }
  5923.  
  5924. When the function swapnum() is called the actual values of the variables a and 
  5925. b are exchanged because they are passed by reference. The output is: 
  5926.  
  5927. A is : 20 and B is : 10
  5928.  
  5929. You must define the formal arguments of swapnum() as references if you want the 
  5930. values of the actual arguments to be modified by the function swapnum(). 
  5931.  
  5932.  
  5933. ΓòÉΓòÉΓòÉ 8.6.5. Restrictions on Passing Arguments by Reference ΓòÉΓòÉΓòÉ
  5934.  
  5935. There are two cases where attempting to pass arguments by reference causes the 
  5936. &xcomp. &xcompos2. to issue a warning for these cases: 
  5937.  
  5938. o If the last argument specified in the function declaration before the 
  5939.   ellipsis is a reference argument, arguments passed using an ellipsis 
  5940.   (variable arguments) are not accessible using the mechanism from the 
  5941.   <stdarg.h> standard header file. 
  5942.  
  5943. o Ellipsis arguments cannot be passed as references. 
  5944.  
  5945. In addition to these restrictions, when the actual argument cannot be 
  5946. referenced directly by the formal argument, the compiler creates a temporary 
  5947. variable that is referenced by the formal argument and initialized using the 
  5948. value of the actual argument.  In this case, the formal argument must be a 
  5949. const reference. 
  5950.  
  5951.  
  5952. ΓòÉΓòÉΓòÉ 8.6.6. Passing Arguments by Constant Reference ΓòÉΓòÉΓòÉ
  5953.  
  5954. Reference arguments declared const can be used to pass large objects 
  5955. efficiently to functions without making a temporary copy of the object that is 
  5956. passed to the function. Because the reference is declared const, the actual 
  5957. arguments cannot be changed by the function. For example, 
  5958.  
  5959. void printbig (const bigvar&); // Function prototype
  5960.  
  5961. When a function printbig is called, it cannot modify the object of type bigvar 
  5962. because the object was passed by constant reference. 
  5963.  
  5964.  
  5965. ΓòÉΓòÉΓòÉ 8.6.7. Passing Pointer Values to Functions ΓòÉΓòÉΓòÉ
  5966.  
  5967. Pointers provide a way for a called function to alter the value of a variable 
  5968. accessible to the calling function. A called function receives a copy of the 
  5969. pointer value and can only alter the copy, not the value of the pointer in the 
  5970. calling function. However, the called function can alter the value of the 
  5971. variable that the pointer points to. , "References" , "Function Call" , and 
  5972. "Standard Conversions" 
  5973.  
  5974.  
  5975. ΓòÉΓòÉΓòÉ 8.7. Default Arguments ΓòÉΓòÉΓòÉ
  5976.  
  5977. You can provide default values for function arguments. All default argument 
  5978. names of a function are bound when the function is declared.  All functions 
  5979. have their types checked at declaration, and are evaluated at each point of 
  5980. call. For example, 
  5981.  
  5982. #include <iostream.h>
  5983.     int a=1;
  5984.     int f(int a) {return a;}
  5985.    int g(int x = f(a)) {return f(a);}
  5986.    int h()
  5987.     {
  5988.        a=2;
  5989.         {
  5990.            int a = 3;
  5991.             return g();
  5992.         }
  5993.    }
  5994. main()
  5995. {
  5996. cout << h() << endl;
  5997. }
  5998.  
  5999. This example prints "2" to standard output, because the value of a is 
  6000. determined after entry into function h() but before the call to g() is 
  6001. resolved. 
  6002.  
  6003. A default argument can have any type. 
  6004.  
  6005. A pointer to a function must have the same type as the function. Attempts to 
  6006. take the address of a function by reference without specifying the type of the 
  6007. function produce an error. The type of a function is not affected by arguments 
  6008. with default values. 
  6009.  
  6010. The following example shows that the fact that a function has default arguments 
  6011. does not change its type. The default argument allows you to call a function 
  6012. without specifying all of the arguments, it does not allow you to create a 
  6013. pointer to the function that does not specify the types of all the arguments. 
  6014. Thus, f can be called without an explicit argument, but the pointer badpointer 
  6015. cannot be defined without specifying the type of the argument. 
  6016.  
  6017. int f(int = 0);
  6018. void g()
  6019. {
  6020.    int a = f(1);                   // ok
  6021.     int b = f();                    // ok, default argument
  6022. used
  6023. }
  6024. int (*pointer)(int) = &f;       // ok, type of f() specified
  6025. (int)
  6026. int (*badpointer)() = &f;       // error, badpointer and
  6027. f have
  6028.                               // different types. badpointer
  6029. must
  6030.                               // be initialized with a pointer
  6031. to
  6032.                               // a function taking no arguments.
  6033.  
  6034.  
  6035. ΓòÉΓòÉΓòÉ 8.7.1. Restrictions on Default Arguments ΓòÉΓòÉΓòÉ
  6036.  
  6037. Of the operators, only the function call operator and the operator new can have 
  6038. default arguments when they are overloaded. 
  6039.  
  6040. Arguments with default values must be the trailing arguments in the function 
  6041. declaration argument list. For example: 
  6042.  
  6043. void f(int a, int b = 2, int c = 3);      // trailing defaults
  6044. void g(int a = 1, int b = 2, int c);      // error, leading
  6045. defaults
  6046. void h(int a, int b = 3, int c);      // error, default
  6047. in middle
  6048.  
  6049. Once a default argument has been given in a declaration or definition, you 
  6050. cannot redefine that argument, even to the same value. However you can add 
  6051. default arguments not given in previous declarations. For example, the last 
  6052. declaration below attempts to redefine the default values for a and b: 
  6053.  
  6054. void f(int a, int b, int c=1);            // valid
  6055. void f(int a, int b=1, int c);            // valid, add another
  6056. default
  6057. void f(int a=1, int b, int c);            // valid, add another
  6058. default
  6059. void f(int a=1, int b=1, int c=1);      // error, redefined
  6060. defaults
  6061.  
  6062. You can supply any default argument values in the function declaration or in 
  6063. the definition. All subsequent arguments must have default arguments supplied 
  6064. in this or a previous declaration of the function. 
  6065.  
  6066. You cannot use local variables in default argument expressions. For example, 
  6067. the &xcomp. &xcompos2. generates errors for both function g() and function h() 
  6068. below: 
  6069.  
  6070. void f(int a)
  6071. {
  6072.       int b=4;
  6073.        void g(int c=a); // Local variable "a" inaccessible
  6074.       void h(int d=b); // Local variable "b" inaccessible
  6075. }
  6076.  
  6077.  
  6078. ΓòÉΓòÉΓòÉ 8.7.2. Evaluating Default Arguments ΓòÉΓòÉΓòÉ
  6079.  
  6080. When a function defined with default arguments is called with trailing 
  6081. arguments missing, the default expressions are evaluated. For example: 
  6082.  
  6083. void f(int a, int b = 2, int c = 3); // declaration
  6084. // ...
  6085. int a = 1;
  6086. f(a);            // same as call f(a,2,3)
  6087. f(a,10);      // same as call f(a,10,3)
  6088. f(a,10,20);      // no default arguments
  6089.  
  6090. Default arguments are checked against the function declaration and evaluated 
  6091. when the function is called. The order of evaluation of default arguments is 
  6092. undefined. Default argument expressions cannot use formal arguments of a 
  6093. function. For example: 
  6094.  
  6095. int f(int q = 3, int r = q); // error
  6096.  
  6097. The argument r cannot be initialized with the value of the argument q because 
  6098. the value of q may not be known when it is assigned to r. If the above function 
  6099. declaration is rewritten: 
  6100.  
  6101. int q=5;
  6102. int f(int q = 3, int r = q); // error
  6103.  
  6104. the value of r in the function declaration still produces an error because the 
  6105. variable q defined outside of the function is hidden by the argument q declared 
  6106. for the function. Similarly: 
  6107.  
  6108. typedef double D;
  6109. int f(int D, int z = D(5.3) ); // error
  6110.  
  6111. Here the type D is interpreted within the function declaration as the name of 
  6112. an integer. The type D is hidden by the argument D. The cast D(5.3) is 
  6113. therefore not interpreted as a cast because D is the name of the argument not a 
  6114. type. 
  6115.  
  6116. In the following example, the nonstatic member  a cannot be used as an 
  6117. initializer because a does not exist until an object of class X is constructed. 
  6118. You can use the static member b as an initializer because b is created 
  6119. independently of any objects of class X. You can declare the member b after its 
  6120. use as a default argument because the default values are not analyzed until 
  6121. after the final bracket } of the class declaration. 
  6122.  
  6123. class X
  6124. {
  6125.    int a;
  6126.     f(int z = a) ; // error
  6127.     g(int z = b) ; // valid
  6128.     static int b;
  6129. };
  6130.  
  6131.  
  6132. ΓòÉΓòÉΓòÉ 8.8. Return Values ΓòÉΓòÉΓòÉ
  6133.  
  6134. A value must be returned from a function unless the function has a return type 
  6135. of void. The return value is specified in a return statement. The following 
  6136. code fragment shows a function definition, including the return statement: 
  6137.  
  6138. int add(int i, int j)
  6139. {
  6140.   return i + j; // return statement
  6141. }
  6142.  
  6143. The function add() can be called as shown in the following code fragment: 
  6144.  
  6145. int a = 10,
  6146.     b = 20;
  6147. int answer = add(a, b); // answer is 30
  6148.  
  6149. In this example, the return statement initializes a variable of the returned 
  6150. type. The variable answer is initialized with the int value 30. The type of the 
  6151. returned expression is checked against the returned type. All standard and 
  6152. user-defined conversions are performed as necessary. 
  6153.  
  6154. The following return statements show different ways of returning values to a 
  6155. caller: 
  6156.  
  6157. return;                  // Returns no value
  6158. return result;            // Returns the value of result
  6159. return 1;                  // Returns the value 1
  6160. return (x * x);            // Returns the value of x * x
  6161.  
  6162. Other than main(), if a function that does not have type void returns without a 
  6163. value (as in the first return statement shown in the example above) the &xcomp. 
  6164. &xcompos2. issues a warning message, and the result returned is undefined. 
  6165.  
  6166. Each time a function is called, new copies of its local variables are created. 
  6167. Because the storage for a local variable may be reused after the function has 
  6168. terminated, a pointer to a local variable or a reference to a local variable 
  6169. should not be returned. 
  6170.  
  6171. If a class object is returned, a temporary object may be created if the class 
  6172. has copy constructors or a destructor. 
  6173.  
  6174.  
  6175. ΓòÉΓòÉΓòÉ 8.8.1. Using References as Return Types ΓòÉΓòÉΓòÉ
  6176.  
  6177. References can also be used as return types for functions. The reference 
  6178. returns the lvalue of the object to which it refers. This allows you to place 
  6179. function calls on the left side of assignment statements. Referenced return 
  6180. values are used when overloading assignment operators and overloading 
  6181. subscripting operators so that the results of the overloaded operators can be 
  6182. used as actual values. 
  6183.  
  6184.  
  6185. ΓòÉΓòÉΓòÉ 8.9. Pointers to Functions ΓòÉΓòÉΓòÉ
  6186.  
  6187. A pointer to a function points to the address of the function's executable 
  6188. code. You can use pointers to call functions and to pass functions as arguments 
  6189. to other functions. You cannot perform pointer arithmetic on pointers to 
  6190. functions. 
  6191.  
  6192. The type of a pointer to a function is based on both the return type and 
  6193. argument types of the function. 
  6194.  
  6195. A declaration of a pointer to a function must have the pointer name in 
  6196. parentheses. Without them, the &xcomp. &xcompos2. would interpret the statement 
  6197. as a function that returns a pointer to a specified return type. For example: 
  6198.  
  6199. int *f(int a);       // function f returning an int*
  6200. int (*g)(int a);       // pointer g to a function returning
  6201. an int
  6202.  
  6203. In the first declaration, f is interpreted as a function that takes an int as 
  6204. argument, and returns a pointer to an int. In the second declaration, g is 
  6205. interpreted as a pointer to a function that takes an int argument and that 
  6206. returns an int. 
  6207.  
  6208. For further details on pointers, see "Pointer Conversions" and "Pointers" 
  6209.  
  6210.  
  6211. ΓòÉΓòÉΓòÉ 8.10. Inline Functions ΓòÉΓòÉΓòÉ
  6212.  
  6213. Inline functions are used to reduce the overhead of a normal function call. A 
  6214. function is declared inline by using the inline function specifier. The inline 
  6215. specifier is a suggestion to the &xcomp. that an inline expansion can be 
  6216. performed. Instead of transferring control to and from the function code 
  6217. segment, a modified copy of the function body may be substituted directly for 
  6218. the function call. 
  6219.  
  6220. An inline function can be declared and defined simultaneously. If it is 
  6221. declared with the keyword inline, it can be declared without a definition. The 
  6222. following code fragment shows an inline function definition. Note that the 
  6223. definition includes both the declaration and body of the inline function. 
  6224.  
  6225. inline int add(int i, int j) { return i + j; }
  6226.  
  6227. Both member and nonmember functions can be inline. For a nonmember inline 
  6228. function, the function receives default internal linkage. 
  6229.  
  6230. The use of the inline specifier does not change the meaning of the function. 
  6231. The inline expansion of a function may not preserve the order of evaluation of 
  6232. the actual arguments. For more details, see "Compiler Options" in the 
  6233. Programming Guide. 
  6234.  
  6235. For further details on inlining, see "Inline Member Functions". 
  6236.  
  6237.  
  6238. ΓòÉΓòÉΓòÉ 8.11. Special C++ Functions ΓòÉΓòÉΓòÉ
  6239.  
  6240. C++ supports several types of functions not found in ANSI C. These are briefly 
  6241. introduced below. 
  6242.  
  6243.  
  6244. ΓòÉΓòÉΓòÉ 8.11.1. Member Functions ΓòÉΓòÉΓòÉ
  6245.  
  6246. Members functions are operators and functions that are declared within a class 
  6247. declaration. For a complete description, see "Member Functions" 
  6248.  
  6249.  
  6250. ΓòÉΓòÉΓòÉ 8.11.2. Overloaded Functions ΓòÉΓòÉΓòÉ
  6251.  
  6252. Overloading functions allows you to define more than one function with the same 
  6253. name in the same scope. When the function is called, the &xcomp. &xcompos2. 
  6254. selects the correct function definition by comparing the actual arguments to 
  6255. the types of the formal arguments. 
  6256.  
  6257. For a complete description, see  "Overloading Functions" 
  6258.  
  6259.  
  6260. ΓòÉΓòÉΓòÉ 8.11.3. Operator Functions ΓòÉΓòÉΓòÉ
  6261.  
  6262. Overloading operators allows you to redefine most standard C++ operators when 
  6263. they are applied to class types. You can overload an operator by defining an 
  6264. operator function. An operator function must be either a class member function 
  6265. or must take at least one argument that is a class type or a reference to a 
  6266. class type. Operator functions are invoked implicitly, if they have been 
  6267. defined, to implement operators used with class types. 
  6268.  
  6269. For a complete description of operator functions, see  "Overloading Operators" 
  6270.  
  6271.  
  6272. ΓòÉΓòÉΓòÉ 8.11.4. Constructor and Destructor Functions ΓòÉΓòÉΓòÉ
  6273.  
  6274. A constructor is a class member function that has the same name as its class 
  6275. name. Constructors are used to initialize class objects. A destructor is a 
  6276. class member function that has the same name as its class and has a ~ (tilde) 
  6277. preceding the function name. Destructors are used to destroy class objects 
  6278. created with constructors. For a complete description, see "Constructors and 
  6279. Destructors" 
  6280.  
  6281.  
  6282. ΓòÉΓòÉΓòÉ 8.11.5. Conversion Functions ΓòÉΓòÉΓòÉ
  6283.  
  6284. A conversion function is a member function that converts from its class type to 
  6285. another specified type. Conversion functions are useful for converting from 
  6286. class types to the standard types. For a complete description, see "Conversion 
  6287. Functions" 
  6288.  
  6289.  
  6290. ΓòÉΓòÉΓòÉ 8.11.6. Virtual Functions ΓòÉΓòÉΓòÉ
  6291.  
  6292. A virtual function allows you to redefine a base class member function in a 
  6293. derived class. When thevirtual function is called for a derived class object, 
  6294. the derived class function is called and is said to override the base class 
  6295. function. 
  6296.  
  6297. You can only declare a virtualfunction when declaring nonstatic class member 
  6298. functions within a class declaration. For a complete description, see "Virtual 
  6299. Functions" 
  6300.  
  6301.  
  6302. ΓòÉΓòÉΓòÉ 8.11.7. Function Templates ΓòÉΓòÉΓòÉ
  6303.  
  6304. A function template allows you to define a group of functions that are the same 
  6305. except for their return types, the types of one or more of their arguments, and 
  6306. the use of the types in the function body. When a function is called whose name 
  6307. matches the function template's name, a function can be generated with the 
  6308. appropriate return type or argument types. 
  6309.  
  6310. For a complete description, see "Function Templates" 
  6311.  
  6312.  
  6313. ΓòÉΓòÉΓòÉ 8.12. Related Information ΓòÉΓòÉΓòÉ
  6314.  
  6315. "Declarations" 
  6316.  
  6317. "Member Functions" 
  6318.  
  6319. "Inline Member Functions" 
  6320.  
  6321. "C++ Overloading" 
  6322.  
  6323. "Special Member Functions" 
  6324.  
  6325. "Virtual Functions". 
  6326.  
  6327.  
  6328. ΓòÉΓòÉΓòÉ 9. Chapter 9. C++ Classes ΓòÉΓòÉΓòÉ
  6329.  
  6330. This chapter introduces the concept of the class data type and discusses the 
  6331. following topics: 
  6332.  
  6333. o Introduction to C++ classes 
  6334. o Classes, structures, and unions 
  6335. o Class declarations and objects 
  6336. o Scope of class names. 
  6337.  
  6338. You can also return to the table of contents 
  6339.  
  6340.  
  6341. ΓòÉΓòÉΓòÉ 9.1. Introduction to C++ Classes ΓòÉΓòÉΓòÉ
  6342.  
  6343. C++ provides a user-defined data type called a class. 
  6344.  
  6345. The C++ class is similar to the C structure data type. In C, a structure is 
  6346. composed of a set of data members. In C++, a class type is like a C structure 
  6347. except that a class is composed of a set of data members as well as an optional 
  6348. set of operations, that can be performed on the class. 
  6349.  
  6350. In C++, a class type can be declared with the keywords union, struct, or class. 
  6351. A union object can hold any one of a set of named members. Structure and class 
  6352. objects hold a complete set of members. Each class type represents a unique set 
  6353. of class members including data members, member functions, and other type 
  6354. names. 
  6355.  
  6356. Once you create a class type, you can declare one or more objects of that class 
  6357. type. For example, 
  6358.  
  6359. class X
  6360. { /* define class members here */ };
  6361. void main()
  6362. {
  6363.       X xobject1;       // create an object of class type X
  6364.       X xobject2;       // create another object of class type X
  6365. }
  6366.  
  6367.  
  6368. ΓòÉΓòÉΓòÉ 9.1.1. Classes and Access Control ΓòÉΓòÉΓòÉ
  6369.  
  6370. C++ facilitates data abstraction and encapsulation by providing access control 
  6371. for class types. For example, if you declare private data members and public 
  6372. member functions, a client program can only access the private members through 
  6373. the public member functions and friends of that class. Such a class would have 
  6374. data hiding because client programs do not have access to implementation 
  6375. details and are forced to use a public interface to manipulate objects of the 
  6376. class. 
  6377.  
  6378. You can control access to class members by using access specifiers In the 
  6379. following example,  the classabc has three privatedata members a, b, and c, and 
  6380. three publicmember functions add(), mult(), and the constructor abc().  The 
  6381. main() function creates an object danforth of the abc class and then attempts 
  6382. to print the value of the member a for this object: 
  6383.  
  6384. #include <iostream.h>
  6385. class abc
  6386. {
  6387. private:
  6388.       int a, b, c;
  6389. public:
  6390.       abc(int p1, int p2, int p3): a(p1), b(p2), c(p3)
  6391. {}
  6392.       int add() { return a + b + c ;}
  6393.       int mult() { return a * b * c; }
  6394. };
  6395. void main() {
  6396.       abc danforth(1,2,3);
  6397.       cout << "Here is the value of a " <<
  6398. danforth.a << endl;
  6399.                   // This causes an error because a is not
  6400.                   // a public member and thus cannot be accessed
  6401.                   // directly
  6402.       }
  6403.  
  6404. Class members are private by default, so you could omit the keyword private in 
  6405. the definition of abc. Since a is not a public member, the attempt to access 
  6406. its value directly causes an error. 
  6407.  
  6408.  
  6409. ΓòÉΓòÉΓòÉ 9.1.2. Classes and Polymorphic Functions ΓòÉΓòÉΓòÉ
  6410.  
  6411. Classes are also used in C++ to support polymorphic functions through 
  6412. overloaded functions (static compile time binding) and virtual functions ( 
  6413. dynamic binding ). C++ allows you to redefine standard operators and functions 
  6414. through the concept of overloading. Operator overloading facilitates data 
  6415. abstraction by allowing you to use classes as easily as built-in types. 
  6416.  
  6417.  
  6418. ΓòÉΓòÉΓòÉ 9.1.3. Class Declaration Grammar ΓòÉΓòÉΓòÉ
  6419.  
  6420. The syntax is: 
  6421.  
  6422.       class-specifier:
  6423.             class-head
  6424. {[member-list]
  6425. }
  6426.  
  6427.       class-head:
  6428.             class-key
  6429.             class-key identifier
  6430. [base-spec]
  6431.             class-key [identifier]
  6432. base-spec
  6433.             class-key class-name
  6434. [base-spec]
  6435.  
  6436.       class-key:
  6437.             class
  6438.             struct
  6439.             union
  6440.  
  6441. A class-specifier is used to declare a class. Once a class-specifier has been 
  6442. seen and its members declared, a class is considered to be defined even if the 
  6443. member functions of that class are not yet defined. 
  6444.  
  6445. The member-list is optional. It specifies the class members, both data and 
  6446. functions, of the class class-name. If the member-list of a class is empty, 
  6447. objects of that class have a nonzero size. You can use a class-name within the 
  6448. member-list of the class specifier itself as long as the size of the class is 
  6449. not required. For further details, see "Class Member Lists" 
  6450.  
  6451. The base-spec is optional. It specifies the base class or classes from which 
  6452. the class class-name inherits members. If the base-spec is not empty, the class 
  6453. class-name is called a derived class . 
  6454.  
  6455. For a complete summary of class declaration grammar including member and base 
  6456. class grammar see "Class Declaration Grammar Summary" in Appendix B 
  6457.  
  6458.  
  6459. ΓòÉΓòÉΓòÉ 9.1.4. Class Declarator ΓòÉΓòÉΓòÉ
  6460.  
  6461. The declarator for a class variable declared with the class, struct, or union 
  6462. keyword is an identifier. If the symbol * precedes the identifier, the 
  6463. identifier names a pointer to a class of the specified data type. If ** 
  6464. precedes the identifier, the identifier names a pointer to a pointer to a class 
  6465. of the specified data type. 
  6466.  
  6467. If a constant expression enclosed in [ ] (brackets) follows the identifier, the 
  6468. identifier names an array of classes of the specified data type. If * precedes 
  6469. the identifier and a constant expression enclosed in [ ] follows the 
  6470. identifier, the identifier names an array of pointers to classes of the 
  6471. specified data type. 
  6472.  
  6473. You can use classes to build complicated declarators. 
  6474.  
  6475. The union type specifier can be used to declare a class declarator. 
  6476.  
  6477.  
  6478. ΓòÉΓòÉΓòÉ 9.1.5. Class Names ΓòÉΓòÉΓòÉ
  6479.  
  6480. A class-name is a unique identifier that becomes a reserved word within its 
  6481. scope. The syntax is: 
  6482.  
  6483.       class-name:
  6484.           identifier
  6485.  
  6486. You can qualify the names of nested classes by using the :: (scope) operator 
  6487. and the name of their enclosing class. The syntax of a qualified-class-name is: 
  6488.  
  6489.       qualified-class-name:
  6490.             class-name
  6491.             class-name ::
  6492. qualified-class-name
  6493.  
  6494. Where class-name::qualified-class-name specifies the name of the enclosing 
  6495. class (class-name) and the name of the nested class (qualified-class-name). For 
  6496. further details, see "Nested Classes" 
  6497.  
  6498. A complete-class-name is an alternative way of referring to a class after it 
  6499. has been declared. The syntax is: 
  6500.  
  6501.       complete-class-name:
  6502.             qualified-class-name
  6503.             :: qualified-class-name
  6504.  
  6505. An elaborated-type-specifier can also be used with a complete-class-name. The 
  6506. syntax is: 
  6507.  
  6508. :id='CPLRelabts2'.
  6509.       elaborated-type-specifier:
  6510.             class-key complete-class-name
  6511.             class-key identifier
  6512.             enum ::
  6513. enum-name
  6514.             enum enum-name
  6515.  
  6516. Enumerations are described in " "Enumerations" Enumerations " 
  6517.  
  6518. Once a class name is declared, that class name hides other declarations of the 
  6519. same name within the enclosing scope. 
  6520.  
  6521. If a class name is declared in the same scope as a function, enumerator, or 
  6522. object with the same name, that class can be referred to by using an 
  6523. elaborated-type-specifier. In the following example, the elaborated type 
  6524. specifier is used to refer to the class print that is hidden by the later 
  6525. definition of the function print(). 
  6526.  
  6527. class print
  6528. {
  6529.       /* definition of class print */
  6530. };
  6531. void print (class print*);      // redefine print as a function
  6532. //      .                        // prefix class-name by class-key
  6533. //      .                        // to refer to class print
  6534. //      .
  6535. void main ()
  6536. {
  6537.       class print* paper;            // prefix class-name
  6538. by class-key
  6539.                               // to refer to class print
  6540.       print(paper);             // call function print
  6541. }
  6542.  
  6543. You can use an elaborated type specifier with a class name to declare a class. 
  6544. For more details on elaborated type specifiers, see "Incomplete Class 
  6545. Declarations" 
  6546.  
  6547. You can also qualify type names in order to refer to hidden type names in the 
  6548. current scope. You can use a qualified-type-name to reduce complex class name 
  6549. syntax by representing a qualified-class-name using a typedef. The syntax for a 
  6550. qualified-type-name is: 
  6551.  
  6552.       qualified-type-name:
  6553.             typedef-name
  6554.             complete-class-name ::
  6555. typedef-name
  6556.             :: typedef-name
  6557.  
  6558. In the following example, a typedef is used so that the simple name nested can 
  6559. be used in place of outside::middle::inside    . 
  6560.  
  6561. #include <iostream.h>
  6562. class outside {
  6563. public:
  6564.       class middle {
  6565.       public:
  6566.             class inside {
  6567.                   private:
  6568.                         int a;
  6569.                   public:
  6570.                         inside(int a_init = 0): a(a_init)
  6571. {}
  6572.                         void printa();
  6573.             };
  6574.       };
  6575. };
  6576. typedef outside::middle:
  6577. :inside nested;
  6578.  
  6579. void nested::printa() {
  6580.       cout << "Here is a " << this->a <<
  6581. endl;
  6582.       }
  6583. void main() {
  6584.       nested n(9);
  6585.       n.printa();
  6586. }
  6587.  
  6588. See "Nested Classes" for more details on nested classes. 
  6589.  
  6590.  
  6591. ΓòÉΓòÉΓòÉ 9.2. Classes, Structures, and Unions ΓòÉΓòÉΓòÉ
  6592.  
  6593. In C++, a class type can be a union, structure, or class. Each is a type of the 
  6594. user-defined data type class. The default access depends on the class key: 
  6595.  
  6596. o The members of a class declared with the class key class are private by 
  6597.   default. A class is inherited privately by default. 
  6598.  
  6599. o The members of a class declared with the class key struct are public by 
  6600.   default. A structure is inherited publicly by default. 
  6601.  
  6602. o A union is a class declared with the class key union. The members of a union 
  6603.   are publicby default and a union may not be used as a base class in 
  6604.   derivation. 
  6605.  
  6606.  
  6607. ΓòÉΓòÉΓòÉ 9.2.1. Classes and Structures ΓòÉΓòÉΓòÉ
  6608.  
  6609. The C++ class is an extension of the C structure. Because the only difference 
  6610. between a structure and a class is that a structure has publicaccess by default 
  6611. and a class has private access by default, you can use the keywords class or 
  6612. struct to define equivalent classes. For example, in the following code 
  6613. fragment, the class X is equivalent to the structure Y: 
  6614.  
  6615. class X
  6616. {
  6617. int a; // private by default
  6618. public:
  6619.       int f() { return a = 5; }; // public member
  6620. function
  6621. };
  6622. struct Y
  6623. {
  6624. int f() { return a = 5; }; // public by default
  6625. private:
  6626.       int a; // private data member
  6627. };
  6628.  
  6629. If you define a structure and then declare an object of that structure using 
  6630. the keyword class, the members of the object are still public by default. In 
  6631. the following example, main() has access to the members of X even though X is 
  6632. declared as using the keyword class: 
  6633.  
  6634. #include <iostream.h>
  6635. struct x {
  6636.       int a;
  6637.       int b;
  6638.       } ;
  6639.  
  6640. class x X;
  6641.  
  6642. void main() {
  6643.       X.a = 0;
  6644.       X.b = 1;
  6645.       cout << "Here are e and f " << X.a
  6646. << " " << X.b << endl;
  6647.       }
  6648.  
  6649.  
  6650. ΓòÉΓòÉΓòÉ 9.2.2. Aggregate Classes ΓòÉΓòÉΓòÉ
  6651.  
  6652. An aggregate class is a class that has no constructors, no private or protected 
  6653. members, no  base classes, and no virtual functions. 
  6654.  
  6655. For more details, see "Aggregate Initialization" 
  6656.  
  6657.  
  6658. ΓòÉΓòÉΓòÉ 9.2.3. Unions ΓòÉΓòÉΓòÉ
  6659.  
  6660. A union is an object that can hold any one of a set of named members. The 
  6661. members can be of any data type. Members are overlaid in storage. The storage 
  6662. allocated for a union is equal to the storage required for the largest member 
  6663. of the union, plus any padding required for the union to end at a natural 
  6664. boundary of its strictest member. The strictest member is the one that must be 
  6665. aligned along the largest byte boundary. 
  6666.  
  6667. A union can have member functions, including constructors and destructors, but 
  6668. not virtual member functions. A union cannot be used as a base class and cannot 
  6669. be derived from a base class. 
  6670.  
  6671. A union member cannot be a class object that has a constructor, destructor or 
  6672. overloaded copy assignment operator. A member of a union cannot be declared 
  6673. with the keyword static . You can initialize only the first member of a union. 
  6674.  
  6675. The following example shows the initialization of the first union member 
  6676. birthday of the union variable people. 
  6677.  
  6678. union
  6679. {
  6680.       char birthday[9];
  6681.       int age;
  6682.       float weight;
  6683. } people = {"23/07/57"};
  6684.  
  6685. You can also use constructors to initialize a union. 
  6686.  
  6687. The following example defines an unnamed union data type and a union variable 
  6688. named length, containing members of type long int, float, and double occupying 
  6689. the same storage. 
  6690.  
  6691. union
  6692. {
  6693.       float metres;
  6694.       double centimetres;
  6695.       long inches;
  6696. } length;
  6697.  
  6698.  
  6699. ΓòÉΓòÉΓòÉ 9.2.4. Anonymous Unions ΓòÉΓòÉΓòÉ
  6700.  
  6701. An anonymous union is a union without a class name. It cannot be followed by a 
  6702. declarator. An anonymous union is not a type; it cannot have member functions. 
  6703.  
  6704. The member names of an anonymous union must be distinct from other names within 
  6705. the scope in which the union is declared. You can use member names directly in 
  6706. the union scope without any additional member access syntax. For example, in 
  6707. the following code fragment, you can access the data members i and cptr 
  6708. directly because they are in the scope containing the anonymous union. Because 
  6709. i and cptr are union members and have the same address, you should only use one 
  6710. of them at a time. The assignment to the member cptr will change the value of 
  6711. the member i. 
  6712.  
  6713. void f()
  6714. {
  6715. union { int i; char* cptr ;};
  6716. //      .
  6717. //      .
  6718. //      .
  6719. i = 5;
  6720. cptr = "stringinunion"; // overrides i
  6721. }
  6722.  
  6723. An anonymous union cannot have protected or private members. Anonymous unions 
  6724. must be declared with the keyword static . 
  6725.  
  6726.  
  6727. ΓòÉΓòÉΓòÉ 9.3. Class Declarations and Objects ΓòÉΓòÉΓòÉ
  6728.  
  6729. A class declaration creates a unique type class name.  You can use a class type 
  6730. to create instances or objects of that class type. For example you can declare 
  6731. a class, structure, and union with class names X, Y, and Z respectively: 
  6732.  
  6733. class X {       /* definition of class X /* };
  6734. struct Y {       /* definition of struct Y */ };
  6735. union Z {       /* definition of union Z */ };
  6736.  
  6737. You can then declare objects of each of these class types. Remember that 
  6738. classes, structures, and unions are all types of C++ classes. 
  6739.  
  6740. void main()
  6741. {
  6742.       X xobj;      // declare a class object of class type
  6743. X
  6744.       Y yobj;      // declare a struct object of class type
  6745. Y
  6746.       Z zobj;      // declare a union object of class type
  6747. Z
  6748. }
  6749.  
  6750. In C++, unlike C, you do not need to precede declarations of class objects with 
  6751. the keywords union, struct, and class unless the name of the class is hidden. 
  6752. For example, 
  6753.  
  6754. struct Y { /* ... */ };
  6755. class X { /* ... */ };
  6756. void main ()
  6757. {
  6758.       int X;             // hides the class name X
  6759.       Y yobj;            // valid
  6760.       X xobj;            // error, class name X is hidden
  6761.       class X xobj;       // valid
  6762. }
  6763.  
  6764. For more details on hidden names, see "Scope of Class Names" 
  6765.  
  6766. When you declare more than one class object in a declaration, the declarators 
  6767. are treated as if declared individually. For example, if you declare two 
  6768. objects of class S in a single declaration: 
  6769.  
  6770. class S { /* ... */ };
  6771. //      .
  6772. //      .
  6773. //      .
  6774. void main()
  6775. {
  6776.       S S,T; // declare two objects of class type S
  6777. }
  6778.  
  6779. this declaration is equivalent to: 
  6780.  
  6781. class S { /* ... */ };
  6782. void main()
  6783. {
  6784.       S S;
  6785.       class S T;       // keyword class is required
  6786.                   // since variable S hides class type S
  6787. }
  6788.  
  6789. but is not equivalent to: 
  6790.  
  6791. class S { /* ... */ };
  6792. //      .
  6793. //      .
  6794. //      .
  6795. void main()
  6796. {
  6797.       S S;
  6798.       S T;             // error, S class type is hidden
  6799. }
  6800.  
  6801. You can also declare references to classes, pointers to classes, and arrays of 
  6802. classes. For example, 
  6803.  
  6804. class X { /* ... */ };
  6805. struct Y { /* ... */ };
  6806. union Z { /* ... */ };
  6807. void main()
  6808. {
  6809.       X xobj;
  6810.       X &xref = xobj;       // reference to class object
  6811. of type X
  6812.       Y *yptr;             // pointer to struct object of
  6813. type Y
  6814.       Z zarray[10];       // array of 10 union objects of
  6815. type Z
  6816. }
  6817.  
  6818. Objects of class types that are not  copy restricted can be assigned, passed as 
  6819. arguments to functions, and returned by functions. 
  6820.  
  6821. For more details on objects, see also "Objects" Initialization of classes is 
  6822. discussed in "Initialization by Constructor" 
  6823.  
  6824.  
  6825. ΓòÉΓòÉΓòÉ 9.4. Scope of Class Names ΓòÉΓòÉΓòÉ
  6826.  
  6827. A class declaration introduces the class name into the scope where it is 
  6828. declared. Any class, object, function or other declaration of that name in an 
  6829. enclosing scope is hidden. If a class name is declared in a scope where an 
  6830. object, function, or enumerator of the same name is also declared, you can only 
  6831. refer to the class by using the elaborated type specifier. The class key 
  6832. (class, struct, or union) must precede the class name to identify it. For 
  6833. example: 
  6834.  
  6835. class x { int a; };      // declare a class
  6836. typeclass-name
  6837. x
  6838. x xobject;             // declare object of class type x
  6839. int x(class x*)      // redefine x to be a function
  6840. {return 0;}            // use class-key class to define
  6841.                   // a pointer to the class type x
  6842.                   // as the function argument
  6843. void main()
  6844. {
  6845.       class x* xptr;      // use class-key classto
  6846. define
  6847.                         // a pointer to class type x
  6848.       xptr = &xobject;       // assign pointer
  6849.        x(xptr);            // call function x with pointer
  6850. to class x
  6851. }
  6852.  
  6853. An elaborated type specifier can be used in the declaration of objects and 
  6854. functions. See "Class Names" for an example. 
  6855.  
  6856. An elaborated type specifier can also be used in the incomplete declaration of 
  6857. a class type to reserve the name for a class type within the current scope. 
  6858.  
  6859.  
  6860. ΓòÉΓòÉΓòÉ 9.4.1. Incomplete Class Declarations ΓòÉΓòÉΓòÉ
  6861.  
  6862. An incomplete class declaration is a class declaration that does not define any 
  6863. class members. You cannot declare any objects of the class type or refer to the 
  6864. members of a class until the declaration is complete. However, an incomplete 
  6865. declaration allows you to make specific references to a class prior to its 
  6866. definition as long as the size of the class is not required. For example, you 
  6867. can define a pointer to the structure first in the definition of the 
  6868. structuresecond. first is declared in an incomplete class declaration prior to 
  6869. the definition of second, and the definition of oneptr in structure second does 
  6870. not require the size of first: 
  6871.  
  6872. struct first;            // incomplete declaration of struct
  6873. first
  6874. struct second             // complete declaration of struct
  6875. second
  6876. {
  6877.       first* oneptr;      // pointer to structfirst
  6878. refers to
  6879.                         // struct first prior to its complete
  6880.                         // declaration
  6881.       first one;            // error, you cannot declare an
  6882. object of
  6883.                         // an incompletely declared class type
  6884.       int x, y;
  6885. };
  6886.  
  6887. struct first                  // complete declaration of struct
  6888. first
  6889. {
  6890.       second two;            // define an object of class
  6891. type second
  6892.       int z;
  6893. };
  6894.  
  6895. If you declare a class with an empty member list, it is a complete class 
  6896. declaration. For example, 
  6897.  
  6898. class X;             // incomplete class declaration
  6899. class Z {};            // empty member list
  6900. class Y
  6901. {
  6902. public:
  6903.       X yobj;      // error, cannot create an object of an
  6904.                   // incomplete class type
  6905.       Z zobj;      // valid
  6906. };
  6907.  
  6908. Member lists are described on page Class Member Lists. 
  6909.  
  6910.  
  6911. ΓòÉΓòÉΓòÉ 9.4.2. Nested Classes ΓòÉΓòÉΓòÉ
  6912.  
  6913. A nested class is declared within the scope of another class. The name of a 
  6914. nested class is local to its enclosing class. Unless you use explicit pointers, 
  6915. references, or object names, declarations in a nested class can only use 
  6916. visible constructs, including type names, static members, and enumerators from 
  6917. the enclosing class and global variables. 
  6918.  
  6919. Member functions of a nested class follow regular access rules and have no 
  6920. special access privileges to members of their enclosing classes. Member 
  6921. functions of the enclosing class have no special access to members of a nested 
  6922. class. 
  6923.  
  6924. You can define member functions and static data members of a nested class in 
  6925. the global scope. For example, in the following code fragment, you can access 
  6926. the static members x and y and member functions f() and g() of the nested class 
  6927. nested by using a qualified type name. Qualified type names allow you to define 
  6928. a typedef  to represent a qualified class name. You can then use the typedef 
  6929. with the :: (scope) operator to refer to a nested class or class member, as 
  6930. shown in the following example: 
  6931.  
  6932. class outside
  6933. {
  6934. public:
  6935.       class nested
  6936.       {
  6937.       public:
  6938.             static int x;
  6939.             static int y;
  6940.             int f();
  6941.             int g();
  6942.       };
  6943. };
  6944. int outside::nested::x = 5;
  6945. int outside::nested::f() { return 0;};
  6946. typedef outside::nested outnest;       // define a typedef
  6947. int outnest::y = 10;                   // use typedef with ::
  6948. int outnest::g() { return 0;};
  6949. //      . . .
  6950.  
  6951. Qualified class names are described on page -- Reference CPLRclaQualClas not 
  6952. found --. 
  6953.  
  6954.  
  6955. ΓòÉΓòÉΓòÉ 9.4.3. Local Classes ΓòÉΓòÉΓòÉ
  6956.  
  6957. A local class is declared within a function definition. The local class is in 
  6958. the scope of the enclosing function scope. Declarations in a local class can 
  6959. only use type names, enumerations, static variables from the enclosing scope, 
  6960. as well as external variables and functions. For example: 
  6961.  
  6962. int x;                         // global variable
  6963. void f()                         // function definition
  6964. {
  6965.       static int y;                  // static variable y can
  6966. be used by
  6967.                               // local class
  6968.       int x;                        // auto variable x cannot
  6969. be used by
  6970.                               // local class
  6971.       extern int g();            // extern function g can
  6972. be used by
  6973.                               // local class
  6974.       class local                  // local class
  6975.       {
  6976.             int g() { return x;}      // error, local
  6977. variable
  6978. x
  6979.                                     // cannot be used by g
  6980.             int h() { return y;}      // valid,static
  6981. variable
  6982. y
  6983.             int k() { return ::x;}      // valid, global x
  6984.             int l() { return g();}       // valid, extern
  6985. function g
  6986.       };
  6987. }
  6988. void main()
  6989. {
  6990.       local* z;             // error, local is undefined
  6991. //      .
  6992. //      .
  6993. //      .
  6994. }
  6995.  
  6996. Member functions of a local class have to be defined within their class 
  6997. definition. Thus, member functions of a local class must be inline functions. 
  6998. Like all member functions, those defined within the scope of a local class do 
  6999. not need the keyword inline. 
  7000.  
  7001. A local class cannot have static data members.  In the following example, an 
  7002. attempt to define a static member of a local class causes an error. 
  7003.  
  7004. void f()
  7005. {
  7006.       class local
  7007.       {
  7008.             int f();            // error, local class has noninline
  7009.                               // member function
  7010.             int g() {return 0;}      // valid, inline
  7011. member
  7012. function
  7013.             static int a;      // error, static is not allowed
  7014. for
  7015.                               // local class
  7016.             int b;             // valid, nonstatic variable
  7017.       };
  7018. }
  7019. //      . . .
  7020.  
  7021. An enclosing function has no special access to members of the local class. 
  7022.  
  7023.  
  7024. ΓòÉΓòÉΓòÉ 9.4.4. Local Type Names ΓòÉΓòÉΓòÉ
  7025.  
  7026. Local type names follow the same scope rules as other names. Type names defined 
  7027. within a class declaration have local scope and cannot be used outside their 
  7028. class without qualification. 
  7029.  
  7030. If you use a class name, typedef name, or a constant name that is used in a 
  7031. type name, in a class declaration, you cannot redefine that name after it is 
  7032. used in the class declaration. For example: 
  7033.  
  7034. void main ()
  7035. {
  7036.       typedef double db;
  7037.       struct st
  7038.       {
  7039.             db x;
  7040.             typedef int db; // error
  7041.             db y;
  7042.       };
  7043. }
  7044.  
  7045. The following declarations are valid: 
  7046.  
  7047. typedef float T;
  7048. class s {
  7049.       typedef int T;
  7050.       void f(const T);
  7051. };
  7052.  
  7053. Here, function f() takes an argument of type s::T. However, the following 
  7054. declarations, where the order of the members of s has been reversed, cause an 
  7055. error: 
  7056.  
  7057. typedef float T;
  7058. class s {
  7059.       void f(const T);
  7060.       typedef int T;
  7061. };
  7062.  
  7063. In a class declaration, you cannot redefine a name that is not a class name or 
  7064. a typedef name to a class name or typedef name once you have used that name in 
  7065. the class declaration. 
  7066.  
  7067.  
  7068. ΓòÉΓòÉΓòÉ 9.5. Related Information ΓòÉΓòÉΓòÉ
  7069.  
  7070. "The C++ Language" 
  7071.  
  7072. "C++ Support of Object-Oriented Programming" 
  7073.  
  7074. "Class Members and Friends " 
  7075.  
  7076. "Inheritance" 
  7077.  
  7078.  
  7079. ΓòÉΓòÉΓòÉ 10. Chapter 10. Class Members and Friends ΓòÉΓòÉΓòÉ
  7080.  
  7081. This chapter describes class members and friends, including the following 
  7082. topics: 
  7083.  
  7084. o Class member lists 
  7085. o Data members 
  7086. o Class type class members 
  7087. o Member bit fields 
  7088. o Member functions 
  7089. o Member scope 
  7090. o Pointers to members 
  7091. o The this pointer 
  7092. o Static members 
  7093. o Member access 
  7094. o Friends. 
  7095.  
  7096. You can also return to the table of contents 
  7097.  
  7098.  
  7099. ΓòÉΓòÉΓòÉ 10.1. Class Member Lists ΓòÉΓòÉΓòÉ
  7100.  
  7101. An optional member list declares objects called class members. Class members 
  7102. can be data, functions, classes, enumeration, bit fields, and type names. A 
  7103. member list is the only place you can declare class members. Friend 
  7104. declarations are not class members but must appear in member lists. 
  7105.  
  7106. You can access members by using the class access . (dot) and -> (arrow) 
  7107. operators. 
  7108.  
  7109.  
  7110. ΓòÉΓòÉΓòÉ 10.1.1. Member List Grammar ΓòÉΓòÉΓòÉ
  7111.  
  7112. The syntax for a member list is: 
  7113.  
  7114.       member-list:
  7115.            member-declaration
  7116. [member-list]
  7117.            access-specifier
  7118. :[member-list]
  7119.  
  7120.       member-declaration:
  7121.             [decl-specifiers][member-declarator-list]
  7122. ;
  7123.             function-definition [;]
  7124.             qualified-name ;
  7125.  
  7126.       member-declarator-list:
  7127.            member-declarator
  7128.            member-declarator-list ,
  7129. member-declarator
  7130.  
  7131.       member-declarator:
  7132.            declarator
  7133. [pure-specifier]
  7134.             [identifier]
  7135. :
  7136. constant-expression
  7137.  
  7138. :id='Atz3230antl'.
  7139.       pure-specifier:
  7140.             = 0
  7141.  
  7142. A member-declaration declares a class member for the class containing the 
  7143. declaration. 
  7144.  
  7145. An access-specifier  is one of public, private, or protected. 
  7146.  
  7147. decl-specifiers are described in "Specifiers" They include the following: 
  7148.  
  7149. o storage-class-specifiers 
  7150. o type-specifiers 
  7151. o fct-specifiers 
  7152. o template-specifier 
  7153. o friend 
  7154. o typedef. 
  7155.  
  7156. A member-declaration that is a qualified-name followed by a ; (semi colon) is 
  7157. used to restore access to members of base classes and is described in "Access 
  7158. Declarations". 
  7159.  
  7160. A member-declarator declares an object, function, or type within a declaration. 
  7161. It cannot contain an initializer. You can initialize a member by using a 
  7162. constructor or, if the member belongs to an aggregate class, by using a brace 
  7163. initializer list ( a list surrounded by braces { }) in the declarator list. You 
  7164. must explicitly initialize a class containing constant or reference members 
  7165. with a brace initializer list or explicitly with a constructor. Initialization 
  7166. using an brace initializer list is described in "Aggregate Initialization". 
  7167. Explicit initialization with a constructor is described in "Explicit 
  7168. Initialization". 
  7169.  
  7170. A member declarator of the form: 
  7171.  
  7172.       [ identifier ] :
  7173. constant-expression
  7174.  
  7175. specifies a bit field. 
  7176.  
  7177. A pure-specifier indicates that a function has no definition. A pure-specifier 
  7178. is only used with virtual member functions. A pure-specifier replaces the 
  7179. function definition of a member function in the member list. pure-specifiers 
  7180. are described in "Virtual Functions" 
  7181.  
  7182. You can use the storage-class specifier static (but not extern, auto or 
  7183. register), in amember list. For more details, see "Static Members" 
  7184.  
  7185. The order of mapping of class members in a member list is implementation 
  7186. dependent. For more details, see "Classes, Structures, and Unions" in "Appendix 
  7187. C. 
  7188.  
  7189. For a complete summary of class declaration grammar including class member and 
  7190. base class grammar, see "Class Declaration Grammar Summary" in Appendix B 
  7191.  
  7192.  
  7193. ΓòÉΓòÉΓòÉ 10.2. Data Members ΓòÉΓòÉΓòÉ
  7194.  
  7195. Data members include members that are declared with any of the fundamental 
  7196. types, as well as other types, including pointer, reference, array types, and 
  7197. user-defined types. You can declare a data member the same way as a variable, 
  7198. except that explicit initializers are not allowed inside the class definition. 
  7199.  
  7200. If an array is declared as a nonstatic class member, you must specify all of 
  7201. the dimensions of the array. 
  7202.  
  7203.  
  7204. ΓòÉΓòÉΓòÉ 10.3. Class Type Class Members ΓòÉΓòÉΓòÉ
  7205.  
  7206. A class can have members that are of a class type or are pointers or references 
  7207. to a class type. Members that are of a class type must be of a class type that 
  7208. is previously declared.  An incomplete class type can be used in a member 
  7209. declaration as long as the size of the class is not needed. For example, a 
  7210. member can be declared that is a pointer to an incomplete class type. A class X 
  7211. cannot have a member that is of type X, but it can contain pointers to X, 
  7212. references to X, and static objects of X. Member functions of X can take 
  7213. arguments of type X and have a return type of X.  For example: 
  7214.  
  7215. class X
  7216. {
  7217.       X();
  7218.       X *xptr;
  7219.       X &xref;
  7220.       static X xcount;
  7221.       X xfunc(X);
  7222. };
  7223.  
  7224. The bodies of member functions are always processed after the definition of 
  7225. their class is complete. Thus, the body of a member function can use the 
  7226. enclosing class. Consider the following example: 
  7227.  
  7228. class Y
  7229. {
  7230. public:
  7231.       int a;
  7232.       Y ();
  7233. private:
  7234.       int f() {return sizeof(Y);}
  7235.       void g(Y yobj);
  7236.       Y h(int a);
  7237. };
  7238.  
  7239. In this example, the inline function f() uses the size of class Y. 
  7240.  
  7241.  
  7242. ΓòÉΓòÉΓòÉ 10.4. Member Bit Fields ΓòÉΓòÉΓòÉ
  7243.  
  7244. A class can contain packed data known as bit fields. You can use bit fields for 
  7245. data that requires just a few bits of storage. The syntax for a bit field is: 
  7246.  
  7247.       [ identifier ] :
  7248. constant-expression
  7249.  
  7250. The constant expression specifies how many bits the field reserves. A bit field 
  7251. that is defined as having a length of 0 (zero) causes the next field to be 
  7252. aligned on the next integer boundary. Bit fields with a length of zero must be 
  7253. unnamed. 
  7254.  
  7255. Unlike ANSI C, bit fields can be any integral type or enumeration type. When 
  7256. you assign a value to a bit field that is out of range, the bit pattern is 
  7257. preserved and the appropriate bits are assigned. 
  7258.  
  7259. The following restrictions apply to member bit fields. You cannot: 
  7260.  
  7261. o Have a reference to a bit field 
  7262. o Define an array of bit fields 
  7263. o Take the address of a bit field. 
  7264.  
  7265. The maximum bit field length is implementation dependent. For more details see 
  7266. "Bit Fields" in Appendix C. 
  7267.  
  7268.  
  7269. ΓòÉΓòÉΓòÉ 10.5. Member Functions ΓòÉΓòÉΓòÉ
  7270.  
  7271. Member functions are operators and functions that are declared as members of a 
  7272. class. Member functions do not include operators and functions declared with 
  7273. the friend  specifier. These are called friends of a class. 
  7274.  
  7275. The definition of a member function is within the scope of its enclosing class. 
  7276. The body of a member function is analyzed after the class declaration so that 
  7277. members of that class can be used in the member function body. When the 
  7278. functionadd() is called in the following example, the data variables a, b, and 
  7279. c may be used in the body of add(). 
  7280.  
  7281. class x
  7282. {
  7283. public:
  7284.       int add()             // inline member function add
  7285.       {return a+b+c;};
  7286. private:
  7287.       int a,b,c;
  7288. };
  7289.  
  7290. For information on static member functions, see "Static Member Functions" For 
  7291. more general information on functions, see Chapter 8, "Functions" For more 
  7292. general information on functions, see Chapter 8, "Functions" 
  7293.  
  7294.  
  7295. ΓòÉΓòÉΓòÉ 10.5.1. const and volatile Member Functions ΓòÉΓòÉΓòÉ
  7296.  
  7297. A member function declared with the const qualifier can be called for constant 
  7298. and nonconstant objects. A nonconstant member function can only be called for a 
  7299. nonconstant object. Similarly, a member function declared with the volatile 
  7300. qualifier can be called for volatile and nonvolatile objects. A nonvolatile 
  7301. member function can only be called for a nonvolatile object. 
  7302.  
  7303.  
  7304. ΓòÉΓòÉΓòÉ 10.5.2. Virtual Member Functions ΓòÉΓòÉΓòÉ
  7305.  
  7306. Virtual member functions are declared with the keyword virtual.They allow 
  7307. dynamic binding of member functions. Because all virtual functions must be 
  7308. member functions, virtual member functions are simply called virtual functions. 
  7309.  
  7310. If the definition of a virtual function is replaced by a pure specifier in the 
  7311. declaration of the function, the function is said to be declared pure. A class 
  7312. that has at least one pure virtual function is called an abstract class. 
  7313.  
  7314.  
  7315. ΓòÉΓòÉΓòÉ 10.5.3. Special Member Functions ΓòÉΓòÉΓòÉ
  7316.  
  7317. Special member functions  are used to create, destroy, initialize, convert, and 
  7318. copy class objects. These include constructors, destructors, conversion 
  7319. constructors, conversion functions, and copy constructors. 
  7320.  
  7321.  
  7322. ΓòÉΓòÉΓòÉ 10.5.4. Inline Member Functions ΓòÉΓòÉΓòÉ
  7323.  
  7324. A member function that is both declared and defined in the class member list is 
  7325. called an inline member function. Member functions containing a few lines of 
  7326. code are usually declared inline. 
  7327.  
  7328. An equivalent way to declare an inline member function is to declare it outside 
  7329. of the class declaration using the keyword inline and the :: (scope) operator 
  7330. to identify the class the member function belongs to. For example: 
  7331.  
  7332. class Y
  7333. {
  7334.       char* a;
  7335. public:
  7336.       char* f() {return a;}
  7337. };
  7338.  
  7339. is equivalent to: 
  7340.  
  7341. class Z
  7342. {
  7343.       char* a;
  7344. public:
  7345.       char* f();
  7346. };
  7347. // .
  7348. // .
  7349. // .
  7350. inline char* Z::f() {return a;}
  7351.  
  7352. When you declare an inline function without the inline keyword and do not 
  7353. define it in the class member list, you cannot call the function before you 
  7354. define it. Thus, in the above example you could not call f() until after its 
  7355. definition. 
  7356.  
  7357. Inline member functions have internal linkage. Noninline member functions have 
  7358. external linkage. 
  7359.  
  7360. For more details, see "Inline Functions" 
  7361.  
  7362.  
  7363. ΓòÉΓòÉΓòÉ 10.5.5. Member Function Templates ΓòÉΓòÉΓòÉ
  7364.  
  7365. Member function templates are described in "Member Function Templates" 
  7366.  
  7367.  
  7368. ΓòÉΓòÉΓòÉ 10.6. Member Scope ΓòÉΓòÉΓòÉ
  7369.  
  7370. Member functions and static members can be defined outside their class 
  7371. declaration if they have already been declared, but not defined, in the class 
  7372. member list. Nonstatic data members are defined when their class is 
  7373. instantiated. The declaration of a static data member is not a definition. The 
  7374. declaration of a member function is a definition if the body of the function is 
  7375. also given. 
  7376.  
  7377. Whenever the definition of a class member appears outside of the class 
  7378. declaration, the member name must be qualified by the class name using the :: 
  7379. (scope) operator. For example: 
  7380.  
  7381. #include <iostream.h>
  7382. class X
  7383. {
  7384. public:
  7385.       int a, b ;      // public data members
  7386.       int add();      // member function declaration only
  7387. };
  7388. int a  = 10 ; // global variable
  7389. // define member function outside its class declaration
  7390. int X::add() {return a + b;};
  7391. //      .
  7392. //      .
  7393. //      .
  7394. void main()
  7395. {
  7396.       int answer;
  7397.       X xobject;
  7398.       xobject.a = 1;
  7399.       xobject.b = 2;
  7400.       answer = xobject.add();
  7401.       cout << xobject.a << " + " <<
  7402. xobject.b << " = " << answer;
  7403. }
  7404.  
  7405. The output for this example is: 1 + 2 = 3 
  7406.  
  7407. All member functions are in class scope even if they are defined outside their 
  7408. class declaration. In the above example, the member function add() returns the 
  7409. data member a, not the global variable a. 
  7410.  
  7411. The name of a class member is local to its class. Unless you use one of the 
  7412. class access operators, . (dot) or -> (arrow), or the :: (scope) operator, you 
  7413. can only use a class member in a member function of its class and in nested 
  7414. classes. You can only use types, enumerations and static members in a nested 
  7415. class without qualification with the :: (scope) operator. 
  7416.  
  7417. The order of search for a name in a member function body is: 
  7418.  
  7419. o Within the member function body itself 
  7420. o Within the all the enclosing classes, including inherited members of those 
  7421.   classes. 
  7422. o Within the lexical scope of the body declaration. 
  7423.  
  7424. The search of the enclosing classes, including inherited members, is 
  7425. demonstrated in the following example: 
  7426.  
  7427. class A { /*    */ };
  7428. class B { /*    */ };
  7429. class C { /*    */ };
  7430. class Z : A {
  7431.       class Y : B {
  7432.             class X : C { int f(); /* ... */ };
  7433.       };
  7434. };
  7435. int Z:::X f()
  7436. {
  7437.       /*
  7438.       ...
  7439.       */
  7440.       j();
  7441.       /*
  7442.       ...
  7443.       */
  7444. }
  7445.  
  7446. In this example, the search for the name j in the definition of the function f 
  7447. follows this order: 
  7448.  
  7449. o In the body of the function f 
  7450.  
  7451. o In X and in its base class C 
  7452.  
  7453. o In Y and in its base class B 
  7454.  
  7455. o In Z and in its base class A 
  7456.  
  7457. o In the lexical scope of the body of f. In this case, this is global scope. 
  7458.  
  7459. Note:  When the containing classes are being searched, only the definitions of 
  7460. the containing classes and their base classes are searched. The scope 
  7461. containing the base class definitions (global scope, in this example) is not 
  7462. searched. 
  7463.  
  7464.  
  7465. ΓòÉΓòÉΓòÉ 10.7. Pointers to Members ΓòÉΓòÉΓòÉ
  7466.  
  7467. Pointers to members allow you to refer to nonstatic members of class objects. 
  7468. You cannot use a pointer to member to point to a static class member because 
  7469. the address of a static member is not associated with any particular object. To 
  7470. point to a static class member, you must use a normal pointer. 
  7471.  
  7472. You can use pointers to member functions in the same manner as pointers to 
  7473. functions. You can compare pointers to member functions, assign values to them, 
  7474. and use them to call member functions. Note that a member function does not 
  7475. have the same type as a nonmember function that has the same number and type of 
  7476. arguments and the same return type. 
  7477.  
  7478. Pointers to members can be declared and used as shown in the following example, 
  7479.  
  7480. #include <iostream.h>
  7481. class X
  7482. {
  7483. public:
  7484.       int a;
  7485.       void f(int b) {cout << "The value of b is
  7486. "<< b << endl;}
  7487. };
  7488. //      .
  7489. //      .
  7490. //      .
  7491. void main ()
  7492. {
  7493.       // declare pointer to data member
  7494.       int X::*ptiptr = &X::a;
  7495.       // declare a pointer to member function
  7496.       void (X::* ptfptr) (int) = &X::f;
  7497.       X xobject;                  // create an object of class
  7498. type X
  7499.       xobject.*ptiptr = 10;       // initialize data member
  7500.       cout << "The value of a is " << xobject.*ptiptr
  7501. << endl;
  7502.       (xobject.*ptfptr) (20);     // call member function
  7503. }
  7504.  
  7505. The output for this example is: 
  7506.  
  7507. The value of a is 10
  7508. The value of b is 20
  7509.  
  7510. In order to reduce complex syntax, you can declare a typedef  to be a pointer 
  7511. to a member. A pointer to a member can be declared and used as shown in the 
  7512. following code fragment: 
  7513.  
  7514. typedef void (X::*ptfptr) (int);      // declare typedef
  7515. void main ()
  7516. {
  7517. //      .
  7518. //      .
  7519. //      .
  7520. ptfptr ptf = &X::f;                   // use typedef
  7521. X xobject;
  7522. (xobject.*ptf) (20);                  // call function
  7523. }
  7524.  
  7525. The pointer to member operators.* and ->* are used to bind a pointer to a 
  7526. member of a specific class object. Because the precedence of ( ) (function call 
  7527. operator) is higher than .* and ->*, you must use parentheses to call the 
  7528. function pointed to by ptf. 
  7529.  
  7530. For more details, see "Pointer to Member Operators" 
  7531.  
  7532.  
  7533. ΓòÉΓòÉΓòÉ 10.8. The this Pointer ΓòÉΓòÉΓòÉ
  7534.  
  7535. The keyword this identifies a special type of pointer. When a nonstatic member 
  7536. function is called, the this pointer identifies the class object which the 
  7537. member function is operating on. You cannot declare the this pointer or make 
  7538. assignments to it. 
  7539.  
  7540. The type of the this pointer for a member function of a class type X, is X* 
  7541. const. If the member function is declared with the constant qualifier, the type 
  7542. of the this pointer for that member function for class X, is const X* const. If 
  7543. the member function is declared with the volatile qualifier, the type of the 
  7544. this pointer for that member function for class X is volatile X* const. 
  7545.  
  7546. this is passed as a hidden argument to all nonstatic member function calls and 
  7547. is available as a local variable within the body of all nonstatic functions. 
  7548.  
  7549. For example, you can refer to the particular class object that a member 
  7550. function is called for by using the this pointer in the body of the member 
  7551. function.The following code example produces the output a =  5: 
  7552.  
  7553. #include <iostream.h>
  7554. class X
  7555. {
  7556.       int a;
  7557. public:
  7558.       // The 'this' pointer is used to retrieve 'xobj.a'
  7559. hidden by
  7560.       // the automatic variable 'a'
  7561.       void Set_a(int a) { this->a = a; }
  7562.       void Print_a() { cout << "a = " <<
  7563. a << endl; }
  7564. };
  7565. void main()
  7566. {
  7567.       X xobj;
  7568.       int a = 5;
  7569.       xobj.Set_a(a);
  7570.       xobj.Print_a();
  7571. }
  7572.  
  7573. Unless a class member name is hidden, using the class member name is equivalent 
  7574. to using the class member name qualified with the this pointer. 
  7575.  
  7576. The following example shows code using class members without the this pointer. 
  7577. The comments on each line show the equivalent code with the hidden use of the 
  7578. this pointer. 
  7579.  
  7580. #include <string.h>
  7581. #include <iostream.h>
  7582. class X
  7583. {
  7584.       int len;
  7585.        char *ptr;
  7586. public:
  7587.       int GetLen()                    // int GetLen (X* const this)
  7588.       { return len; }       // { return this->len;
  7589. }
  7590.       char * GetPtr()                 // char * GetPtr (X* const this)
  7591.       { return ptr; }       // { return this->ptr;
  7592. }
  7593.       X& Set(char *);
  7594.        X& Cat(char *);
  7595.        X& Copy(X&);
  7596.        void Print();
  7597. };
  7598. X& X::Set(char *pc)                  // X& X::Set(X* const this,
  7599. char *pc)
  7600. {
  7601.       len = strlen(pc);              // this->len = strlen(pc);
  7602.       ptr = new char[len]; // this->ptr = new
  7603. char[this->len];
  7604.       strcpy(ptr, pc);               // strcpy(this->ptr, pc);
  7605.       return *this;
  7606. }
  7607. X& X::Cat(char *pc)                 // X& X::Cat(X* const this,
  7608. char *pc)
  7609. {
  7610.       len += strlen(pc);            // this->len += strlen(pc);
  7611.       strcat(ptr,pc);               // strcat(this->ptr,pc);
  7612.       return *this;
  7613. }
  7614. X& X::Copy(X& x)                    // X& X::Copy(X* const this,
  7615. X& x)
  7616. {
  7617.       Set(x.GetPtr());              // this->Set(x.GetPtr(&x));
  7618.       return *this;
  7619. }
  7620. void X::Print()                     // void X::Print(X* const
  7621. this)
  7622. {
  7623.       cout << ptr << endl;          // cout <<
  7624. this->ptr << endl;
  7625. }
  7626. void main()
  7627. {
  7628.       X xobj1;
  7629.        xobj1.Set("abcd").Cat("efgh");
  7630.       // xobj1.Set(&xobj1, "abcd").Cat(&xobj1, "efgh");
  7631.       xobj1.Print();      // xobj1.Print(&xobj1);
  7632.        X xobj2;
  7633.        xobj2.Copy(xobj1).Cat("ijkl");
  7634.       // xobj2.Copy(&xobj2, xobj1).Cat(&xobj2, "ijkl");
  7635.       xobj2.Print();      // xobj2.Print(&xobj2);
  7636. }
  7637.  
  7638. The above example produces the following output: 
  7639.  
  7640. abcdefgh
  7641. abcdefghijkl
  7642.  
  7643.  
  7644. ΓòÉΓòÉΓòÉ 10.9. Static Members ΓòÉΓòÉΓòÉ
  7645.  
  7646. Class members can be declared using the storage-class specifier static  in the 
  7647. class member list. There is only one copy of the static member that is shared 
  7648. by all objects of a class in a program. When you declare an object of a class 
  7649. having a static member, the static member is not part of the class object. 
  7650.  
  7651. A typical use of static members is for recording data common to all objects of 
  7652. a class. For example, you can use a static data member as a counter to store 
  7653. the number of objects of a particular class type that are created. Each time a 
  7654. new object is created, this static data member can be incremented to keep track 
  7655. of the total number of objects. 
  7656.  
  7657. The declaration of a static member in the member list of a class is not a 
  7658. definition. The definition of a static member is equivalent to an external 
  7659. variable definition. You must define the static member outside of the class 
  7660. declaration. For example: 
  7661.  
  7662. class X
  7663. {
  7664. public:
  7665.       static int i;
  7666. }
  7667. int X:
  7668. :i = 0; // definition outside class declaration
  7669. //      .
  7670. //      .
  7671. //      .
  7672.  
  7673. A static member can be accessed from outside of its class only if it is 
  7674. declared with the keyword public . You can then access the static member by 
  7675. qualifying the class name using the :: (scope) operator. In the following 
  7676. example: 
  7677.  
  7678. class X
  7679. {
  7680. public:
  7681.       static int f();
  7682. };
  7683. //      .
  7684. //      .
  7685. //      .
  7686. void main ()
  7687. {
  7688.       X::f();
  7689. }
  7690.  
  7691. you can refer to the static member f() of class type X as X:. 
  7692.  
  7693.  
  7694. ΓòÉΓòÉΓòÉ 10.9.1. Using the Class Access Operators with Static Members ΓòÉΓòÉΓòÉ
  7695.  
  7696. You can also access a static member from a class object by using the class 
  7697. access operators . ( dot ) and -> ( arrow ). For example: 
  7698.  
  7699. #include <iostream.h>
  7700. class X
  7701. {
  7702.       static int cnt;
  7703. public:
  7704.       // The following routines all set X's static variable
  7705. cnt
  7706.       // and print its value
  7707.       void Set_Show (int i)
  7708.       {      X::cnt = i;
  7709.             cout << "X::cnt = " << X::cnt
  7710. << endl; }
  7711.       void Set_Show (int i, int j )
  7712.       {       this->cnt = i+j;
  7713.             cout << "X::cnt = " << X::cnt
  7714. << endl; }
  7715.       void Set_Show (X& x, int i)
  7716.       {       x.cnt = i;
  7717.             cout << "X::cnt = " << X::cnt
  7718. << endl; }
  7719. };
  7720. int X::cnt;
  7721. void main()
  7722. {
  7723.       X xobj1, xobj2;
  7724.       xobj1.Set_Show(11);
  7725.       xobj1.Set_Show(11,22);
  7726.       xobj1.Set_Show(xobj2, 44);
  7727. }
  7728.  
  7729. The above example produces the following output: 
  7730.  
  7731. X::cnt = 11
  7732. X::cnt = 33
  7733. X::cnt = 44
  7734.  
  7735. When a static member is accessed through a class access operator, the 
  7736. expression on the left of the . or -> operator is not evaluated. 
  7737.  
  7738. A static member can be referred to independently of any association with a 
  7739. class object because there is only one static member shared by all objects of a 
  7740. class. A static member can exist even if no objects of its class have been 
  7741. declared. 
  7742.  
  7743. When you access a static member, the expression that you use to access the 
  7744. static member is not evaluated. In the following example, the external function 
  7745. f() returns class type X. The function f() can be used to access the static 
  7746. member i of class X. The function f() itself is not called. 
  7747.  
  7748. class X
  7749. {
  7750. public:
  7751.       static int i;
  7752. };
  7753. int X:
  7754. :i = 10;
  7755. X f() { /* ... */ }
  7756. void main ()
  7757. {
  7758.       int a;
  7759.       a = f().i;       // f().i does not call f()
  7760. }
  7761.  
  7762.  
  7763. ΓòÉΓòÉΓòÉ 10.9.2. Static Data Members ΓòÉΓòÉΓòÉ
  7764.  
  7765. Static data members of global classes have external linkage and can be 
  7766. initialized in file scope like other global objects. Static data members follow 
  7767. the usual class access rules except that they can be initialized in file scope. 
  7768. Thus, static data members and their initializers can access other static 
  7769. private and protected members of their class. The initializer for a static data 
  7770. member is in the scope of the class declaring the member. 
  7771.  
  7772. You can only have one definition of a static member in a program. If a static 
  7773. data member is not initialized, it is assigned a zero default value. 
  7774.  
  7775. Local classes cannot have static data members. 
  7776.  
  7777. The following example shows the declaration, initialization, use, and scope of 
  7778. the static data member si and static member functions Set_si(int) and 
  7779. Print_si(). 
  7780.  
  7781. #include <iostream.h>
  7782. class X
  7783. {
  7784.       int i;
  7785.       static int si;
  7786. public:
  7787.       void Set_i(int i) { this->i = i; }
  7788.       void Print_i() { cout << "i = " <<
  7789. i << endl; }
  7790.       // Equivalent to:
  7791.       // void Print_i(X* this)
  7792.       // { cout << "X:
  7793. :i = " << this->i
  7794. << endl; }
  7795.       static void Set_si(int si) { X::si = si; }
  7796.  
  7797.       static void Print_si()
  7798.       { cout << "X::si = " << X::si <<
  7799. endl; }
  7800.       // Print_si doesn't have a 'this' pointer
  7801. };
  7802. int X::si = 77;       // Initialize static data member
  7803. void main()
  7804. {
  7805.       X xobj;
  7806.       // Non-static data members and functions belong to
  7807. specific
  7808.       // instances (here xobj) of class X
  7809.       xobj.Set_i(11);
  7810.       xobj.Print_i();
  7811.  
  7812.       // static data members and functions belong to the
  7813. class and
  7814.       // can be accessed without using an instance of class
  7815. X
  7816.       X::Print_si();
  7817.       X::Set_si(22);
  7818.       X::Print_si();
  7819. }
  7820.  
  7821. The above example produces the following output: 
  7822.  
  7823. i = 11
  7824. X::si = 77
  7825. X::si = 22
  7826.  
  7827.  
  7828. ΓòÉΓòÉΓòÉ 10.9.3. Static Member Functions ΓòÉΓòÉΓòÉ
  7829.  
  7830. You cannot have static and nonstatic member functions with the same names and 
  7831. the same number and type of arguments. 
  7832.  
  7833. A static member function does not have a this pointer. You can call a static 
  7834. member function using the this pointer of a nonstatic member function. In the 
  7835. following example, the nonstatic member function printall() calls the static 
  7836. member function f() using the this pointer: 
  7837.  
  7838. #include <iostream.h>
  7839. class c {
  7840.             static void f() { cout << "Here is i
  7841. " << i << endl;}
  7842.             static int i;
  7843.             int j;
  7844.       public:
  7845.             c(int firstj): j(firstj) {}
  7846.             void printall();
  7847.             };
  7848. void c::printall() {
  7849.       cout << "Here is j " << this->j <<
  7850. endl;
  7851.       this->f();
  7852.       }
  7853. int c:
  7854. :i = 3;
  7855. void main() {
  7856.       class c C(0);
  7857.       C.printall();
  7858.       }
  7859.  
  7860. A static member function cannot be declared with the keyword virtual. 
  7861.  
  7862. A static member function can access only the names of static members, 
  7863. enumerators, and nested types of the class in which it is declared. 
  7864.  
  7865.  
  7866. ΓòÉΓòÉΓòÉ 10.10. Member Access ΓòÉΓòÉΓòÉ
  7867.  
  7868. Member access determines if a class member is accessible in an expression or 
  7869. declaration. Note that accessibility and visibility are independent. Visibility 
  7870. is based on the scoping rules of C++. A class member can be visible and 
  7871. inaccessible at the same time. This section describes how you control the 
  7872. access to the individual nonderived class members by using access specifiers 
  7873. when you declare class members in a member list. 
  7874.  
  7875. The default access for an individual class member depends on the class key used 
  7876. in the class declaration. Members of classes declared with the keyword class 
  7877. are private by default. Members of classes declared with the keyword struct or 
  7878. union are public by default. 
  7879.  
  7880. The access specifier protected is meaningful only in the context of derivation. 
  7881. You can control the access to inherited members (that is, base class members) 
  7882. by including access specifiers in the base list of the derived class 
  7883. declaration.You can also restore the access to an inherited member from a 
  7884. derived class by using an access declaration. 
  7885.  
  7886. Access for inherited members is described in "Inherited Member Access" 
  7887. including: "Protected Members", "Derivation Access and Base Classes", "Access 
  7888. Declarations", and "Access Resolution" 
  7889.  
  7890.  
  7891. ΓòÉΓòÉΓòÉ 10.10.1. Access Specifiers ΓòÉΓòÉΓòÉ
  7892.  
  7893. The syntax for an access-specifier is: 
  7894.  
  7895.       access-specifier:
  7896.             public
  7897.             private
  7898.             protected
  7899.  
  7900. Member lists can include access specifiers as a labels. Members declared after 
  7901. these labels have access as specified by the label they follow. An access 
  7902. specifier determines the access for members until another access specifier is 
  7903. used or until the end of the class declaration. You can use any number of 
  7904. access specifiers in any order. For example: 
  7905.  
  7906. class X
  7907. {
  7908.       int a;             // private data by default
  7909. public:
  7910.       void f(int);       // public function
  7911.       int b;             // public data
  7912. private:
  7913.       int c;             // private data
  7914. protected:
  7915.       void g(int);       // protected function
  7916. };
  7917. struct Y
  7918. {
  7919.       int a;             // public data by default
  7920. public:
  7921.       int b;             // public data
  7922. private:
  7923.       void g(int);       // private function
  7924.       int c;             // private data
  7925. };
  7926.  
  7927. The three access specifiers have the following effect: 
  7928.  
  7929. o public class members can be accessed by any function, file or class. 
  7930.  
  7931. o private class members can be accessed only by member functions and friends of 
  7932.   the class in which the member is declared. 
  7933.  
  7934. o protected class members can be accessed only by member functions and friends 
  7935.   of the class in which they are declared and by member functions and friends 
  7936.   of classes derived from the class in which the protected members are 
  7937.   declared. The access specifier protected can be used for nonbase class 
  7938.   members, but it is equivalent to private unless it is used in a base class 
  7939.   member declaration or in a base list. For more details, see "Protected 
  7940.   Members". 
  7941.  
  7942.  
  7943. ΓòÉΓòÉΓòÉ 10.11. Friends ΓòÉΓòÉΓòÉ
  7944.  
  7945. A friend of a class X is a function or class that is granted the same access to 
  7946. X as the members of X. Functions declared with the friend specifier in a class 
  7947. member list are called friend functions of that class. Classes declared with 
  7948. the friend specifier in the member list of another class are called friend 
  7949. classes of that class. Friend functions and classes do not automatically become 
  7950. members of the class they are declared in. 
  7951.  
  7952. A class Y must be defined before any member of Y can be declared a friend of 
  7953. another class. 
  7954.  
  7955. In the following example, the friend function print is a member of class Y and 
  7956. accesses the private data members a and b of class X. 
  7957.  
  7958. #include <iostream.h>
  7959. class X;
  7960. class Y
  7961. {
  7962. public:
  7963.       void print(X& x);
  7964. };
  7965. class X
  7966. {
  7967. public:
  7968.       X() {a=1; b=2;}
  7969. private:
  7970.       int a, b;
  7971.       friend void Y::print(X& x);
  7972. };
  7973. void Y::print(X& x)
  7974. {
  7975.       cout << "A is "<< x.a << endl;
  7976.       cout << "B is " << x.b <<
  7977. endl;
  7978. }
  7979. void main ()
  7980. {
  7981.       X xobj;
  7982.       Y yobj;
  7983.       yobj.print(xobj);
  7984. }
  7985.  
  7986. You can declare an entire class as a friend. In the following example, the 
  7987. friendclass F has a member function print that accesses the private data 
  7988. members a and b of class X and performs the same task as the friend function 
  7989. print in the above example. Any other members declared in class F also have 
  7990. access to all members of class X. In the following example, the friend class F 
  7991. has not been previously declared, so an elaborated type specifier and a 
  7992. qualified type specifier are used to specify the class name. 
  7993.  
  7994. #include <iostream.h>
  7995. class X
  7996. {
  7997. public:
  7998.  
  7999.       X() {a=1; b=2;}  // constructor
  8000. private:
  8001.       int a, b;
  8002.       friend class F;            // friend class
  8003. };
  8004. class F
  8005. {
  8006. public:
  8007.       void print(X& x)
  8008.       {
  8009.             cout << "A is " << x.a <<
  8010. endl;
  8011.             cout << "B is " << x.b <<
  8012. endl;
  8013.       }
  8014. //      .
  8015. //      .
  8016. //      .
  8017. };
  8018. void main ()
  8019. {
  8020.       X xobj;
  8021.       F fobj;
  8022.       fobj.print(xobj);
  8023. }
  8024.  
  8025. Both the above examples produce the output: 
  8026.  
  8027. A is 1
  8028. B is 2
  8029.  
  8030. If the friend class has been previously declared, you can omit the keyword 
  8031. class, as shown in the following example: 
  8032.  
  8033. class F;
  8034. class X
  8035. {
  8036. public:
  8037.  
  8038.       X() {a=1; b=2;}
  8039. private:
  8040.       int a, b;
  8041.       friend F; // elaborated-type-specifier not required
  8042. };
  8043. //      .
  8044. //      .
  8045. //      .
  8046.  
  8047. Elaborated type specifiers are described on page -- Reference CPLRelabts not 
  8048. found --. 
  8049.  
  8050.  
  8051. ΓòÉΓòÉΓòÉ 10.11.1. Friend Scope ΓòÉΓòÉΓòÉ
  8052.  
  8053. The name of a friend function or class first introduced in a friend declaration 
  8054. is not in the scope of the class granting friendship (also called the enclosing 
  8055. class) and is not a member of the class granting friendship. 
  8056.  
  8057. The name of a function first introduced in a friend declaration is in the scope 
  8058. of the first nonclass scope that contains the enclosing class. The body of a 
  8059. function provided in a friend declaration is handled in the same way as a 
  8060. member function defined within a class.  Thus, processing of the definition 
  8061. does not start until the end of the outermost enclosing class.  In addition, 
  8062. unqualified names in the body of the function definition are searched for 
  8063. starting from the class containing the function definition. 
  8064.  
  8065. A class that is first declared in a friend declaration has the same scope as 
  8066. the class granting friendship. For example: 
  8067.  
  8068. class B {};
  8069. class A
  8070. {
  8071.       friend class B; // global class B is a friend of A
  8072. };
  8073.  
  8074. If the name of a friend class has been introduced before the friend 
  8075. declaration, the &xcomp. &xcompos2. searches for a class name that matches the 
  8076. name of the friend class beginning at the scope of the friend declaration. If 
  8077. the declaration of a nested class is followed by the declaration of a friend 
  8078. class with the same name, the nested class is a friend of the enclosing  class. 
  8079. For example: 
  8080.  
  8081. class B { void f(); };
  8082. class C { void f(); };
  8083. class A {
  8084.       class B;
  8085.       friend class B;      // A::B is a friend of A
  8086.       friend class C;      // global class C is a friend
  8087. of A
  8088.       class B {
  8089.             void f() { A::a = 0;}
  8090.       };
  8091.       class C {
  8092.             void f() { A::a = 0;}      // error, A is
  8093. private
  8094.       };
  8095. };
  8096.  
  8097. A friend class that is declared in a nested class has the scope of it enclosing 
  8098. class. For example: 
  8099.  
  8100. class C
  8101. {
  8102.       class B { /* ... */ };
  8103.       class A
  8104.       {
  8105.             friend class B; // friend is C::B
  8106.       };
  8107. };
  8108.  
  8109. You need to use the class member access operators if the friend function is a 
  8110. member of another class. For example: 
  8111.  
  8112. class A
  8113. {
  8114. public:
  8115.       int f() { /* ... */ }
  8116. };
  8117. class B
  8118. {
  8119.       friend int A::f();
  8120. };
  8121.  
  8122. Friends of a base class are not inherited by any classes derived from that base 
  8123. class. 
  8124.  
  8125. "Scope of Class Names" is described on page Scope of Class Names. 
  8126.  
  8127.  
  8128. ΓòÉΓòÉΓòÉ 10.11.2. Friend Access ΓòÉΓòÉΓòÉ
  8129.  
  8130. A friend of a class can access the private and protected members of that class. 
  8131. Normally you can only access theprivate members of a class through member 
  8132. functions of that class, and you can only access the protected members of a 
  8133. class through member functions of a class or classes derived from that class. 
  8134.  
  8135. Friend declarations are not affected by access specifiers. 
  8136.  
  8137. For more information on access, see also "Member Access" 
  8138.  
  8139.  
  8140. ΓòÉΓòÉΓòÉ 10.12. Related Information ΓòÉΓòÉΓòÉ
  8141.  
  8142. "C++ Classes" 
  8143.  
  8144. "Inheritance" 
  8145.  
  8146.  
  8147. ΓòÉΓòÉΓòÉ 11. Chapter 11. C++ Overloading ΓòÉΓòÉΓòÉ
  8148.  
  8149. This chapter introduces the concept of overloading in C++ and discusses the 
  8150. following topics: 
  8151.  
  8152. o Introduction to overloading 
  8153. o Overloading functions 
  8154. o Argument matching 
  8155. o Introduction to overloading operators. 
  8156. o Overloading unary operators 
  8157. o Overloading binary operators 
  8158. o Special overloaded operators 
  8159.  
  8160. You can also return to the table of contents 
  8161.  
  8162.  
  8163. ΓòÉΓòÉΓòÉ 11.1. Introduction to Overloading ΓòÉΓòÉΓòÉ
  8164.  
  8165. This chapter describes two distinct types of overloading: function overloading 
  8166. and operator overloading. Overloading enables you to redefine functions and 
  8167. most standard C++ operators. Typically, you overload a function or operator if 
  8168. you want to extend the operations the function or operator performs to 
  8169. different data types. 
  8170.  
  8171.  
  8172. ΓòÉΓòÉΓòÉ 11.2. Overloading Functions ΓòÉΓòÉΓòÉ
  8173.  
  8174. You can overload a function by having multiple declarations of the same 
  8175. function name in the same scope. The declarations differ in the type and number 
  8176. of arguments in the argument list. When an overloaded function is called, the 
  8177. correct function is selected by comparing the types of the actual arguments 
  8178. with the types of the formal arguments. 
  8179.  
  8180. Consider a function print which displays a int value. You can overload the 
  8181. function print to display other types, for example, double and char*. You can 
  8182. have three functions with the same name, each performing a similar operation on 
  8183. a different data type. 
  8184.  
  8185. #include <iostream.h>
  8186. void print(int i) { cout << " Here is int " <<
  8187. i << endl;}
  8188. void print(double  f) { cout << " Here is float
  8189. " << f << endl;}
  8190. void print(char* c) { cout << " Here is char* "
  8191. << c << endl;}
  8192. void main() {
  8193.       print(10);            // calls print(int)
  8194.       print(10.10);         // calls print(double)
  8195.       print("ten");         // calls print(char*)
  8196. }
  8197.  
  8198.  
  8199. ΓòÉΓòÉΓòÉ 11.2.1. Declaration Matching ΓòÉΓòÉΓòÉ
  8200.  
  8201. Two function declarations are identical if all of the following are true: 
  8202.  
  8203. o They have the same function name 
  8204. o They are declared in the same scope 
  8205. o They have identical argument lists. 
  8206.  
  8207. When you declare a function name more than once in the same scope, the second 
  8208. declaration of the function name is interpreted by the &xcomp. &xcompos2. as 
  8209. follows: 
  8210.  
  8211. o If the return type, argument types, and number of arguments of the two 
  8212.   declarations are identical, the second declaration is considered a 
  8213.   declaration of the same function as the first. 
  8214.  
  8215. o If only the return types of the two function declarations differ, the second 
  8216.   declaration is an error. 
  8217.  
  8218. o If either the argument types or number of arguments of the two declarations 
  8219.   differ, the function is considered to be overloaded. 
  8220.  
  8221.  
  8222. ΓòÉΓòÉΓòÉ 11.2.2. Restrictions on Overloaded  Functions ΓòÉΓòÉΓòÉ
  8223.  
  8224. The following are restrictions on overloaded functions: 
  8225.  
  8226. o Functions that differ only in return type cannot have the same name. 
  8227.  
  8228. o Two member functions that differ only in that one is declaredwith the keyword 
  8229.   static and the other is not cannot have the same name. 
  8230.  
  8231. o A typedef is a synonym for another type, not a separate type. Thus, the 
  8232.   following two declarations of spadina() are declarations of the same 
  8233.   function: 
  8234.  
  8235.           typedef int I;
  8236.           void spadina(float, int);
  8237.           void spadina(float, I);
  8238.  
  8239. o A member function of a derived class is not in the same scope as a member 
  8240.   function in a base class with the same name. A derived class member hides a 
  8241.   base class member with the same name. 
  8242.  
  8243. o Arguments type that differ only in that one is a pointer * and the other is 
  8244.   an array [ ] are identical. The following two declarations are equivalent: 
  8245.  
  8246.       f(char*);
  8247.       f(char[10]);
  8248.  
  8249.  
  8250. ΓòÉΓòÉΓòÉ 11.3. Argument Matching ΓòÉΓòÉΓòÉ
  8251.  
  8252. When an overloaded function or overloaded operator is called, the &xcomp. 
  8253. &xcompos2. chooses the function declaration with the best match on all 
  8254. arguments from all the function declarations that are visible. The &xcomp. 
  8255. &xcompos2. compares the actual arguments of a function call with the formal 
  8256. arguments of all declarations of the function that are visible. For a best 
  8257. match to occur, the &xcomp. &xcompos2. must be able to distinguish a function 
  8258. that: 
  8259.  
  8260. o Has at least as good a match on all arguments as any other function with the 
  8261.   same name 
  8262.  
  8263. o Has at least one better argument match than any other function with the same 
  8264.   name. 
  8265.  
  8266. If no such function exists, the call is not allowed. There are three possible 
  8267. outcomes of a call to an overloaded function. The &xcomp. &xcompos2. can find 
  8268. the following: 
  8269.  
  8270. o An exact match 
  8271. o No match 
  8272. o An ambiguous match. 
  8273.  
  8274. An ambiguous match occurs when the actual arguments of the function call match 
  8275. more than one overloaded function. 
  8276.  
  8277. Argument matching can include performing standard and user-defined conversions 
  8278. on the arguments to match the actual arguments with the formal arguments. Only 
  8279. a single user-defined conversion is performed in a sequence of conversions on 
  8280. an actual argument. In addition, the best-matching sequence of standard 
  8281. conversions is performed on an actual argument. The best-matching  sequence is 
  8282. the shortest sequence of conversions between two standard types. For example, 
  8283. the conversion: 
  8284.  
  8285. int -> float -> double
  8286.  
  8287. can be shortened to the best-matching conversion sequence: 
  8288.  
  8289. int -> double
  8290.  
  8291. because the conversion from int to double is allowed. 
  8292.  
  8293. Trivial conversions, do not affect the choice of conversion sequence. 
  8294.  
  8295.  
  8296. ΓòÉΓòÉΓòÉ 11.3.1. Sequences of Conversions ΓòÉΓòÉΓòÉ
  8297.  
  8298. Sequences of conversions are considered in the following order: 
  8299.  
  8300. o An exact match in which the actual arguments match exactly (including a match 
  8301.   with one or more trivial conversions) with the type and number of formal 
  8302.   arguments of one declaration of the overloaded function 
  8303.  
  8304. o A match with promotions in which a match is found when one or more of the 
  8305.   actual arguments is promoted 
  8306.  
  8307. o Match with standard conversions in which a match is found when one or more of 
  8308.   the actual arguments is converted by a standard conversion 
  8309.  
  8310. o Match with user-defined conversions in which a match is found when one or 
  8311.   more of the actual arguments is converted by an user-defined conversion 
  8312.  
  8313. o Match with ellipses. 
  8314.  
  8315. Match through promotion follows the rules for integral promotions 
  8316.  
  8317. Match through conversion follows the rules for standard conversions 
  8318.  
  8319. You can override an exact match by using an explicit cast. In the following 
  8320. example, the second call to f() matches with f(void*): 
  8321.  
  8322. void f(int);
  8323. void f(void*);
  8324. //      .
  8325. //      .
  8326. //      .
  8327. void main()
  8328. {
  8329.       f(0xaabb);            // matches f(int);
  8330.       f((void*) 0xaabb);    // matches f(void*)
  8331. }
  8332.  
  8333. The implicit first argument for a nonstatic member function or operator is the 
  8334. this  pointer The this pointer refers to the class object for which the member 
  8335. function is called. When you overload a nonstatic member function, the first 
  8336. implicit argument, the this pointer, is matched with the object or pointer used 
  8337. in the call to the member function. User-defined conversions are not applied in 
  8338. this type of argument matching for overloaded functions or operators. 
  8339.  
  8340. When you call an overloaded member function of class X using the . or -> 
  8341. operator, the this pointer has type X* const. The type of the this pointer for 
  8342. a constant object is const X* const. The type of the this pointer for a 
  8343. volatile object is volatile X* const. 
  8344.  
  8345. The class member access operators . (dot) and -> (arrow) 
  8346.  
  8347.  
  8348. ΓòÉΓòÉΓòÉ 11.3.2. Trivial Conversions ΓòÉΓòÉΓòÉ
  8349.  
  8350. Functions cannot be distinguished if they have the same name and that have 
  8351. arguments that differ only in that one is declared as a reference to a type and 
  8352. the other is that type. Thus, you cannot have two functions with the same name 
  8353. and with arguments differing only in this respect. The following two 
  8354. declarations cannot be distinguished, and thus the second one causes an error: 
  8355.  
  8356. double f(double i); // declaration
  8357. //      .
  8358. //      .
  8359. //      .
  8360. double f(double &i); // error
  8361.  
  8362. However, functions with the same name having arguments that differ only in that 
  8363. one is a pointer or reference and the other is a pointer to const or const 
  8364. reference can be distinguished. Functions with the same name having arguments 
  8365. that differ only in that one is a pointer or reference and the other is a 
  8366. pointer to volatile or volatile reference can also be distinguished. Functions 
  8367. that have a volatile or const match are better than those that have a volatile 
  8368. or const mismatch. 
  8369.  
  8370. For more details on conversions see  and "User-Defined Conversions" 
  8371.  
  8372.  
  8373. ΓòÉΓòÉΓòÉ 11.4. Introduction to Overloading Operators ΓòÉΓòÉΓòÉ
  8374.  
  8375. You can overload one of the standard C++ operators by redefining it to perform 
  8376. a particular operation when it is applied to an object of a particular class. 
  8377. Overloaded operators must have at least one argument that has class type. An 
  8378. overloaded operator is called an operator function  and is declared with the 
  8379. keyword operator preceding the operator. Overloaded operators are distinct from 
  8380. overloaded functions, but like overloaded functions, they are distinguished by 
  8381. the number and types of operands used with the operator. 
  8382.  
  8383.  
  8384. ΓòÉΓòÉΓòÉ 11.4.1. Overloading Operator Grammar ΓòÉΓòÉΓòÉ
  8385.  
  8386. The syntax for overloading an operator is: 
  8387.  
  8388. operator-function-name:
  8389.             operator operator
  8390.  
  8391. where operator is a keyword and operator is one of : 
  8392.  
  8393. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  8394. Γöé +    Γöé -    Γöé *     Γöé /    Γöé %    Γöé ^     Γöé &    Γöé Γöé    Γöé ~    Γöé
  8395. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  8396. Γöé !    Γöé =    Γöé <     Γöé >    Γöé Γö╝=   Γöé -=    Γöé *=   Γöé /=   Γöé %=   Γöé
  8397. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  8398. Γöé ^=   Γöé &=   Γöé Γöé=    Γöé <<   Γöé >>   Γöé <<=   Γöé >>=  Γöé ==   Γöé !=   Γöé
  8399. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  8400. Γöé <=   Γöé >=   Γöé &&    Γöé ΓöéΓöé   Γöé Γö╝+   Γöé --    Γöé ,    Γöé ->*  Γöé ->   Γöé
  8401. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  8402. Γöé ( )  Γöé [ ]  Γöé new   Γöé deletΓöé      Γöé       Γöé      Γöé      Γöé      Γöé
  8403. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  8404.  
  8405. where ( ) is the function call operator and [ ] is the subscript operator. 
  8406.  
  8407. Consider the standard + (plus) operator. When this operator is used with 
  8408. operands of different standard types, the operators have slightly different 
  8409. meanings. For example, the addition of two integers is not implemented the same 
  8410. way as the addition of two floating-point numbers. C++ allows you to define 
  8411. your own meanings for the standard C++ operators when they are applied to class 
  8412. types. In the following example, a class called complx is defined to model 
  8413. complex numbers, and the + (plus) operator is redefined in this class to add 
  8414. two complex numbers. 
  8415.  
  8416. #include <iostream.h>
  8417. class complx
  8418. {
  8419.       double      real,
  8420.              imag;
  8421. public:
  8422.       complx( double real = 0., double imag = 0.); // constructor
  8423.       complx operator+(const complx&) const;       // operator+()
  8424. };
  8425. // define constructor
  8426. complx::complx( double r, double i )
  8427. {
  8428.       real = r; imag = i;
  8429. }
  8430. // define overloaded + (plus) operator
  8431. complx complx::operator+ (const complx& c) const
  8432. {
  8433.       complx result;
  8434.       result.real = (this->real + c.real);
  8435.       result.imag = (this->imag + c.imag);
  8436.       return result;
  8437. }
  8438. void main()
  8439. {
  8440.       complx x(4,4);
  8441.       complx y(6,6);
  8442.       complx z = x + y; // calls complx::operator+()
  8443. }
  8444.  
  8445.  
  8446. ΓòÉΓòÉΓòÉ 11.4.2. General Rules for Overloading Operators ΓòÉΓòÉΓòÉ
  8447.  
  8448. The argument matching conventions and rules described 
  8449.  
  8450. You can overload both the unary and binary forms of: 
  8451.  
  8452.       +      _      *      &
  8453.  
  8454. When an overloaded operator is a member function, the first operand is matched 
  8455. against the class type of the overloaded operator. The second operand, if one 
  8456. exists, is matched against the argument in the overloaded operator call. 
  8457.  
  8458. When an overloaded operator is a nonmember function at least one operand must 
  8459. have class type. The first operand is matched against the first argument in the 
  8460. overloaded operator call.The second operand, if one exists, is matched against 
  8461. the second argument in the overloaded operator call. 
  8462.  
  8463.  
  8464. ΓòÉΓòÉΓòÉ 11.4.3. Operands ΓòÉΓòÉΓòÉ
  8465.  
  8466. An overloaded operator must be either a member function, as shown in the 
  8467. following example: 
  8468.  
  8469. class X
  8470. {
  8471. public:
  8472.       X operator!();
  8473.       X& operator =(X&);
  8474.       X operator+(X&);
  8475. };
  8476. X X::operator!() { /* ... */ }
  8477. X& X::operator=(X& x) { /* ... */ }
  8478. X X::operator+(X& x) { /* ... */ }
  8479.  
  8480. or take at least one argument of class type or a reference to class type, as 
  8481. shown below. 
  8482.  
  8483. class Y;
  8484. {
  8485. //      .
  8486. //      .
  8487. //      .
  8488. };
  8489. class Z;
  8490. {
  8491. //      .
  8492. //      .
  8493. //      .
  8494. };
  8495. Y operator!(Y& y);
  8496. Z operator+(Z& z, int);
  8497.  
  8498. Usually, overloaded operators are invoked using the normal operator syntax. You 
  8499. can also call overloaded operators explicitly. For example, for the class 
  8500. complx , described above, you can call the overloaded + (plus) operator either 
  8501. implicitly or explicitly as shown below. 
  8502.  
  8503. class complx
  8504. {
  8505.       double real,
  8506.              imag;
  8507. public:
  8508.       complx( double real = 0., double imag = 0.);
  8509.       complx operator+(const complx&) const;
  8510. };
  8511. //      .
  8512. //      .
  8513. //      .
  8514. void main()
  8515. {
  8516.       complx x(4,4);
  8517.       complx y(6,6);
  8518.       complx u = x.operator+(y); // explicit call
  8519.       complx z = x + y;          // implicit call to complx::operator+(
  8520. )
  8521. }
  8522.  
  8523.  
  8524. ΓòÉΓòÉΓòÉ 11.4.4. Restrictions on Overloaded Operators ΓòÉΓòÉΓòÉ
  8525.  
  8526. The following C++ operators cannot be overloaded: 
  8527.  
  8528.       .      .*      ::      ?:
  8529.  
  8530. You cannot overload the preprocessing symbols # and ##. 
  8531.  
  8532. You cannot change the precedence, grouping, or number of operands of the 
  8533. standard C++ operators. For more details, see "Operator Precedence and 
  8534. Associativity" 
  8535.  
  8536. An overloaded operator (except for the function call operator) cannot have 
  8537. default arguments or ellipsis in the argument list. 
  8538.  
  8539. You must declare the overloaded =, [ ], ( ) and -> operators as nonstatic 
  8540. member functions to ensure that they receive lvalues as their first operands. 
  8541.  
  8542. The operators new and delete do not follow the general rules described in the 
  8543. above section. For further details, see overloading "new and delete" 
  8544.  
  8545. All operators except the = operator are inherited. For more details, see 
  8546. "Copying by Assignment"  . 
  8547.  
  8548. Unless they are explicitly mentioned in "Special Overloaded Operators", 
  8549. overloaded unary and binary operators follow the rules outlined in "Unary" and 
  8550. "Binary" operators 
  8551.  
  8552. For details on standard C++ operators, see "Expressions and Operators" 
  8553.  
  8554.  
  8555. ΓòÉΓòÉΓòÉ 11.5. Overloading Unary Operators ΓòÉΓòÉΓòÉ
  8556.  
  8557. You can overload a prefix unary operator by declaring a nonmember function 
  8558. taking one argument or a nonstatic member function taking no arguments. 
  8559.  
  8560. When you prefix a class object with an overloaded unary operator, for example: 
  8561.  
  8562. class X
  8563. {
  8564. //      .
  8565. //      .
  8566. //      .
  8567. };
  8568. void main ()
  8569. {
  8570.       X x;
  8571.       !x;       // overloaded unary operator
  8572. }
  8573.  
  8574. the operator function call !x can be interpreted as: 
  8575.  
  8576. x.operator!( )
  8577.  
  8578. or 
  8579.  
  8580. operator!(x)
  8581.  
  8582. depending on the declarations of the operator function. If both forms of the 
  8583. operator function have been declared, argument matching determines which 
  8584. interpretation is used. 
  8585.  
  8586. For details on standard unary operators, see "Unary Expressions" 
  8587.  
  8588.  
  8589. ΓòÉΓòÉΓòÉ 11.6. Overloading Binary Operators ΓòÉΓòÉΓòÉ
  8590.  
  8591. You can overload a binary operator by declaring a nonmember function taking two 
  8592. arguments or a nonstatic member function taking one argument. 
  8593.  
  8594. When you use a class object with an overloaded binary operator, for example: 
  8595.  
  8596. class X
  8597. {
  8598. //      .
  8599. //      .
  8600. //      .
  8601. };
  8602. void main ()
  8603. {
  8604.       X x;
  8605.       int y=10;
  8606.       x*y;       // overloaded binary operator
  8607. }
  8608.  
  8609. the operator function call x*y can be interpreted as: 
  8610.  
  8611. x.operator*(y)
  8612.  
  8613. or 
  8614.  
  8615. operator*(x,y)
  8616.  
  8617. depending on the declarations of the operator function. If both forms of the 
  8618. operator function have been declared, argument matching determines which 
  8619. interpretation is used. 
  8620.  
  8621. For details on standard binary operators see "Binary Expressions" 
  8622.  
  8623.  
  8624. ΓòÉΓòÉΓòÉ 11.7. Special Overloaded Operators ΓòÉΓòÉΓòÉ
  8625.  
  8626. The following overloaded operators do not fully follow the rules for unary or 
  8627. binary overloaded operators 
  8628.  
  8629. o Assignment 
  8630. o Function call 
  8631. o Subscripting 
  8632. o Class member access 
  8633. o Increment and decrement 
  8634. o new and delete. 
  8635.  
  8636.  
  8637. ΓòÉΓòÉΓòÉ 11.7.1. Assignment ΓòÉΓòÉΓòÉ
  8638.  
  8639. You can only overload an assignment operator by declaring a nonstatic member 
  8640. function. The following example shows how you can overload the assignment 
  8641. operator for a particular class: 
  8642.  
  8643. class X
  8644. {
  8645. public:
  8646.       X();
  8647.       X& operator=(X&);
  8648.       X& operator=(int);
  8649.  
  8650. //      .
  8651. //      .
  8652. //      .
  8653. };
  8654. X& X::operator=(X& x) { /* ... */ }
  8655. X& X::operator=(int i) { /* ... */ }
  8656. //      .
  8657. //      .
  8658. //      .
  8659. void main()
  8660. {
  8661.       X x1, x2;
  8662.       x1 = x2;      // call x1.operator=(X&)
  8663.       x1 = 5;       // call x1.operator=(int)
  8664. }
  8665.  
  8666. You cannot declare an overloaded assignment operator that is a nonmember 
  8667. function. 
  8668.  
  8669. Overloaded assignment operators are not inherited. 
  8670.  
  8671. If a copy assignment operator function is not defined for a class, the copy 
  8672. assignment operator function is defined by default as a memberwise assignment 
  8673. of the class members. If assignment operator functions exist for base classes 
  8674. or class members, these operators will be used when the &xcomp. generates 
  8675. default  copy assignment operators. 
  8676.  
  8677. For details on standard assignment operators, see "Assignment Operators" 
  8678.  
  8679.  
  8680. ΓòÉΓòÉΓòÉ 11.7.2. Function Call ΓòÉΓòÉΓòÉ
  8681.  
  8682. The function call has syntax of the form: 
  8683.  
  8684.       postfix-expression (
  8685. [expression-list]
  8686. )
  8687.  
  8688. and is considered a binary operator. The operands are postfix-expression and an 
  8689. optional expression-list. The operator function operator( ) must be defined as 
  8690. a nonstatic member function. You cannot declare an overloaded function call 
  8691. operator that is a nonmember function. 
  8692.  
  8693. If you make the following call for the class object x: 
  8694.  
  8695. x (arg1, arg2, arg3)
  8696.  
  8697. it is interpreted as 
  8698.  
  8699. x.operator( )(arg1, arg2, arg3)
  8700.  
  8701. Unlike all other overloaded operators, you can provide default arguments and 
  8702. ellipses in the argument list for the function call operator. For example: 
  8703.  
  8704. class X
  8705. {
  8706. public:
  8707.       X& operator() (int = 5);
  8708. };
  8709. //      .
  8710. //      .
  8711. //      .
  8712.  
  8713. For details on the standard function call operator, see "Function Call" 
  8714.  
  8715.  
  8716. ΓòÉΓòÉΓòÉ 11.7.3. Subscripting ΓòÉΓòÉΓòÉ
  8717.  
  8718. An expression containing the subscripting operator has syntax of the form: 
  8719.  
  8720.       postfix-expression [
  8721. expression
  8722. ]
  8723.  
  8724. and is considered a binary operator. The operands are postfix-expression and 
  8725. expression. The operator function operator[ ] must be defined as a nonstatic 
  8726. member function. You cannot declare an overloaded subscript operator that is a 
  8727. nonmember function. 
  8728.  
  8729. A subscripting expression for the class object x: 
  8730.  
  8731. x [y]
  8732.  
  8733. is interpreted as x.operator[ ](y). It is not interpreted as operator[ ](x,y) 
  8734. because it is defined as a nonstatic member function. 
  8735.  
  8736. For details on the standard subscripting operator see "Array Subscript" 
  8737.  
  8738.  
  8739. ΓòÉΓòÉΓòÉ 11.7.4. Class Member Access ΓòÉΓòÉΓòÉ
  8740.  
  8741. An expression containing the class member access -> (arrow) operator has syntax 
  8742. of the form: 
  8743.  
  8744.       postfix-expression -> name
  8745.  
  8746. and is considered a unary operator. The operator function operator->( ) must be 
  8747. defined as a nonstatic member function. 
  8748.  
  8749. The following restrictions apply to class member access operators: 
  8750.  
  8751. o You cannot declare an overloaded arrow operator that is a nonmember function. 
  8752.  
  8753. o You cannot overload the class member access . (dot) operator. 
  8754.  
  8755. Consider the following example of overloading the -> (arrow) operator: 
  8756.  
  8757. class Y
  8758. {
  8759. public:
  8760.       void f();
  8761. };
  8762. class X
  8763. {
  8764. public:
  8765.       Y* operator->();
  8766. };
  8767. X x;
  8768. //      .
  8769. //      .
  8770. //      .
  8771. x->f();
  8772.  
  8773. Here x->f() is interpreted as: 
  8774.  
  8775. ( x.operator->( ) )-> f()
  8776.  
  8777. x.operator->() must return either a reference to a class object or a class 
  8778. object for which the overloaded operator -> function is defined or a pointer to 
  8779. any class. If the overloaded operator -> function returns a class type, the 
  8780. class type must not be the same as the class declaring the function, and the 
  8781. class type returned must contain its own definition of an overloaded -> 
  8782. operator function. 
  8783.  
  8784. For details on the standard class member access arrow operator, see "Arrow" 
  8785.  
  8786.  
  8787. ΓòÉΓòÉΓòÉ 11.7.5. Increment and Decrement ΓòÉΓòÉΓòÉ
  8788.  
  8789. The prefix increment operator ++ can be overloaded for a class type by 
  8790. declaring a nonmember function operator with one argument of class type or a 
  8791. reference to class type, or by declaring a member function operator with no 
  8792. arguments. In the following example, the increment operator is overloaded in 
  8793. both ways: 
  8794.  
  8795. class X
  8796. {
  8797.       int a;
  8798. public:
  8799.       operator++();      // member prefix increment operator
  8800. };
  8801. class Y { /* ... */ }
  8802. operator++(Y& y);        // nonmember prefix increment
  8803. operator
  8804. //      .
  8805. //      .
  8806. //      .
  8807. // Definitions of prefix increment operator functions
  8808. //      .
  8809. //      .
  8810. //      .
  8811. void main()
  8812. {
  8813.       X x;
  8814.       ++x;               // x.operator++
  8815.       x.operator++();    // x.operator++
  8816.       operator++(y);     // nonmember operator++
  8817.       ++y;               // nonmember operator++
  8818. }
  8819.  
  8820. The postfix increment operator ++ can be overloaded for a class type by 
  8821. declaring a nonmember function operator operator++ ( ) with two arguments, the 
  8822. first having class type and the second having type int. Alternatively, you can 
  8823. declare a member function operator operator++ ( ) with one argument having type 
  8824. int. The &xcomp. uses the int argument to distinguish between the prefix and 
  8825. postfix increment operators. For implicit calls, the default value is zero. For 
  8826. example: 
  8827.  
  8828. class X
  8829. {
  8830.       int a;
  8831. public:
  8832.       operator++(int);   // member postfix increment operator
  8833. };
  8834. operator++(X x, int i);  // nonmember postfix increment
  8835. operator
  8836. //      .
  8837. //      .
  8838. //      .
  8839. // Definitions of postfix increment operator functions
  8840. //      .
  8841. //      .
  8842. //      .
  8843.  
  8844. void main()
  8845. {
  8846.       X x;
  8847.       x++;               // x.operator++
  8848.                          // default zero is supplied by compiler
  8849.       x.operator++(0);   // x.operator++
  8850.       operator++(x,0);   // nonmember operator++
  8851. }
  8852.  
  8853. The prefix and postfix decrement operators follow the same rules as their 
  8854. increment counterparts. 
  8855.  
  8856. For details on the standard postfix increment and decrement operators, see 
  8857. "Postfix Increment" and "Postfix Decrement" For details on the standard prefix 
  8858. increment and decrement operators, see "Prefix Increment" and "Prefix 
  8859. Decrement" 
  8860.  
  8861.  
  8862. ΓòÉΓòÉΓòÉ 11.7.6. new and delete ΓòÉΓòÉΓòÉ
  8863.  
  8864. You can implement your own memory management scheme for a class by overloading 
  8865. the operators new and delete. The overloaded operator new must return a void*, 
  8866. and its first argument must have type size_t. size_t is defined in the standard 
  8867. header file <stddef.h>. The overloaded operator delete must return a void type, 
  8868. and its first argument must be void*. The second argument for the overloaded 
  8869. delete operator is optional and, if present, it must have type size_t. You can 
  8870. only define one delete operator function for a class. 
  8871.  
  8872. The size argument is required because a class may inherit an overloaded new 
  8873. operator. The derived class can be a different size than the base class. The 
  8874. size argument ensures that the correct amount of storage space is allocated or 
  8875. deallocated for the object. 
  8876.  
  8877. When new and delete are overloaded within a class declaration, they are static 
  8878. member functions whether they are declared with the keyword static or not. 
  8879. Thus, they cannot be virtual functions. 
  8880.  
  8881. You can access the standard, nonoverloaded versions of new and delete within a 
  8882. class scope containing the overloading new and delete operators by using the :: 
  8883. (scope) operator to provide global access. 
  8884.  
  8885. For details on the class member operators new and delete, see "Free Store" For 
  8886. details on the standard new and delete operators, see "new" and "delete and 
  8887. delete[]" 
  8888.  
  8889.  
  8890. ΓòÉΓòÉΓòÉ 11.8. Related Information ΓòÉΓòÉΓòÉ
  8891.  
  8892. "Expressions and Operators" 
  8893.  
  8894. "Functions" 
  8895.  
  8896. "C++ Classes" 
  8897.  
  8898.  
  8899. ΓòÉΓòÉΓòÉ 12. Chapter 12. Special Member Functions ΓòÉΓòÉΓòÉ
  8900.  
  8901. This chapter introduces the special member functions that are used to create, 
  8902. destroy, convert, initialize, and copy class objects. The following topics are 
  8903. discussed in this chapter: 
  8904.  
  8905. o Introduction to constructors and destructors 
  8906. o Constructors 
  8907. o Destructors 
  8908. o Free store 
  8909. o Temporary objects 
  8910. o User-defined conversions 
  8911. o Initialization by constructor 
  8912. o Copying class objects 
  8913.  
  8914. You can also return to the table of contents 
  8915.  
  8916.  
  8917. ΓòÉΓòÉΓòÉ 12.1. Introduction  to Constructors and Destructors ΓòÉΓòÉΓòÉ
  8918.  
  8919. Because classes have complicated internal structures, including data and 
  8920. functions, object initialization and cleanup for classes is much more 
  8921. complicated than it is for simple data structures. Constructors and destructors 
  8922. are special member functions of classes that are used to construct and destroy 
  8923. class objects. Construction may involve memory allocation and initialization 
  8924. for objects. Destruction may involve cleanup and deallocation of memory for 
  8925. objects. 
  8926.  
  8927. Like other member functions, constructors and destructors are declared within a 
  8928. class declaration. They can be defined inline or external to the class 
  8929. declaration. Constructors can have default arguments. Unlike other member 
  8930. functions, constructors can have member initialization lists. The following 
  8931. restrictions apply to constructors and destructors: 
  8932.  
  8933. o Constructors and destructors do not have return types nor can they return 
  8934.   values. 
  8935. o References and pointers cannot be used on constructors and destructors 
  8936.   because you cannot obtain their addresses. 
  8937. o Constructors cannot be declared with the keyword virtual. 
  8938. o Constructors and destructors cannot be declared static, const, or volatile. 
  8939. o Unions and aggregate classes cannot contain class objects that have 
  8940.   constructors or destructors. 
  8941.  
  8942. Constructors and destructors obey the same access rules as member functions. 
  8943. For example, if a constructor is declared with the keyword protected, only 
  8944. derived classes and friends can use it to create class objects. 
  8945.  
  8946. The &xcomp. &xcompos2. automatically calls constructors when defining class 
  8947. objects and calls destructors when class objects go out of scope. A constructor 
  8948. does not allocate memory for the class object its this pointer refers to, but 
  8949. may allocate storage for more objects that its class object refers to. If 
  8950. memory allocation is required for objects, constructors can explicitly call the 
  8951. new  operator. During cleanup, a destructor may release objects allocated by 
  8952. the corresponding constructor. To release objects, use the delete  operator. 
  8953.  
  8954. Derived classes do not inherit constructors or destructors from their base 
  8955. classes.  Destructors can be declared with the keyword virtual. 
  8956.  
  8957. Constructors are also called when local or temporary class objects are created, 
  8958. and destructors are called when local or temporary objects go out of scope. 
  8959.  
  8960. You can call member functions from constructors or destructors. You can call a 
  8961. virtual function, either directly or indirectly, from a constructor or 
  8962. destructor. In this case, the function called is the one defined in the class 
  8963. or base class containing the constructor (or destructor) but not a function 
  8964. defined in any class derived from the class being constructed. This avoids the 
  8965. possibility accessing an unconstructed object from a constructor or destructor. 
  8966.  
  8967.  
  8968. ΓòÉΓòÉΓòÉ 12.2. Constructors ΓòÉΓòÉΓòÉ
  8969.  
  8970. A constructor is a member function with the same name as its class. For 
  8971. example, 
  8972.  
  8973. class X
  8974. {
  8975. public:
  8976.       X();      // constructor for class X
  8977. //      .
  8978. //      .
  8979. //      .
  8980. };
  8981.  
  8982. Constructors are used to create, and can initialize, objects of their class 
  8983. type. Initialization of class objects using constructors is described in 
  8984. "Initialization by Constructor" 
  8985.  
  8986.  
  8987. ΓòÉΓòÉΓòÉ 12.2.1. Default Constructors ΓòÉΓòÉΓòÉ
  8988.  
  8989. A default constructor is a constructor that either has no arguments, or, if it 
  8990. has arguments, all the arguments have default values. If no user-defined 
  8991. constructor exists for a class and one is needed, the &xcomp. creates a default 
  8992. constructor, with public access, for that class. It will not be created for a 
  8993. class that has any constant or reference type members. 
  8994.  
  8995. Like all functions, a constructor can have default arguments. They are used to 
  8996. initialize member objects. If default values are supplied, the trailing 
  8997. arguments can be omitted in the expression list of the constructor. For more 
  8998. details, see "Default Arguments" Note that if a constructor has any arguments 
  8999. that do not have default values, it is not a default constructor. 
  9000.  
  9001.  
  9002. ΓòÉΓòÉΓòÉ 12.2.2. Copy Constructors ΓòÉΓòÉΓòÉ
  9003.  
  9004. A copy constructor is used to make a copy of one class object from another 
  9005. class object of the same class type. A copy constructor is called with a single 
  9006. argument that is a reference to its own class type. You cannot use a copy 
  9007. constructor with an argument of the same type as its class; you must use a 
  9008. reference. You can provide copy constructors with additional default arguments. 
  9009. If a user-defined copy constructor does not exist for a class and one is 
  9010. needed, the &xcomp. creates a copy constructor, with public access, for that 
  9011. class. It will not be created for a class if any of its members or base classes 
  9012. have an inaccessible copy constructor. 
  9013.  
  9014. The following code fragment shows two classes with constructors, default 
  9015. constructors, and copy constructors: 
  9016.  
  9017. class X
  9018. {
  9019. public:
  9020.       X();                     // default constructor, no
  9021. arguments
  9022.       X(int, int , int = 0);   // constructor
  9023.       X(const X&);             // copy constructor
  9024.       X(X);                    // error, illegal argument
  9025. type
  9026. };
  9027. class Y
  9028. {
  9029. public:
  9030.       Y( int = 0);             // default constructor with
  9031. one
  9032.                               // default argument
  9033.       Y(const Y&, int = 0);   // copy constructor
  9034. };
  9035.  
  9036.  
  9037. ΓòÉΓòÉΓòÉ 12.2.3. Construction Order of Class Objects ΓòÉΓòÉΓòÉ
  9038.  
  9039. If a class has a base class or members with constructors when it is 
  9040. constructed, the constructor for the base class is called, followed by any 
  9041. constructors for members. The constructor for the derived class is called last. 
  9042. Virtual base classes are constructed before nonvirtual base classes. When more 
  9043. than one base class exists, the base class constructors are called in the order 
  9044. that their classes appear in the base list, as shown in the following example. 
  9045. Note that the construction of class D involves construction of the base classes 
  9046. B1, B2, and B3. The construction of base class B2 involves the construction of 
  9047. its class B1 member object. Thus, when class B2 is constructed, the constructor 
  9048. for class B1 is called in addition to B2's own constructor: 
  9049.  
  9050. class B1 { public: B1();};
  9051. class B2
  9052. {
  9053. public:
  9054.       B2();
  9055.       B1 b1obj;
  9056. };
  9057. class B3 { public: B3();};
  9058. //      .
  9059. //      .
  9060. //      .
  9061. class D : public B1, public B2, public B3
  9062. {
  9063. public:
  9064.       D();
  9065.       ~D();
  9066. };
  9067. //      .
  9068. //      .
  9069. //      .
  9070. void main ()
  9071. {
  9072.       D object;
  9073. }
  9074.  
  9075. In the above example, the constructors for object are called in the following 
  9076. order: 
  9077.  
  9078. B1();      // first base constructor declared
  9079. B1();      // member constructor for B2::b1obj
  9080. B2();      // second base constructor declared
  9081. B3();      // last base constructor declared
  9082. D();       // derived constructor called last
  9083.  
  9084. As explained above, the second call to the constructor of  B1 followed by the 
  9085. call to the constructor of B2 is part of the construction of B2. 
  9086.  
  9087. For more details, see "Construction Order of Derived Class Objects" 
  9088.  
  9089.  
  9090. ΓòÉΓòÉΓòÉ 12.2.4. Explicitly Constructing Objects ΓòÉΓòÉΓòÉ
  9091.  
  9092. You cannot call constructors directly. You can use a function style cast to 
  9093. explicitly construct an object of the specified type. In the following example, 
  9094. a constructor is used as an initializer to create a named object. 
  9095.  
  9096. #include <iostream.h>
  9097. class X
  9098. {
  9099. public:
  9100.  
  9101.       X (int, int , int = 0);       // constructor with default
  9102. argument
  9103. private:
  9104.       int a, b, c;
  9105.       int f();
  9106. };
  9107. X::X (int i, int j, int k) { a = i; b = j; c = k; }
  9108. //      .
  9109. //      .
  9110. //      .
  9111. void main ()
  9112. {
  9113. X xobject = X(1,2,3);    // explicitly create and initialize
  9114.                          // named object with constructor call
  9115. }
  9116.  
  9117.  
  9118. ΓòÉΓòÉΓòÉ 12.3. Destructors ΓòÉΓòÉΓòÉ
  9119.  
  9120. A destructor is a member function with the same name as its class prefixed by 
  9121. a~(tilde). For example: 
  9122.  
  9123. class X
  9124. {
  9125. public:
  9126.       X();       // constructor for class X
  9127.       ~X();      // destructor for class X
  9128. //      .
  9129. //      .
  9130. //      .
  9131. };
  9132.  
  9133. A destructor takes no arguments and has no return type. You cannot take its 
  9134. address. Destructors cannot be declared const, volatile, or static. A 
  9135. destructor can be declared virtual  or pure virtual. A union cannot have as a 
  9136. member an object of a class with a destructor. 
  9137.  
  9138. Destructors are usually used to deallocate memory and do other cleanup for a 
  9139. class object and its class members when the object is destroyed. A destructor 
  9140. is called for a class object when that object passes out of scope or is 
  9141. explicitly deleted. 
  9142.  
  9143. Class members that are class types can have their own destructors. Both base 
  9144. and derived classes can have destructors, although destructors are not 
  9145. inherited. If a base class or a member of a base class has a destructor and a 
  9146. class derived from that base class does not declare a destructor, a default 
  9147. destructor is generated. The default destructor calls the destructors of the 
  9148. base class and members of the derived class. Default destructors are generated 
  9149. with default public access. 
  9150.  
  9151. Destructors are called in the reverse order to constructors: 
  9152.  
  9153.  1. The destructor for a class object is called before destructors for members 
  9154.     and bases are called. 
  9155.  2. Destructors for nonstatic members are called before destructors for base 
  9156.     classes are called. 
  9157.  3. Destructors for nonvirtual base classes are called before destructors for 
  9158.     virtual base classes are called. 
  9159.  
  9160. When an exception is thrown for a class object with a destructor, the 
  9161. destructor for the temporary object thrown is not called until control passes 
  9162. out of the catch block. For more details, see "Constructors and Destructors" in 
  9163. "Chapter 15. Exception Handling" 
  9164.  
  9165. Destructors are implicitly called when an automatic or temporary object passes 
  9166. out of scope. They are implicitly called at program termination for constructed 
  9167. external and static objects. Destructors are invoked when you use the delete 
  9168. operator for objects created with the  new operator. For example: 
  9169.  
  9170. #include <string.h>
  9171. class Y
  9172. {
  9173. private:
  9174.       char * string;
  9175.       int number;
  9176. public:
  9177.       Y(const char* n,int a);           // constructor
  9178.       ~Y() { delete string; } // destructor
  9179. };
  9180. Y::Y(const char* n, int a) // define class Y constructor
  9181. {
  9182.       string = strcpy(new char[strlen(n) + 1 ], n);
  9183.       number = a;
  9184. }
  9185. void main ()
  9186. {
  9187.       Y yobj = Y("somestring", 10); // create and initialize
  9188.                                     // object of class Y
  9189. //      .
  9190. //      .
  9191. //      .
  9192. // destructor ~Y is called before control returns from
  9193. main()
  9194. }
  9195.  
  9196. You can use a destructor explicitly to destroy objects, although it is not 
  9197. recommended. If an object has been placed at a specific address by the new 
  9198. operator, you can call the destructor of the object explicitly to destroy it. 
  9199. An explicitly called destructor cannot delete storage. 
  9200.  
  9201. Note:  You can only call destructors for class types. You cannot call 
  9202. destructors for simple types. The call to the destructor in the following 
  9203. example causes an error: 
  9204.  
  9205.       int * ptr;
  9206.       ptr -> int::~int(); // error
  9207.  
  9208.  
  9209. ΓòÉΓòÉΓòÉ 12.4. Free Store ΓòÉΓòÉΓòÉ
  9210.  
  9211. Free store is used for dynamic allocation of memory. The new and delete 
  9212. operators are used to allocate and deallocate free store, respectively. You can 
  9213. define your own versions of new and delete for a class by overloading them. You 
  9214. can supply the new and delete operators with additional arguments. When new and 
  9215. delete operate on class objects, the class member operator functions new and 
  9216. delete are called, if they have been declared. 
  9217.  
  9218. If you create a class object with the new operator, the operator function 
  9219. operator new() (if it has been declared) is called to create the object. An 
  9220. operator function operator new() for a class is always a static class member, 
  9221. even if it is not declared with the keyword static. The operator function 
  9222. operator new() has a return type void*. The first argument to the operator 
  9223. function operator new() must be the size of the object type and have type 
  9224. size_t. size_t is an implementation integral type defined in <stddef.h>. 
  9225.  
  9226. When you overload the new operator, you must declare it as a class member, 
  9227. returning type void*, with first argument size_t, as described above. You 
  9228. supply additional arguments in the declaration of the operator function 
  9229. operator new(). Values for these arguments are specified in an allocation 
  9230. expression by using the placement syntax. The following example shows two 
  9231. overloaded new operator functions. 
  9232.  
  9233. #include <stddef.h>
  9234. class X
  9235. {
  9236. public:
  9237.       void* operator new(size_t);
  9238.       void* operator new(size_t, int);
  9239. };
  9240. //      .
  9241. //      .
  9242. //      .
  9243. void main ()
  9244. {
  9245.       X* ptr1 = new X;        // calls X::operator
  9246. new(sizeof(X))
  9247.       X* ptr2 = new(10) X;    // calls X::operator
  9248.                               // new(sizeof(X),10)
  9249. }
  9250.  
  9251. The delete operator destroys an object created by the new operator. The operand 
  9252. of delete must be a pointer returned by new. If delete is called for an object 
  9253. with a destructor, the destructor is invoked before the object is deallocated. 
  9254.  
  9255. If you destroy a class object with the delete operator, the operator function 
  9256. operator delete()  (if it has been declared) is called to destroy the object. 
  9257. An operator function operator delete() for a class is always a static member, 
  9258. even if it is not declared with the keyword static. The first argument to 
  9259. delete must have type void*. Because the operator function operator delete() 
  9260. has a return type void, it cannot return a value. 
  9261.  
  9262. When you overload the delete operator, you must declare it as class member, 
  9263. returning type void, with first argumenthaving type void*, as described above. 
  9264. You may supply an additional argument in the declaration of the operator 
  9265. function operator delete() having type size_t.You can only have one operator 
  9266. function operator delete() for a single class. The following example shows the 
  9267. declaration and use of the operator functions operator new() and operator 
  9268. delete(): 
  9269.  
  9270. #include <stddef.h>
  9271. class X
  9272. {
  9273. public:
  9274.       void* operator new(size_t);
  9275.       void operator delete(void*);         // single argument
  9276. };
  9277. class Y
  9278. {
  9279. public:
  9280.       void operator delete(void*, size_t); // two arguments
  9281. };
  9282. //      .
  9283. //      .
  9284. //      .
  9285. void main ()
  9286. {
  9287.       X* ptr = new X;
  9288.       delete ptr;      // call X::operator delete(void*)
  9289.       Y* yptr;
  9290. //      .
  9291. //      .
  9292. //      .
  9293.       delete yptr;     // call Y::operator delete(void*,
  9294. size_t)
  9295.                        // with size of Y as second argument
  9296. }
  9297.  
  9298. The result of trying to access a deleted object is undefined because the value 
  9299. of the object can change after deletion. 
  9300.  
  9301. If new and delete are called for a class object that does not declare the 
  9302. operator functions new and delete, or they are called for a nonclass object, 
  9303. the global operators new  and delete  are used. The global operators new and 
  9304. delete are provided in the C++ library. 
  9305.  
  9306. When you declare arrays of class objects, the global new and  delete operators 
  9307. are used. 
  9308.  
  9309.  
  9310. ΓòÉΓòÉΓòÉ 12.5. Temporary Objects ΓòÉΓòÉΓòÉ
  9311.  
  9312. It is sometimes necessary for the &xcomp. to create temporary objects. 
  9313. Temporary objects are used during reference initialization and during 
  9314. evaluation of expressions including standard type conversions, argument 
  9315. passing, function returns, and evaluation of the throw expression. 
  9316.  
  9317. When a temporary object is created to initialize a reference variable, the 
  9318. temporary object has the same scope as the reference variable. When a temporary 
  9319. object is created during the evaluation of an expression, it will exist until 
  9320. there is a break in the flow of control of the program. 
  9321.  
  9322. If a temporary object is created for a class with constructors, the &xcomp. 
  9323. calls the appropriate (matching) constructor to create the temporary object. 
  9324.  
  9325. When a temporary object is destroyed and a destructor exists, the &xcomp. calls 
  9326. the destructor to destroy the temporary object. When you exit from the scope in 
  9327. which the temporary object was created, it is destroyed. For example, if a 
  9328. reference is bound to a temporary object, the temporary object is destroyed 
  9329. when the reference passes out of scope. The following example shows two 
  9330. expressions in which temporary objects are constructed: 
  9331.  
  9332. class Y
  9333. {
  9334. public:
  9335.       Y(int);
  9336.       Y(Y&);
  9337.       ~Y();
  9338. };
  9339. Y add(Y y) { /* ... */ }
  9340. //      .
  9341. //      .
  9342. //      .
  9343. void main ()
  9344. {
  9345.       Y obj1(10);
  9346.       Y obj2 = add(Y(5));       // one temporary created
  9347.       obj1 = add(obj1);         // two temporaries created
  9348. }
  9349.  
  9350. In the above example, a temporary object of class type Y is created to 
  9351. construct Y(5) before it is passed to the function add(). Because obj2 is being 
  9352. constructed, the function add() can construct its return value directly into 
  9353. obj2, so another temporary object is not created. A temporary object of class 
  9354. type Y is created when obj1 is passed to the function add(). Because obj1 has 
  9355. already been constructed, the function add() constructs its return value into a 
  9356. temporary object. This second temporary object is then assigned to obj1 using 
  9357. an assignment operator. 
  9358.  
  9359.  
  9360. ΓòÉΓòÉΓòÉ 12.6. User-Defined Conversions ΓòÉΓòÉΓòÉ
  9361.  
  9362. User-defined conversions allow you to specify object conversions with 
  9363. constructors or with conversion functions. User-defined conversions are 
  9364. implicitly used in addition to standard conversions for conversion of 
  9365. initializers, functions arguments, function return values, expression operands, 
  9366. expressions controlling iteration, selection statements, and explicit type 
  9367. conversions. For more details, see "Type Conversions" 
  9368.  
  9369.  
  9370. ΓòÉΓòÉΓòÉ 12.6.1. Conversion by Constructor ΓòÉΓòÉΓòÉ
  9371.  
  9372. You can call a class constructor with a single argument to convert from the 
  9373. argument type to the type of the class. For example: 
  9374.  
  9375. class Y
  9376. {
  9377.       int a,b;
  9378.       char* name;
  9379. public:
  9380.       Y(int i);
  9381.       Y(const char* n, int j = 0);
  9382. };
  9383. void add(Y);
  9384. //      .
  9385. //      .
  9386. //      .
  9387. void main ()
  9388. {
  9389.       // code                  equivalent code
  9390.       Y obj1 = 2;              // obj1 = Y(2)
  9391.       Y obj2 = "somestring";   // obj2 = Y("somestring",0)
  9392.       obj1 = 10;               // obj1 = Y(10)
  9393.       add(5);                  // add(Y(5))
  9394. }
  9395.  
  9396. At most one user-defined conversion, either a constructor or conversion 
  9397. function, is implicitly applied to a class object. When you call a constructor 
  9398. with an argument and you have not defined a constructor accepting that argument 
  9399. type, only standard conversions are used to convert the argument to another 
  9400. argument type acceptable to a constructor for that class. Other constructors or 
  9401. conversions functions are not called to convert the argument to a type 
  9402. acceptable to a constructor defined for that class. 
  9403.  
  9404.  
  9405. ΓòÉΓòÉΓòÉ 12.6.2. Conversion Functions ΓòÉΓòÉΓòÉ
  9406.  
  9407. You can define a member function of a class, called a conversion function, that 
  9408. converts from the type of its class to another specified type. The syntax for a 
  9409. conversion function is: 
  9410.  
  9411.       conversion-function-name:
  9412.             operator conversion-type-name
  9413.  
  9414.       conversion-type-name:
  9415.             type-specifier-list
  9416. [ptr-operator]
  9417.  
  9418. The conversion function specifies a conversion from the class type the 
  9419. conversion function is a member of, to the type specified by the 
  9420. conversion-type-name. Classes, enumerations, and typedef names cannot be 
  9421. declared or defined in the type-specifier-list. 
  9422.  
  9423. The following code fragment shows a conversion function called operator int(): 
  9424.  
  9425. class Y
  9426. {
  9427.       int b;
  9428. public:
  9429.       operator int();
  9430. };
  9431. Y::operator int() {return b;}
  9432.  
  9433. void f(Y obj )
  9434. {
  9435.       // each value assigned is converted by Y::operator
  9436. int()
  9437.       int i = int(obj);
  9438.       int j = (int)obj;
  9439.       int k = i + obj;
  9440. }
  9441.  
  9442. Conversion functions have no arguments, and the return type is implicitly the 
  9443. conversion type. Conversion functions can be inherited. You can have virtual 
  9444. conversion functions but not static ones. 
  9445.  
  9446. Only one user-defined conversion is implicitly applied to a single value. 
  9447. User-defined conversions must be unambiguous, or they are not called. 
  9448.  
  9449. If a conversion function is declared with the keyword const, the keyword has no 
  9450. affect on the function except for acting as a tie-breaker when there is more 
  9451. than one conversion function that could be applied. Specifically, if more than 
  9452. one conversion function could be applied, all of these functions are compared. 
  9453. If any of these functions is declared with the keyword const, const is ignored 
  9454. for the purposes of this comparison. If one of these functions is a best match, 
  9455. this function is applied. If there is no best match, the functions are compared 
  9456. again, but this time const is not ignored. 
  9457.  
  9458.  
  9459. ΓòÉΓòÉΓòÉ 12.7. Initialization by Constructor ΓòÉΓòÉΓòÉ
  9460.  
  9461. A class object with a constructor must be explicitly initialized or have a 
  9462. default constructor. Explicit initialization using a constructor is the only 
  9463. way, except for aggregate initialization, to initialize nonstatic constant and 
  9464. reference class members. 
  9465.  
  9466. A class object that has no constructors, no virtual functions, no private or 
  9467. protected members and no base classes is called an aggregate. 
  9468.  
  9469.  
  9470. ΓòÉΓòÉΓòÉ 12.7.1. Explicit Initialization ΓòÉΓòÉΓòÉ
  9471.  
  9472. Class objects with constructors can be initialized with a parenthesized 
  9473. expression list. This list is used as an argument list for the call of a 
  9474. constructor that is used to initialize the class. You can also call a 
  9475. constructor with a single initialization value using the = operator. Since this 
  9476. type of expression is an initialization not an assignment, the assignment 
  9477. operator function, if one exists, is not called. This value is used as a single 
  9478. argument for the call of a constructor. The type of the single argument must 
  9479. match the type of the first argument to the constructor. If the constructor has 
  9480. remaining arguments, these arguments must have default values. The syntax for 
  9481. an initializer that explicitly initializes a class object with a constructor 
  9482. is: 
  9483.  
  9484.       initializer:
  9485.             (expression)
  9486.             = expression
  9487.  
  9488. The following example shows the declaration and use of several constructors 
  9489. that explicitly initialize class objects: 
  9490.  
  9491. #include <iostream.h>
  9492. class complx
  9493. {
  9494.       double re, im ;
  9495. public:
  9496.       complx();   // default constructor
  9497.       complx(const complx& c) {re = c.re; im = c.im;}
  9498.                   // copy constructor
  9499.       complx( double r, double i = 0.0) {re = r; im =
  9500. i;}
  9501.                   // constructor with default trailing argument
  9502.       void display()
  9503.       {
  9504.             cout << "re = "<< re <<
  9505. " im = " << im << endl;
  9506.       }
  9507. };
  9508. //      .
  9509. //      .
  9510. //      .
  9511. void main ()
  9512. {
  9513.       complx one(1);      // initialize with complx(double,
  9514. double)
  9515.       complx two = one;   // initialize with a copy of
  9516. one
  9517.                           // using complx::complx(const complx&)
  9518.       complx three = complx(3,4);  // construct complx(3,4)
  9519.                                    // directly into three
  9520.       complx four;                 // initialize with default constructor
  9521.       complx five = 5;             // complx(double, double) &
  9522. construct
  9523.                                    // directly into five
  9524.       one.display();
  9525.       two.display();
  9526.       three.display();
  9527.       four.display();
  9528.       five.display();
  9529. }
  9530.  
  9531. The above example produces the following output: 
  9532.  
  9533. re = 1 im = 0
  9534. re = 1 im = 0
  9535. re = 3 im = 4
  9536. re = 0 im = 0
  9537. re = 5 im = 0
  9538.  
  9539. Constructors can initialize their members in two different ways. A constructor 
  9540. can use the arguments passed to it to initialize member variables in the 
  9541. constructor definition: 
  9542.  
  9543. complx( double r, double i = 0.0) {re = r; im = i;}
  9544.  
  9545. or a constructor can have an initializer list within the definition but prior 
  9546. to the function body: 
  9547.  
  9548. complx ( double r, double i = 0) : re(r), im(i) { /* ...
  9549. */ }
  9550.  
  9551. Both methods assign the argument values to the appropriate data members of the 
  9552. class. The second method must be used to initialize base classes from within a 
  9553. derived class in order to initialize constant and reference members and members 
  9554. with constructors. 
  9555.  
  9556.  
  9557. ΓòÉΓòÉΓòÉ 12.7.2. Initializing Base Classes and Members ΓòÉΓòÉΓòÉ
  9558.  
  9559. You can initialize immediate base classes and derived class members that are 
  9560. not inherited from base classes by specifying initializers in the constructor 
  9561. definition prior to the function body. The syntax for a constructor initializer 
  9562. is: 
  9563.  
  9564.       ctor-initializer:
  9565.             mem-initializer-list
  9566.  
  9567.       mem-initializer-list:
  9568.             mem-initializer
  9569.             mem-initializer ,
  9570. mem-initializer-list
  9571.  
  9572.       mem-initializer:
  9573.             complete-class-name (
  9574. [expression-list]
  9575. )
  9576.             identifier (
  9577. [expression-list]
  9578. )
  9579.  
  9580. In a constructor that is not inline, include the initialization list as part of 
  9581. the function definition, not as part of the class declaration. For example: 
  9582.  
  9583. class B1
  9584. {
  9585.       int b;
  9586. public:
  9587.       B1();
  9588.       B1(int i) : b(i) { /* ... */ }      // inline
  9589. constructor
  9590. };
  9591. class B2
  9592. {
  9593.       int b;
  9594. protected:
  9595.       B2();
  9596.       B2(int i);                        // noninline constructor
  9597. };
  9598. // B2 constructor definition including initialization list
  9599. B2::B2(int i) : b(i) { /* ...*/ }
  9600. //      .
  9601. //      .
  9602. //      .
  9603. class D : public B1, public B2
  9604. {
  9605.       int d1, d2;
  9606. public:
  9607.       D(int i, int j) : B1(i+1), B2(), d1(i) {d2 = j;}
  9608. };
  9609.  
  9610. If you do not explicitly initialize a base class or member that has 
  9611. constructors by calling a constructor, the &xcomp. will automatically 
  9612. initialize the base class or member with a default constructor. In the above 
  9613. example, if you leave out the call B2() in the constructor of class D (as shown 
  9614. below), a constructor initializer with an empty expression list is 
  9615. automatically created to initialize B2. Thus, the constructors for class D, 
  9616. shown above and below, will result in the same construction of an object of 
  9617. class D. 
  9618.  
  9619. class D : public B1, public B2
  9620. {
  9621.       int d1, d2;
  9622. public:
  9623.       // call B2() generated by compiler
  9624.       D(int i, int j) : B1(i+1), d1(i) {d2 = j;}
  9625. };
  9626.  
  9627. Note:  You must declare base constructors with the access specifiers public or 
  9628. protected to enable a derived class to call them. For example: 
  9629.  
  9630. class B1
  9631. {
  9632.       int b;
  9633. public:
  9634.       B1();
  9635.       B1(int i) : b(i) { /* ... */ }
  9636. };
  9637. class B2
  9638. {
  9639.       int b;
  9640. protected:
  9641.       B2();
  9642.       B2(int i);
  9643. };
  9644. B2::B2(int i) : b(i) { /* ... */ }
  9645. class B4
  9646. {
  9647. public:
  9648.       B4();         // public constructor for B4
  9649.       int b;
  9650. private:
  9651.       B4(int);      // private constructor for B4
  9652. };
  9653. //      .
  9654. //      .
  9655. //      .
  9656. class D : public B1, public B2, public B4
  9657. {
  9658.       int d1, d2;
  9659. public:
  9660.       D(int i, int j) : B1(i+1), B2(i+2) , B4(i) {d1 = i;
  9661. d2 = j;}
  9662.             // error, attempt to access private constructor
  9663. B4()
  9664.       D(int i, int j) : B1(i+1), B2(i+2) {d1 = i; d2 =
  9665. j;}
  9666.             // valid, calls public constructor for B4
  9667. };
  9668.  
  9669.  
  9670. ΓòÉΓòÉΓòÉ 12.7.3. Construction Order of Derived Class Objects ΓòÉΓòÉΓòÉ
  9671.  
  9672. When a derived class object is created using constructors, it is created in the 
  9673. following order: 
  9674.  
  9675.  1. Virtual base classes are initialized, in the order they appear in the base 
  9676.     list. 
  9677.  2. Nonvirtual base classes are initialized, in declaration order. 
  9678.  3. Class members are initialized, in declaration order (regardless of their 
  9679.     order in the initialization list). 
  9680.  4. The body of the constructor is executed. 
  9681.  
  9682. In the following code fragment, the constructor for class B1 is called before 
  9683. the member d1 is initialized. Thus, the value passed to the constructor 
  9684. forclass B1 is undefined. 
  9685.  
  9686. class B1
  9687. {
  9688.       int b;
  9689. public:
  9690.       B1();
  9691.       B1(int i) {b = i;}
  9692. };
  9693. //      .
  9694. //      .
  9695. //      .
  9696. class D : public B1
  9697. {
  9698.       int d1, d2;
  9699. public:
  9700.       D(int i, int j) : d1(i), B1(d1) {d2 = j;}
  9701.       // d1 is not initialized in call B1::B1(d1)
  9702. };
  9703.  
  9704.  
  9705. ΓòÉΓòÉΓòÉ 12.8. Copying Class Objects ΓòÉΓòÉΓòÉ
  9706.  
  9707. You can copy one class object to another object of the same type by either 
  9708. assignment or initialization. 
  9709.  
  9710. Copy by assignment is implemented with an assignment operator function. If you 
  9711. do not define the assignment operator, it is defined as memberwise assignment. 
  9712.  
  9713. Copy by initialization is implemented with a copy constructor. If you do not 
  9714. define a copy constructor, it is defined as memberwise initialization of 
  9715. members of its class. 
  9716.  
  9717. Memberwise assignment and memberwise initialization mean that, if aclass has a 
  9718. member that is a class object, the assignment operator and copy constructor of 
  9719. that class object are used to implement assignment and initialization of the 
  9720. member. 
  9721.  
  9722.  
  9723. ΓòÉΓòÉΓòÉ 12.8.1. Copy Restrictions ΓòÉΓòÉΓòÉ
  9724.  
  9725. A default assignment operator cannot be generated for a class that has: 
  9726.  
  9727. o A nonstatic constant or reference data member 
  9728.  
  9729. o A nonstatic data member or base class whose assignment operator is not 
  9730.   accessible 
  9731.  
  9732. o A nonstatic data member or base class with no assignment operator and for 
  9733.   which a default assignment operator cannot be generated. 
  9734.  
  9735. A default copy constructor cannot be generated for a class that has: 
  9736.  
  9737. o A nonstatic data member or base class whose copy constructor is not 
  9738.   accessible 
  9739.  
  9740. o A nonstatic data member or base class with no copy constructor and for which 
  9741.   a default copy constructor cannot be generated. 
  9742.  
  9743.  
  9744. ΓòÉΓòÉΓòÉ 12.8.2. Copy by Assignment ΓòÉΓòÉΓòÉ
  9745.  
  9746. If you do not define an assignment operator and one is required, a default 
  9747. assignment operator is defined. If you do not define an assignment operator and 
  9748. one is not required, a default assignment operator is declared but not defined. 
  9749. If an assignment operator that takes a single argument of a class type exists 
  9750. for a class, a default assignment operator is not generated. 
  9751.  
  9752. Copy by assignment is used only in assignment. 
  9753.  
  9754. You can define an assignment operator for a class with a single argument that 
  9755. is a constant reference to that class type, only if all its base classes and 
  9756. members have assignment operators that accept constant arguments. For example: 
  9757.  
  9758. class B1
  9759. {
  9760. public:
  9761.       B1& operator=(const B1&);
  9762. };
  9763. class D: public B1
  9764. {
  9765. public:
  9766.       D& operator=(const D&);
  9767. };
  9768. D& D::operator=(const D& dobj) {D dobj2 = dobj; return
  9769. dobj2;}
  9770.  
  9771. Otherwise, you can define an assignment operator for a class with a single 
  9772. argument that is a reference to that class type. For example: 
  9773.  
  9774. class Z
  9775. {
  9776. public:
  9777.       Z& operator=( Z&);
  9778. };
  9779. Z& Z::operator=(Z& zobj) {Z zobj2 = zobj; return
  9780. zobj2;}
  9781.  
  9782. The default assignment operator for a class is a public class member. The 
  9783. return type is a reference to the class type it is a member of. 
  9784.  
  9785. For further details on standard C++ assignment operators, see "Assignment 
  9786. Operators" For further details on assignment operator functions, see 
  9787. "Assignment" in "Special Overloaded Operators" 
  9788.  
  9789.  
  9790. ΓòÉΓòÉΓòÉ 12.8.3. Copy by Initialization ΓòÉΓòÉΓòÉ
  9791.  
  9792. You can define a copy constructor for a class. If you do not define a copy 
  9793. constructor and one is required, a default copy constructor is defined. If you 
  9794. do not define a copy constructor, and one is not required, a default copy 
  9795. constructor is declared but not defined. If a class has a copy constructor 
  9796. defined, a default copy constructor is not generated. 
  9797.  
  9798. Copy by initialization is used only in initialization. 
  9799.  
  9800. You can define a copy constructor for a class with a single argument that is a 
  9801. constant reference to a class type only if all its base classes and members 
  9802. have copy constructors that accept constant arguments. For example: 
  9803.  
  9804. class B1
  9805. {
  9806. public:
  9807.       B1(const B1&) { /* ... */ }
  9808. };
  9809.  
  9810. class D: public B1
  9811. {
  9812. public:
  9813.       D(const D&);
  9814. };
  9815. D::D(const D& dobj):B1(dobj) { /* ... */ }
  9816.  
  9817. Otherwise, you can define a copy constructor with a single reference to a class 
  9818. type argument. For example, 
  9819.  
  9820. class Z
  9821. {
  9822. public:
  9823.       Z(Z&);
  9824. };
  9825. Z::Z(Z&) { /* ...*/ }
  9826.  
  9827. The default copy constructor for a class is a public class member. For further 
  9828. details on copy constructors, see  "Copy Constructors" and "Initialization by 
  9829. Constructor" 
  9830.  
  9831.  
  9832. ΓòÉΓòÉΓòÉ 12.9. Related Information ΓòÉΓòÉΓòÉ
  9833.  
  9834. "C++ Classes" 
  9835.  
  9836. "Class Members and Friends" 
  9837.  
  9838. "C++ Overloading" 
  9839.  
  9840. "Inheritance" 
  9841.  
  9842.  
  9843. ΓòÉΓòÉΓòÉ 13. Chapter 13. Inheritance ΓòÉΓòÉΓòÉ
  9844.  
  9845. This chapter described the following concepts and features of C++ : 
  9846.  
  9847. o Inheritance 
  9848. o Derivation 
  9849. o Inherited member access 
  9850. o Multiple inheritance 
  9851. o Virtual functions 
  9852. o Abstract classes. 
  9853.  
  9854. You can also return to the table of contents 
  9855.  
  9856.  
  9857. ΓòÉΓòÉΓòÉ 13.1. Inheritance ΓòÉΓòÉΓòÉ
  9858.  
  9859. In C++, you can create classes from existing classes using the object-oriented 
  9860. programming technique called inheritance. Inheritance allows you to define an 
  9861. "is a" relationship between classes. When members are inherited, they can be 
  9862. used as if they are members of the class that inherits them. 
  9863.  
  9864.  
  9865. ΓòÉΓòÉΓòÉ 13.1.1. Single Inheritance ΓòÉΓòÉΓòÉ
  9866.  
  9867. C++ implements inheritance through the mechanism of derivation. Derivation 
  9868. allows you to reuse code by creating new classes, called derived classes, that 
  9869. inherit properties from one or more existing classes, called base classes. A 
  9870. derived class inherits the properties, including data and function members, of 
  9871. its base class. In addition to inheriting base class members, you can add new 
  9872. data members and member functions to the derived class. You can also 
  9873. reimplement existing member functions or data by overriding base class members 
  9874. functions or data in the newly derived class. 
  9875.  
  9876. Suppose you have defined a shape class to describe and operate on geometric 
  9877. shapes.  Now suppose you want to define a circle class. Because you have 
  9878. existing code that operates on the shape class, you can use inheritance to 
  9879. create the circle class. You can redefine operations in the derived circle 
  9880. class that were originally defined in the shape base class. When you manipulate 
  9881. an object of the circle class, these redefined function implementations will be 
  9882. used. For example: 
  9883.  
  9884. class shape
  9885. {
  9886.       char* name;
  9887.       int xpoint, ypoint;
  9888. public:
  9889.       virtual void rotate(int);
  9890.       virtual void draw();
  9891.        void display() const;
  9892. };
  9893.  
  9894. class circle: public shape      // derive class circle from
  9895. class shape
  9896. {
  9897.       int xorigin, yorigin;
  9898.       int radius;
  9899. public:
  9900.       void rotate(int);
  9901.       void draw();
  9902.       void display() const;
  9903. };
  9904. //      .
  9905. //      .
  9906. //      .
  9907.  
  9908. In the above example, class circle inherits the data members name, xpoint and 
  9909. ypoint as well as the member functions display(), rotate(), and draw() from 
  9910. class shape. Because the member functions rotate() and draw() are declared in 
  9911. class shape with the keyword virtual, you can provide an alternative 
  9912. implementation for them in class circle. You can also provide an alternative 
  9913. implementation for the nonvirtual member function display() in class circle. 
  9914. When you manipulate an argument of type circle using a pointer to shape, and 
  9915. call a virtual member function, the member function defined in the derived 
  9916. class will override the base class member function. A similar call to a 
  9917. nonvirtual member function will call the member function defined in the base 
  9918. class. In addition to inheriting the members of class shape, class circle has 
  9919. declared its own data members, xorigin, yorigin and radius. 
  9920.  
  9921. The key difference between virtual and nonvirtual member functions is that when 
  9922. you treat the circle class as if it were a shape, the implementations of the 
  9923. virtual functions rotate() and draw() defined in class circle are used rather 
  9924. than those originally defined in class shape. Because display() is a nonvirtual 
  9925. member function, the original implementation of display() defined in class 
  9926. shape is used. 
  9927.  
  9928.  
  9929. ΓòÉΓòÉΓòÉ 13.1.2. Multiple Inheritance ΓòÉΓòÉΓòÉ
  9930.  
  9931. Multiple inheritance  allows you to create a derived class that inherits 
  9932. properties from more than one base class. For example, in addition to the shape 
  9933. class, described above, you could also have a symbol class. Because a circle is 
  9934. both a shape and a symbol, you can use multiple inheritance to reflect this 
  9935. relationship. If the circle class is derived from both the shape and symbol 
  9936. classes, the circle class inherits properties from both classes. 
  9937.  
  9938. class symbol
  9939. {
  9940.       char* language;
  9941.       char letter;
  9942.       int number;
  9943. public:
  9944.       virtual void write();
  9945.       virtual void meaning();
  9946. };
  9947. class shape
  9948. {
  9949.       char* name;
  9950.       int xpoint, ypoint;
  9951. public:
  9952.       virtual void rotate(int);
  9953.       virtual void draw();
  9954.        void display() const;
  9955. };
  9956. class circle: public symbol, public shape
  9957. {
  9958.       int xorigin, yorigin;
  9959.       int radius;
  9960. public:
  9961.       void rotate(int);
  9962.       void draw ();
  9963.       void write();
  9964.       void meaning();
  9965.       void display() const;
  9966. };
  9967. //      .
  9968. //      .
  9969. //      .
  9970.  
  9971. In the above example, class circle inherits the members name, xpoint, ypoint, 
  9972. display(), rotate(), and draw() from class shape and also inherits the members 
  9973. language, letter, number, write(), and meaning() from class symbol. 
  9974.  
  9975. Because a derived class inherits members from all its base classes, ambiguities 
  9976. can result. For example, if two base classes have a member with the same name, 
  9977. the derived class cannot implicitly differentiate between the two members. Note 
  9978. that when using multiple inheritance, the access to names of base classes may 
  9979. be ambiguous. 
  9980.  
  9981.  
  9982. ΓòÉΓòÉΓòÉ 13.1.3. The Inheritance Design Process ΓòÉΓòÉΓòÉ
  9983.  
  9984. Multiple inheritance allows you to have more than one base class for a single 
  9985. derived class. You can create an interconnected inheritance graph of inherited 
  9986. classes by using derived classes as base classes for other derived classes. You 
  9987. can build an inheritance graph through the process of specialization, in which 
  9988. derived classes are more specialized than their base classes. You can also work 
  9989. in the reverse direction and build an inheritance graph through generalization. 
  9990. If you have a number of related classes that share a group of properties, you 
  9991. can generalize and build a base class to embody them. The group of related 
  9992. classes become the derived classes of the new base class. 
  9993.  
  9994.  
  9995. ΓòÉΓòÉΓòÉ 13.1.4. Direct and Indirect Base Classes ΓòÉΓòÉΓòÉ
  9996.  
  9997. A direct base class  is a base class that appears directly as a base specifier 
  9998. in the declaration of its derived class. A direct base class is analogous to a 
  9999. parent in a hierarchical graph. In the above example, both shape and symbol are 
  10000. direct base classes of class circle. 
  10001.  
  10002. An indirect base class is a base class that does not appear directly in the 
  10003. declaration of the derived class but is available to the derived class through 
  10004. one of its base classes. An indirect base class is analogous to a grandparent 
  10005. or great grandparent or great great grandparent in a hierarchical graph. For a 
  10006. given class, all base classes that are not direct base classes are indirect 
  10007. base classes. 
  10008.  
  10009.  
  10010. ΓòÉΓòÉΓòÉ 13.1.5. Polymorphism ΓòÉΓòÉΓòÉ
  10011.  
  10012. Polymorphic functions are functions that can be applied to objects of more than 
  10013. one type. In C++, polymorphic functions are implemented in two ways: 
  10014.  
  10015. o Overloaded functions are statically bound at compile time 
  10016.  
  10017. o C++ provides virtual functions. A virtual function is a function that can be 
  10018.   called for a number of different user-defined types that are related through 
  10019.   derivation. Virtual functions are bound dynamically at run time. 
  10020.  
  10021. Typically, a base class has several derived classes, each requiring its own 
  10022. customized version of a particular operation. It is difficult for a base class 
  10023. to implement member functions that are useful for all its derived classes. A 
  10024. base class would have to determine which derived class an object belonged to 
  10025. before it could execute the applicable code for that object. When a virtual 
  10026. function is called, the &xcomp. executes the function implementation associated 
  10027. with the object that the function is called for. The implementation of the base 
  10028. class is only a default that is used when the derived class does not contain 
  10029. its own implementation. 
  10030.  
  10031.  
  10032. ΓòÉΓòÉΓòÉ 13.2. Derivation ΓòÉΓòÉΓòÉ
  10033.  
  10034. Inheritance is implemented in C++ through the mechanism of derivation. 
  10035. Derivation allows you to derive a class, called a derived class, from another 
  10036. class, called a base class. 
  10037.  
  10038. In the declaration of a derived class you list the base classes of the derived 
  10039. class. The derived class inherits its members from these base classes.  All 
  10040. classes that appear in the list of base classes must be previously defined 
  10041. classes. 
  10042.  
  10043. class W
  10044. {
  10045. public:
  10046.       int a,b;
  10047. };
  10048. class Z: public W
  10049. {
  10050. public:
  10051.       int c,d;
  10052. };
  10053. //      .
  10054. //      .
  10055. //      .
  10056.  
  10057. Incompletely declared classes are not allowed in base lists. For example: 
  10058.  
  10059. class X; // incomplete declaration of class X
  10060. class Y: public X      // error
  10061. {
  10062. //      .
  10063. //      .
  10064. //      .
  10065. };
  10066.  
  10067. When you derive a class, the derived class inherits class members of the base 
  10068. class. You can refer to inherited members (base class members) as if they were 
  10069. members of the derived class. For example: 
  10070.  
  10071. class base
  10072. {
  10073. public:
  10074.       int a,b;
  10075. };
  10076. class derived : public base
  10077. {
  10078. public:
  10079.       int c;
  10080. };
  10081. void main()
  10082. {
  10083.       derived d;
  10084.       d.a = 1;       // base::a
  10085.       d.b = 2;       // base::b
  10086.       d.c = 3;      // derived:
  10087. }
  10088.  
  10089. The derived class can also add new class members and redefine existing base 
  10090. class members. In the above example, the two inherited members, a and b, of the 
  10091. derived class d, in addition to the derived class member c, are assigned 
  10092. values. If you redefine base class members in the derived class, you can still 
  10093. refer to the base class members by using the :: (scope) operator. For example: 
  10094.  
  10095. #include <iostream.h>
  10096. class base
  10097. {
  10098. public:
  10099.       char* name;
  10100.       void display(char* i) {cout << i <<
  10101. endl;}
  10102. };
  10103. class derived : public base
  10104. {
  10105. public:
  10106.       char* name;
  10107.       void display(char* i){cout << i <<
  10108. endl;}
  10109. };
  10110. void main()
  10111. {
  10112.       derived d; // create derived class object
  10113.       d.name = "Derived Class"; // assignment to derived:
  10114.       d.base:="Base Class"; // assignment to base:
  10115.       // call derived:::name)
  10116.       d.display(d.name);
  10117.       // call base:::name)
  10118.       d.base::display(d.base::name);
  10119. }
  10120.  
  10121. The :: (scope) operator is described on page Scope Operator. 
  10122.  
  10123. You can manipulate a derived class object as if it were a base class object. 
  10124. You can use a pointer or a reference to a derived class object in place of a 
  10125. pointer or reference to its base class. For example, you can pass a pointer or 
  10126. reference to a derived class object D to a function expecting a pointer or 
  10127. reference to the base class of D.  You do not need to use an explicit cast to 
  10128. achieve this; a standard conversion is performed. You can implicitly convert a 
  10129. pointer to a derived class to point to a base class. You can also implicitly 
  10130. convert a reference to a derived class to a reference to a base class. 
  10131.  
  10132. In the following example, d, a pointer to a derived class object, is assigned 
  10133. to bptr, a pointer to a base class object. A call is made to display() using 
  10134. bptr. Even though bptr has a type of pointer to base, in the body of display() 
  10135. the name member of derived is manipulated: 
  10136.  
  10137. #include <iostream.h>
  10138. class base
  10139. {
  10140. public:
  10141.       char* name;
  10142.       void display(char* i) {cout << i <<
  10143. endl;}
  10144. };
  10145. class derived : public base
  10146. {
  10147. public:
  10148.       char* name;
  10149.       void display(char* i){cout << i <<
  10150. endl;}
  10151. };
  10152. void main()
  10153. {
  10154.       derived d;
  10155.  
  10156.       // standard conversion from derived* to base*
  10157.       base* bptr = &d;
  10158.       // call base:::name)
  10159.       bptr->display(bptr->name);
  10160. }
  10161.  
  10162. The reverse case is not allowed. You cannot implicitly convert a pointer or a 
  10163. reference to a base class object to a pointer or reference to a derived class. 
  10164.  
  10165. If a member of a derived class and a member of a base class have the same name, 
  10166. the base class member is hidden in the derived class. If a member of a derived 
  10167. class has the same name as a base class, the base class name is hidden in the 
  10168. derived class. In both cases, the name of the derived class member is called 
  10169. the dominant name. 
  10170.  
  10171.  
  10172. ΓòÉΓòÉΓòÉ 13.2.1. Derivation Grammar ΓòÉΓòÉΓòÉ
  10173.  
  10174. The syntax for the list of base classes is: 
  10175.  
  10176.       base-spec:
  10177.             base-list
  10178.  
  10179.       base-list:
  10180.             base-specifier
  10181.             base-list, base-specifier
  10182.  
  10183.       base-specifier:
  10184.             complete-class-name
  10185.             virtual
  10186. [access-specifier]
  10187. complete-class-name
  10188.             access-specifier
  10189. [virtual]
  10190. complete-class-name
  10191.  
  10192. The complete-class-name must be a class that has been previously declared in a 
  10193. class declaration. 
  10194.  
  10195. An access-specifier  is one of public, private,and protected. 
  10196.  
  10197. virtual is a keyword that can be used to declare virtualbase classes. 
  10198.  
  10199. For a complete summary of class declaration grammar including member and base 
  10200. class grammar, see "Class Declaration Grammar Summary" in Appendix B 
  10201.  
  10202. The following example shows the declaration of the derived class D and the base 
  10203. classes V, B1, and B2. The class B1 is both a base class and a derived class 
  10204. because it is derived from class V and is a base class for D. 
  10205.  
  10206. class V { /* ... */ };
  10207. class B1 : virtual public V { /* ... */ };
  10208. class B2 { /* ... */ };
  10209. class D : public B1, private B2 { /* ... */ };
  10210.  
  10211.  
  10212. ΓòÉΓòÉΓòÉ 13.3. Inherited Member Access ΓòÉΓòÉΓòÉ
  10213.  
  10214. Access specifiers , control the level of access to noninherited class members. 
  10215. The access for an inherited member is controlled in three ways: 
  10216.  
  10217. o When you declare a member in a base class, you can specify a level of access 
  10218.   using the keywords public, private, and protected . 
  10219.  
  10220. o When you derive a class you can specify the access level for the base class 
  10221.   in the base list. 
  10222.  
  10223. o You can also restore the access level of inherited members. 
  10224.  
  10225. Resolution of member names does not depend on the level of access associated 
  10226. with each class member. Consider the following example: 
  10227.  
  10228. class A {
  10229.       private:
  10230.             int a;
  10231. };
  10232. class B {
  10233.       public:
  10234.             int a;
  10235. };
  10236. class C : public A, public B {
  10237.       void f() { a = 0; }            // ambiguous - is it
  10238. A::a or B::a?
  10239. };
  10240.  
  10241. In this example, class A has a private member a, and class B has a public 
  10242. member a. Class C is derived from both A and B.  C does not have access to A: 
  10243. but a in the body of f() can still resolve to either A: or B::a. Thus, a is 
  10244. ambiguous in the body of f(). 
  10245.  
  10246.  
  10247. ΓòÉΓòÉΓòÉ 13.3.1. Protected Members ΓòÉΓòÉΓòÉ
  10248.  
  10249. If a class is derived publicly from a base class, a protected static base class 
  10250. member can be accessed by members and friends of any classes derived from that 
  10251. base class. A protected nonstatic base class member can be accessed by members 
  10252. and friends of any classes derived from that base class by using one of the 
  10253. following: 
  10254.  
  10255. o A pointer to a directly or indirectly derived class 
  10256.  
  10257. o A reference to a directly or indirectly derived class 
  10258.  
  10259. o An object of a directly or indirectly derived class. 
  10260.  
  10261. If a class is derived privately from a base class, all protected base class 
  10262. members become private members of the derived class. 
  10263.  
  10264. The access specifier protected is also described in "Access Specifiers" 
  10265.  
  10266.  
  10267. ΓòÉΓòÉΓòÉ 13.3.2. Derivation Access of Base Classes ΓòÉΓòÉΓòÉ
  10268.  
  10269. When you declare a derived class, an access specifier can precede each base 
  10270. class in the base list of the derived class. This does not alter the access 
  10271. attributes of the individual members of a base class as seen by the base class, 
  10272. but allows the derived class to adjust the access attributes of the members of 
  10273. a base class. You can derive classes using any of the three access specifiers: 
  10274.  
  10275. o In a public base class, public and protected members of the base class remain 
  10276.   publicand protected members of the derived class. 
  10277.  
  10278. o In a private base class, public and protected members of the base class 
  10279.   become private members of the derived class. 
  10280.  
  10281. o In a protected base class, public and protected members of the base class are 
  10282.   protected members of the derived class. 
  10283.  
  10284. In all cases, private members of the base class remain private. Private members 
  10285. of the base class cannot be used by the derived class unless friend 
  10286. declarations within the base class explicitly grant access to them. 
  10287.  
  10288. In the following example, class d is derived publicly from class b. Class b is 
  10289. declared a public base class by this declaration. 
  10290.  
  10291. class b
  10292. {
  10293. //      .
  10294. //      .
  10295. //      .
  10296. };
  10297. class d : public b // public derivation
  10298. {
  10299. //      .
  10300. //      .
  10301. //      .
  10302. };
  10303.  
  10304. You can use both a structureand a class as base classes in the base list of a 
  10305. derived class declaration. If the base class is declared with the keyword 
  10306. class, its default access specifier in the base list of a derived class is 
  10307. private. If the base class is declared with the keyword struct, its default 
  10308. access specifier in the base list of a derived class is public. In the 
  10309. following example, private derivation is used by default because no access 
  10310. specifier is used in the base list. 
  10311.  
  10312. struct bb
  10313. {
  10314. //      .
  10315. //      .
  10316. //      .
  10317. };
  10318. class dd : bb // private derivation
  10319. {
  10320. //      .
  10321. //      .
  10322. //      .
  10323. };
  10324.  
  10325. Members and friends of a class can implicitly convert a pointer to an object of 
  10326. that class to a pointer to either: 
  10327.  
  10328. o A direct private base class 
  10329. o A protected base class (either direct or indirect). 
  10330.  
  10331.  
  10332. ΓòÉΓòÉΓòÉ 13.3.3. Access Declarations ΓòÉΓòÉΓòÉ
  10333.  
  10334. You can restore access to members of a base class using an access declaration. 
  10335. It allows you to change the access of a public member of a private or protected 
  10336. base class back to public. You can also change the access of a protected member 
  10337. of a private base class back to protected. Access is modified by using the base 
  10338. class member qualified name in the public or protected declarations of the 
  10339. derived class. 
  10340.  
  10341. You only use access declarations to restore base class access. You cannot 
  10342. change the access to a member to give it more access than it was originally 
  10343. declared with. You cannot change the access of a private member to public or to 
  10344. protected. You cannot adjust the access of a protected member to public. 
  10345.  
  10346. An access declaration cannot be used to restrict access to a member that is 
  10347. accessible in a base class. 
  10348.  
  10349. It is redundant to adjust the access to a public member of a public base class 
  10350. topublic, or to adjust the access to a protected member of a protected base 
  10351. class to protected. 
  10352.  
  10353. In the following example, the member b of the base class base is declared 
  10354. public in its base class declaration. Class derived is derived privately from 
  10355. class base. The access declaration in the public section of class derived 
  10356. restores the access level of the member b back to public. 
  10357.  
  10358. #include <iostream.h>
  10359. class base
  10360. {
  10361.       char a;
  10362. public:
  10363.       char c, b;
  10364.       void bprint();
  10365.       };
  10366.  
  10367. class derived: private base
  10368. {
  10369.       char d;
  10370. public:
  10371.       char e;
  10372.       base::b;            // restore access to b in derived
  10373.       void dprint();
  10374.       derived(char ch) { base::b = ch;}
  10375.       };
  10376.  
  10377. void print(derived& d)
  10378. {
  10379.       cout << " Here is d " << d.b <<
  10380. endl;
  10381.       }
  10382.  
  10383. void main()
  10384. {
  10385.       derived obj('c');
  10386.       print(obj);
  10387.       }
  10388.  
  10389. The external function print(derived&) can use the member b of base because the 
  10390. access of b has been restored to public. The external function print(derived&) 
  10391. can also use the members e and dprint() because they are declared with the 
  10392. keyword public in the derived class. The derived class member dprint() can use 
  10393. the members of its own class, d and e, in addition to the inherited members, b, 
  10394. c, and bprint(), that are declared with the keyword public in the base class. 
  10395. The base class member bprint() can use all the members of its own class, a, b, 
  10396. and c. 
  10397.  
  10398. Access declarations can only be used to adjust the access of a member of a base 
  10399. class. The base class that an access declaration appears in can be directly or 
  10400. indirectly inherited by the derived class. You can also use an access 
  10401. declaration in a nested class. For example: 
  10402.  
  10403. class B
  10404. {
  10405. public:
  10406.       class N       // nested class
  10407.       {
  10408.       public:
  10409.             int i; // public member
  10410.       };
  10411. };
  10412. class D: private B::N      // derive privately
  10413. {
  10414. public:
  10415.       B::N:
  10416. :i; // restores access to public
  10417. };
  10418.  
  10419. You cannot adjust the access to a base class member if a member with the same 
  10420. name exists in a class derived from that base class. 
  10421.  
  10422. You cannot convert a pointer to a derived class object to a pointer to a base 
  10423. class object if the base class is private or protected. For example: 
  10424.  
  10425. class B { /* ... */ };
  10426. class D : private B { /* ... */ };      // private base
  10427. class
  10428. void main ()
  10429. {
  10430.       D d;
  10431.       B* ptr;
  10432.       ptr = &d;      // error
  10433. }
  10434.  
  10435. If you use an access declaration to adjust the access to an overloaded 
  10436. function, the access is adjusted for all functions with that name in the base 
  10437. class. 
  10438.  
  10439.  
  10440. ΓòÉΓòÉΓòÉ 13.3.4. Access Resolution ΓòÉΓòÉΓòÉ
  10441.  
  10442. Access resolution is the process by which the accessibility of a particular 
  10443. class member is determined. Accessibility is dependent on the context. For 
  10444. example, a class member can be accessible in a member function but inaccessible 
  10445. at file scope. The following describes the access resolution procedure used by 
  10446. the &xcomp. &xcompos2.. 
  10447.  
  10448. In general, two "scopes" must be established before access resolution is 
  10449. applied. These scopes reduce an expression or declaration into a simplified 
  10450. construct to which the access rules (described in  "Member Access" ) are 
  10451. applied. These scopes are: 
  10452.  
  10453. o Call scope, the scope that encloses the expression or declaration that uses 
  10454.   the class member. 
  10455.  
  10456. o Reference scope,  the scope that identifies the class. 
  10457.  
  10458. For example, in the following code: 
  10459.  
  10460. class B { int member; };            // declaration
  10461. class A : B {}                  // declaration
  10462. void main()
  10463. {
  10464.       A aobject;                  // declaration
  10465.       aobject.member = 10;      // expression
  10466. }
  10467.  
  10468. the reference scope for member is the type of aobject, that is class type  A. 
  10469.  
  10470. Reference scope is chosen by simplifying the expression (or declaration) 
  10471. containing the member. An expression can be thought of as being reduced to a 
  10472. simple expression of the form obj.member where obj is the reference scope. 
  10473. Reference scope is selected as follows: 
  10474.  
  10475. o If the member is qualified with . or ->, the reference scope is the type of 
  10476.   the object that is immediately to the left of the . or -> operator closest to 
  10477.   the member. Unqualified members are treated as if they are qualified with 
  10478.   this->. 
  10479.  
  10480. o If the member is a type member or a static member and is qualified with ::, 
  10481.   the reference scope is the type immediately to the left of the :: operator 
  10482.   closest to the member. 
  10483.  
  10484. o Otherwise, the reference scope is the call scope. 
  10485.  
  10486. The call scope and the reference scope determine the accessibility of a class 
  10487. member. Once these scopes are resolved, the effective access  of the member is 
  10488. determined.  Effective access is the access of the member as it is seen from 
  10489. the reference scope. It is determined by taking the original access of the 
  10490. member in its scope as the effective access and changing it as the class 
  10491. hierarchy is traversed from the member's class to the reference scope. 
  10492. Effective access is altered as the class hierarchy is traversed for each 
  10493. derivation by the following: 
  10494.  
  10495. o The derivation access of a base class (see "Derivation Access of Base 
  10496.   Classes" ) 
  10497.  
  10498. o Access declarations that are applied to the members (see "Access 
  10499.   Declarations" ) 
  10500.  
  10501. o Friendships that are granted to the call scope (see "Member Access" ). 
  10502.  
  10503. After effective access is determined for a member, the access rules (described 
  10504. in "Member Access" ) are applied as if the effective access were the original 
  10505. access of the member. A member is only accessible is if the access rules say 
  10506. that it is. 
  10507.  
  10508. The following example demonstrates the access resolution procedure. 
  10509.  
  10510. class A
  10511. {
  10512. public:
  10513.       int a;
  10514. };
  10515. class B : private A
  10516. {
  10517.       friend void f (B*);
  10518. };
  10519. void f(B* b)
  10520. {
  10521.       b->a = 10; // is 'a' accessible to f(B*) ?
  10522. }
  10523. //      .
  10524. //      .
  10525. //      .
  10526.  
  10527. The following steps occur in order to determine the accessibility of A: in 
  10528. f(B*): 
  10529.  
  10530.  1. The call scope and reference scope of the expression b->a are determined. 
  10531.     :ol2. 
  10532.  
  10533.  2. The call scope is the function f(B*). 
  10534.  
  10535.  3. The reference scope is class B. 
  10536.  
  10537.  4. The effective access of member a is determined 
  10538.  
  10539.  5. Because the original access of the member a is public in class A, the 
  10540.     initial effective access of a is public. 
  10541.  
  10542.  6. Because B inherits from A privately, the effective access of a inside class 
  10543.     B is private. 
  10544.  
  10545.  7. Because class B is the reference scope, the effective access procedure 
  10546.     stops here. The effective access of a is private. 
  10547.  
  10548.  8. The access rules are applied. 
  10549.  
  10550.  9. The rules state that a private member may be accessed by a friend or a 
  10551.     member of the member's class. Because f(B*) is a friend of class B, f(B*) 
  10552.     can access the private member a. 
  10553.  
  10554.  
  10555. ΓòÉΓòÉΓòÉ 13.3.5. Access Summary ΓòÉΓòÉΓòÉ
  10556.  
  10557. The following example demonstrates inherited member access rules. 
  10558.  
  10559. class B
  10560. {
  10561.       int a;
  10562. public:
  10563.       int b,c;
  10564.       void f(int) {}
  10565. protected:
  10566.       int d;
  10567.       void g(int) {}
  10568. };
  10569. class D1 : public B
  10570. {
  10571.       int a;
  10572. public:
  10573.       int b;
  10574.       void h(int i )
  10575.       {
  10576.             g(i);                  // valid, protected B::g(int)
  10577.             B::b = 10;            // valid, B::b (not local
  10578. b)
  10579.             d = 5 ;            // valid, protected B::d
  10580.       }
  10581. };
  10582. class D2 : private B
  10583. {
  10584.       int e;
  10585. public:
  10586.       B::c;                         // modify access to B:
  10587.       void h(int i) { d = 5; }      // valid,protected
  10588. B::d
  10589. };
  10590. void main( )
  10591. {
  10592.  
  10593.       int i= 1;      // declare and initialize local variable
  10594.       D1 d1;            // create object of class d1
  10595.       D2 d2;            // create object of class d2
  10596.  
  10597.       d1.a = 5;      // error, D1::a is private in class
  10598. D1
  10599.       d2.b = 10;      // error, B::b is inherited private
  10600. to
  10601.                   // derived class D2
  10602.       d2.c = 5;      // valid, modified access from private
  10603. to public                  d2.B:=5;      // valid, public
  10604. B:
  10605.       d1.c = 5;      // valid, B:is inherited publicly
  10606.       d1.d = 5;      // error, B::d is protected in base
  10607. class
  10608.       d2.e = 10;      // error, private D2::e
  10609.       d1.g(i);      // error, g(int) is protected in base
  10610. class
  10611.       d1.h(i);      // valid
  10612.       d2.h(i);      // valid
  10613. }
  10614.  
  10615. Access rules for multiple base classes are described in "Multiple Access" 
  10616.  
  10617.  
  10618. ΓòÉΓòÉΓòÉ 13.4. Multiple Inheritance ΓòÉΓòÉΓòÉ
  10619.  
  10620. You can derive a class from more than one base class. Deriving a class from 
  10621. more than one direct base classes is called multiple inheritance . In the 
  10622. following example, classes A, B and C are direct base classes for the derived 
  10623. class X: 
  10624.  
  10625. Artwork from Interleaf needs to be redrawn or included
  10626. from anencapsulated poststript file.
  10627.  
  10628. class A { /* ... */ };
  10629. class B { /* ... */ };
  10630. class C { /* ... */ };
  10631. class X : public A, private B, public C { /* ... */ };
  10632.  
  10633. The order of derivation is relevant only to determine the order of default 
  10634. initialization by constructors and cleanup by destructors. For more details, 
  10635. see "Initialization by Constructor" 
  10636.  
  10637. A direct base class cannot appear in the base list of a derived class more than 
  10638. once: 
  10639.  
  10640. class B1 { /* ... */ };                   // direct base
  10641. class
  10642. class D : public B1, private B1 { /* ... */ }; // error
  10643.  
  10644. However, a derived class can inherit an indirect base class more than once, as 
  10645. shown in the  following example : 
  10646.  
  10647. Artwork from Interleaf needs to be redrawn or included
  10648. from anencapsulated poststript file.
  10649.  
  10650. class L { /* ... */ };                  // indirect base
  10651. class
  10652. class B2 : public L { /* ... */ };
  10653. class B3 : public L { /* ... */ };
  10654. class D : public B2, public B3 { /* ... */ }; // valid
  10655.  
  10656. In the above example, class D inherits the indirect base class L once through 
  10657. class B1 and once through class B2. However, this may lead to ambiguities 
  10658. because two objects of class L exist, and both are accessible through class D. 
  10659. You can avoid this ambiguity by referring to class L using a qualified class 
  10660. name. For example: 
  10661.  
  10662. B2:
  10663.  
  10664. or 
  10665.  
  10666. B3:
  10667.  
  10668. You can also avoid this ambiguity by using the base specifier virtual  to 
  10669. declare a base class. 
  10670.  
  10671.  
  10672. ΓòÉΓòÉΓòÉ 13.4.1. Virtual Base Classes ΓòÉΓòÉΓòÉ
  10673.  
  10674. If you have an inheritance graph in which two or more derived classes have a 
  10675. common base class, you can use a virtual base class to ensure that the two 
  10676. classes share a single instance of the base class rather than two separate 
  10677. copies. 
  10678.  
  10679. In the following example, an object of classD has two distinct objects of 
  10680. classL, one through class B1 and another through class B2. You can use the 
  10681. keyword virtual in front of the base class specifiers in the base lists 
  10682. ofclasses B1 and B2 to indicate that only one class L, shared by class B1 and 
  10683. classB2, exists. For example : 
  10684.  
  10685. Artwork from Interleaf needs to be redrawn or included
  10686. from anencapsulated poststript file.
  10687.  
  10688. class L { /* ... */ }; // indirect base class
  10689. class B1 : virtual public L { /* ... */ };
  10690. class B2 : virtual public L { /* ... */ };
  10691. class D : public B1, public B2 { /* ... */ }; // valid
  10692.  
  10693. By using the keyword virtual in this example, an object of class D inherits 
  10694. only one object of class L. 
  10695.  
  10696. As well, a derived class can have both virtual and nonvirtual base classes. For 
  10697. example : 
  10698.  
  10699. Artwork from Interleaf needs to be redrawn or included
  10700. from anencapsulated poststript file.
  10701.  
  10702. class V { /* ... */ };
  10703. class B1 : virtual public V { /* ... */ };
  10704. class B2 : virtual public V { /* ... */ };
  10705. class B3 : public V { /* ... */ };
  10706. class D : public B1, public B2, public B3 { /* ... */
  10707. };
  10708.  
  10709. In the above example, class D has two objects of class V, one that is shared by 
  10710. classes B1 and B2 and one through class B3. 
  10711.  
  10712.  
  10713. ΓòÉΓòÉΓòÉ 13.4.2. Multiple Access ΓòÉΓòÉΓòÉ
  10714.  
  10715. If you have an inheritance graph containing virtual base classes and a name can 
  10716. be reached through more than one path, the name is accessed through the path 
  10717. that gives the most access. For example: 
  10718.  
  10719. class L { public: void f(); };
  10720. class B1 : private virtual L { /* ... */ };
  10721. class B2 : public virtual L { /* ... */ };
  10722. class D : public B1, public B2
  10723. {
  10724. public:
  10725.       void f() {L::f();}       // L::f() is accessed
  10726. through
  10727. B2
  10728.                         // and is public
  10729. };
  10730.  
  10731. In the above example, the function f() is accessed through class B2. Because 
  10732. class B2 is inherited publicly and class B1 is inherited privately, class B2 
  10733. offers more access. 
  10734.  
  10735.  
  10736. ΓòÉΓòÉΓòÉ 13.4.3. Accessible Base Classes ΓòÉΓòÉΓòÉ
  10737.  
  10738. An accessible base class is a publicly derived base class that is neither 
  10739. hidden nor ambiguous in the inheritance hierarchy. 
  10740.  
  10741.  
  10742. ΓòÉΓòÉΓòÉ 13.4.4. Ambiguous Base Classes ΓòÉΓòÉΓòÉ
  10743.  
  10744. When you derive classes, ambiguities can result if base and derived classes 
  10745. have members with the same names. Access to a base class member is ambiguous if 
  10746. you use a name or qualified namethat does not refer to a unique function, 
  10747. object, type or enumerator. The declaration of a member with an ambiguous name 
  10748. in a derived class is not an error. The ambiguity is only flagged as an error 
  10749. if you use the ambiguous member name. 
  10750.  
  10751. For example, if two base classes have a member of the same name, an attempt to 
  10752. access the member by the derived class is ambiguous. You can resolve ambiguity 
  10753. by qualifying a member with its class name using the scope operator. 
  10754.  
  10755. class B1
  10756. {
  10757. public:
  10758.       int i;
  10759.       int j;
  10760.       int g( );
  10761. };
  10762. class B2
  10763. {
  10764. public:
  10765.       int j;
  10766.       int g( );
  10767. };
  10768. //      .
  10769. //      .
  10770. //      .
  10771. class D : public B1, public B2
  10772. {
  10773. public:
  10774.       int i;
  10775. };
  10776. void main ()
  10777. {
  10778.       D dobj;
  10779.       D *dptr = &dobj;
  10780.       dptr -> i = 5;       // valid, D:
  10781. :i
  10782.       dptr -> j = 10;       // error, ambiguous reference
  10783. to j
  10784.       dptr->B1::j = 10;      // valid, B1::j
  10785.       dobj.g( );             // error, ambiguous reference
  10786. to g( )
  10787.       dobj.B2::g( );       // valid, B2::g( )
  10788. }
  10789.  
  10790. The &xcomp. &xcompos2. checks for ambiguities at compile time. Because 
  10791. ambiguity checking occurs before access control or type checking, ambiguities 
  10792. may result even if only one of several members with the same name is accessible 
  10793. from the derived class. 
  10794.  
  10795. Conversions (either implicit or explicit) from a derived class pointer or 
  10796. reference to a base class pointer or reference, must refer unambiguously to the 
  10797. same accessible base class object. For example: 
  10798.  
  10799. class W { /* ... */ };
  10800. class X : public W { /* ... */ };
  10801. class Y : public W { /* ... */ };
  10802. class Z : public X, public Y { /* ... */ };
  10803. void main ()
  10804. {
  10805.       Z z;
  10806.       X* xptr = &z;       // valid
  10807.       Y* yptr = &z;       // valid
  10808.       W* wptr = &z;       // error, ambiguous reference to
  10809. class W
  10810.                         // X's W or Y's W ?
  10811. }
  10812.  
  10813. You can use virtual base classes to avoid ambiguous reference. For example: 
  10814.  
  10815. class W { /* ... */ };
  10816. class X : public virtual W { /* ... */ };
  10817. class Y : public virtual W { /* ... */ };
  10818. class Z : public X, public Y { /* ... */ };
  10819. void main ()
  10820. {
  10821.       Z z;
  10822.       X* xptr = &z;      // valid
  10823.       Y* yptr = &z;      // valid
  10824.       W* wptr = &z;       // valid, W is virtual therefore
  10825. only one
  10826.                         // W subobject exists
  10827. }
  10828.  
  10829. For more details, see "Virtual Base Classes" 
  10830.  
  10831.  
  10832. ΓòÉΓòÉΓòÉ 13.5. Virtual  Functions ΓòÉΓòÉΓòÉ
  10833.  
  10834. In C++, dynamic binding is supported by the mechanism of virtual functions. 
  10835. Virtual functions must be members of a class. Use virtual functions when you 
  10836. expect a class to be used as a base class in a derivation and when the 
  10837. implementation of the function may be overridden in the derived class. You can 
  10838. declare a member function with the keyword virtual in its class declaration. 
  10839. For example: 
  10840.  
  10841. class B
  10842. {
  10843.       int a,b,c;
  10844. public:
  10845.       virtual int f();
  10846. };
  10847. //      .
  10848. //      .
  10849. //      .
  10850.  
  10851. You can reimplement a virtual member function, like any member function, in any 
  10852. derived class. The implementation that is executed when you make a call to a 
  10853. virtual function depends on the type of the object for which it is called. If a 
  10854. virtual member function is called for a derived class object and the function 
  10855. is redefined in the derived class, the definition in the derived class is 
  10856. executed. In this case, the redefined derived class function is said to 
  10857. override the base class function. This occurs even if the access to the 
  10858. function is through a pointer or reference to the base class. If you call a 
  10859. virtual function with a pointer that has base class type but points to a 
  10860. derived class object, the member function of the derived class is called. 
  10861. However, if you call a nonvirtual function with a pointer that has base class 
  10862. type, the member function of the base class is called regardless of whether the 
  10863. pointer points to a derived class object. For example 
  10864.  
  10865. class B
  10866. {
  10867. public:
  10868.       virtual int f();
  10869.       virtual int g();
  10870.       int h();
  10871. };
  10872. class D : public B
  10873. {
  10874. public:
  10875.       int f();
  10876.       int g(char*);      // hides B::g()
  10877.       int h();
  10878. };
  10879. //      .
  10880. //      .
  10881. //      .
  10882. void main ()
  10883. {
  10884.       D d;
  10885.       B* bptr = &d;
  10886.  
  10887.       bptr->f();            // calls D::f() because f() is
  10888. virtual
  10889.       bptr->h();            // calls B::h() because h() is
  10890. nonvirtual
  10891.       bptr->g();            // calls B::g()
  10892.       d.g();             // error, wrong number and type of
  10893. arguments
  10894.       d.g("string");       // calls D::g(char*)
  10895. }
  10896.  
  10897. If the argument types or the number of arguments of the two functions are 
  10898. different, the functions are considered different, and the function in the 
  10899. derived class does not override the function in the base class. The function in 
  10900. the derived class hides the function in the base class. 
  10901.  
  10902. It is an error to make only the return types of two functions with the same 
  10903. name different. For more details, see "Return Values" 
  10904.  
  10905. A virtual function cannot be global orstatic because, by definition, a virtual 
  10906. function is a member function of a base class and relies on a specific object 
  10907. to determine which implementation of the function is called. 
  10908.  
  10909. You can declare a virtual function to be a friend of another class. 
  10910.  
  10911. If a function is declared virtual in its base class, it can still be accessed 
  10912. directly using the :: (scope) operator. In this case, the virtual function call 
  10913. mechanism is suppressed and the function implementation defined in the base 
  10914. class is used. In addition, if you do not redefine a virtual member function in 
  10915. a derived class, a call to that function uses the function implementation 
  10916. defined in the base class. 
  10917.  
  10918. A virtual function must be one of the following: 
  10919.  
  10920. o Defined 
  10921. o Declared pure 
  10922. o Defined and declared pure. 
  10923.  
  10924. A base class containing one or more pure virtual member functions is called an 
  10925. abstract class. 
  10926.  
  10927.  
  10928. ΓòÉΓòÉΓòÉ 13.5.1. Ambiguous Virtual Function Calls ΓòÉΓòÉΓòÉ
  10929.  
  10930. It is an error to override one virtual function with two or more ambiguous 
  10931. virtual functions. This can happen in a derived class that inherits from two 
  10932. nonvirtual bases that are derived from a virtual base class. For example: 
  10933.  
  10934. class V
  10935. {
  10936. public:
  10937.       virtual void f() { /* ... */ };
  10938. };
  10939. class A : virtual public V
  10940. {
  10941.       void f() { /* ... */ };
  10942. };
  10943. class B : virtual public V
  10944. {
  10945.       void f() { /* ... */ };
  10946. };
  10947. class D : public B { /* ... */ }; // error
  10948. void main ()
  10949. {
  10950.       D d;
  10951.       V* vptr = &d;
  10952.       vptr->f();            // which f(), A::f() or B::f()
  10953. ?
  10954. }
  10955.  
  10956. In class A, only A: will override V:. Similarly, in class B, only B: will 
  10957. override V:. However, in class D, both A: and B: will try to override V:. This 
  10958. is not allowed because it is not possible to decide which function to call if a 
  10959. D object is referenced with a pointer to class V, as shown in the above 
  10960. example. Because only one function can override a virtual function, the &xcomp. 
  10961. &xcompos2. flags this type of situation as an error. 
  10962.  
  10963. A special case occurs when the ambiguous overriding virtual functions come from 
  10964. separate instances of the same class type. In the following example, there are 
  10965. two objects (instances) of class L. Because of this, there are two data members 
  10966. L:, one in class A and one in class B. If the declaration of class D is 
  10967. allowed, incrementing L: in a call to L: with a pointer to class V is 
  10968. ambiguous. 
  10969.  
  10970. class V
  10971. {
  10972. public:
  10973.       virtual void f();
  10974. };
  10975. class L : virtual public V
  10976. {
  10977.       int count;
  10978.       void f();
  10979. };
  10980. void L::f() {++count;}
  10981. class A : public L
  10982. { /* ... */ };
  10983. class B : public L
  10984. { /* ... */ };
  10985. class D : public A, public B { /* ... */ }; // error
  10986. void main ()
  10987. {
  10988.       D d;
  10989.       V* vptr = &d;
  10990.       vptr->f();
  10991. }
  10992.  
  10993. In the above example, the function L: is expecting a pointer to an L object, 
  10994. that is the this pointer for class L, as its first implicit argument. Because 
  10995. there are two objects of class L in a D object, there are two this pointers 
  10996. that could be passed to L:. Because it is not possible for the &xcomp. 
  10997. &xcompos2. to decide which this pointer to pass to L:, the declaration of class 
  10998. D is flagged as an error. 
  10999.  
  11000.  
  11001. ΓòÉΓòÉΓòÉ 13.5.2. Virtual Function Access ΓòÉΓòÉΓòÉ
  11002.  
  11003. The access for a virtual function is specified when it is declared. The access 
  11004. rules for a virtual function are not affected by the access rules for the 
  11005. function that later overrides the virtual function. In general the access of 
  11006. the overriding member function is not known. 
  11007.  
  11008. If a virtual function is called with a pointer or reference to a class object, 
  11009. the type of the class object is not used to determine the access of the virtual 
  11010. function. Instead, the type of the pointer or reference to the class object is 
  11011. used. In the following example, when the function f() is called using a pointer 
  11012. having type B*, bptr is used to determine the access to the function f(). Even 
  11013. though the definition of f() defined in class D is executed, the access of the 
  11014. member function f() in class B is used. When the function f() is called using a 
  11015. pointer having type D*, dptr is used to determine the access to the function 
  11016. f(). This call produces an error because f() is declared private in class D. 
  11017.  
  11018. class B
  11019. {
  11020. public:
  11021.       virtual void f( );
  11022. };
  11023. class D : public B
  11024. {
  11025. private:
  11026.       void f( );
  11027. };
  11028. //      .
  11029. //      .
  11030. //      .
  11031. void main ()
  11032. {
  11033.       D dobj;
  11034.       B *bptr = &dobj;
  11035.       D *dptr = &dobj;
  11036.       bptr->f();       // valid, virtual B::f() is public,
  11037.                   // D::f() is called
  11038.       dptr->f();       // error, D::f() is private
  11039. }
  11040.  
  11041.  
  11042. ΓòÉΓòÉΓòÉ 13.6. Abstract Classes ΓòÉΓòÉΓòÉ
  11043.  
  11044. An abstract class is a class that is designed to be specifically used as a base 
  11045. class. A class is called an abstract class if it contains at least one pure 
  11046. virtual function. Pure virtual functions are inherited. You can declare a 
  11047. function to be pure by using a pure specifier in the declaration of the member 
  11048. function in the class declaration. For example: 
  11049.  
  11050. class AB             // abstract class
  11051. {
  11052. public:
  11053.       virtual void f()= 0; // pure virtual member function
  11054. };
  11055. class D: public AB
  11056. {
  11057. public:
  11058.       void f();
  11059. };
  11060. //      .
  11061. //      .
  11062. //      .
  11063. void main ()
  11064. {
  11065.       D d;
  11066.       d.f() ;       // calls D::f()
  11067.       AB ab;       // error, cannot create an object of an
  11068.                   // abstract class type
  11069. }
  11070.  
  11071. A function that is declared pure has no definition and cannot be executed. 
  11072. Because a pure virtual function has no implementation, any attempt to call that 
  11073. function is undefined. Such a call does not cause an error. No objects of an 
  11074. abstract class can be created, as shown in the above example. 
  11075.  
  11076. Note:  Because destructors are not inherited, a virtual destructor that is 
  11077. declared pure must have a definition. 
  11078.  
  11079. Virtual member functions are inherited. If a base class contains a pure 
  11080. virtualmember function and a class derived from that base class does not 
  11081. redefine that pure virtual member function, the derived class itself is an 
  11082. abstract class. Any attempt to create an object of the derived class type 
  11083. produces an error. For example: 
  11084.  
  11085. class AB // abstract class
  11086. {
  11087. public:
  11088.       virtual void f()= 0; // pure virtual member function
  11089. };
  11090. class D2: public AB
  11091. {
  11092.       int a,b,c;
  11093. public:
  11094.       void g();
  11095. };
  11096. //      .
  11097. //      .
  11098. //      .
  11099. void main ()
  11100. {
  11101.       D2 d;
  11102.       // error, cannot declare an object of abstract class
  11103. D2
  11104. }
  11105.  
  11106. To avoid the error in the above example, provide a declaration of D2:. 
  11107.  
  11108. You cannot use an abstract class as the type of an explicit conversion, as an 
  11109. argument type, or as the return type for a function. You can declare a pointer 
  11110. or reference to an abstract class. 
  11111.  
  11112.  
  11113. ΓòÉΓòÉΓòÉ 13.7. Related Information ΓòÉΓòÉΓòÉ
  11114.  
  11115. "Functions" on page -- Reference CPLRfunFun not found -- 
  11116.  
  11117. "C++ Classes" on page -- Reference bfx1270antl not found -- 
  11118.  
  11119. "Class Members and Friends" on page -- Reference q$y11a0antl not found --. 
  11120.  
  11121.  
  11122. ΓòÉΓòÉΓòÉ 14. Chapter 14. Templates ΓòÉΓòÉΓòÉ
  11123.  
  11124. This chapter gives describes the template facility in C++. You can use 
  11125. templates to define a family of types or functions. The following topics are 
  11126. described in this chapter: 
  11127.  
  11128. o Introduction to templates 
  11129. o Template grammar 
  11130. o Class templates 
  11131. o Function templates 
  11132. o Differences between class templates and function templates. 
  11133. o Member function templates 
  11134. o Friend functions within templates. 
  11135. o Static data members within templates. 
  11136. o define and implementation pragmas 
  11137.  
  11138. You can also return to the table of contents 
  11139.  
  11140.  
  11141. ΓòÉΓòÉΓòÉ 14.1. Introduction to Templates ΓòÉΓòÉΓòÉ
  11142.  
  11143. A template specifies how an individual class or function can be constructed, by 
  11144. providing a blueprint description of classes or functions within the template. 
  11145. A template definition differs from an ordinary class or function definition 
  11146. mainly in the use of the template keyword, and in the use of a type argument, 
  11147. instead of a type, in one or more of the constructs used to define the class or 
  11148. function template. Individual classes or functions can then be generated simply 
  11149. by specifying the template name and by naming the type for the particular class 
  11150. or function as the type argument of the template. 
  11151.  
  11152.  
  11153. ΓòÉΓòÉΓòÉ 14.2. Template Grammar ΓòÉΓòÉΓòÉ
  11154.  
  11155. The syntax for declaring class and function templates is: 
  11156.  
  11157.       template-declaration:
  11158.             template <
  11159. template-argument-list
  11160.  declaration
  11161.       template-argument-list:
  11162.             template-argument
  11163.             template-argument-list ,
  11164. template-argument
  11165.       template-argument:
  11166.             type-argument
  11167.             argument-declaration
  11168.       type-argument:
  11169.             class identifier
  11170.  
  11171. The declaration in a template-declaration must define or declare one of the 
  11172. following: 
  11173.  
  11174. o A class 
  11175. o A function. The function cannot have default arguments. 
  11176. o A static member of a template class. 
  11177.  
  11178. The identifier of a type-argument is defined to be a type-name in the scope of 
  11179. the template declaration. A template-declaration may appear as a global 
  11180. declaration only. 
  11181.  
  11182. The template-argument-list specifies the types and the constants within the 
  11183. template that must be specified when the template is instantiated. 
  11184.  
  11185. Note:  Default argument expressions are not allowed for an argument-declaration 
  11186. in a template-argument. 
  11187.  
  11188. The identifier is used as a type name within the template definition to 
  11189. identify the type of any variables or objects it refers to. Given the following 
  11190. simplified class template, where L is the identifier: 
  11191.  
  11192. template<class L> class Key
  11193. {
  11194.    L k;
  11195.     L* kptr;
  11196.     int length;
  11197. public:
  11198.     Key(L);
  11199.     // ...
  11200. };
  11201.  
  11202. The following table shows what the classes Key<int>, Key<char*>, and 
  11203. Key<mytype> look like: 
  11204.  
  11205. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  11206. Γöé class Key<int> i;   Γöé class Key<char*> c; Γöé class Key<mytype>  Γöé
  11207. Γöé                     Γöé                     Γöé m;                 Γöé
  11208. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  11209. Γöé class Key<int> {    Γöé class Key<char*> {  Γöé class Key<mytype>  Γöé
  11210. Γöé int k; int* kptr;   Γöé char* k; char**     Γöé { mytype k;        Γöé
  11211. Γöé int length; public: Γöé kptr; int length;   Γöé mytype* kptr; int  Γöé
  11212. Γöé Key(int); // ...    Γöé public: Key(char*); Γöé length; public:    Γöé
  11213. Γöé };                  Γöé // ...  };          Γöé Key(mytype); //    Γöé
  11214. Γöé                     Γöé                     Γöé ...  };            Γöé
  11215. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  11216.  
  11217. The above declarations create the following objects: 
  11218.  
  11219. o i of type Key<int> 
  11220. o c of type Key<char*> 
  11221. o m of type Key<mytype> 
  11222.  
  11223. It is important to note that the three classes above have different names. The 
  11224. types contained within the angle braces are not arguments to the class names 
  11225. but part of the class names themselves. Key<int> and Key<char*> are class 
  11226. names. Within the context of the above example, a class called Key (with no 
  11227. template argument list) is undefined. 
  11228.  
  11229.  
  11230. ΓòÉΓòÉΓòÉ 14.3. Class Templates ΓòÉΓòÉΓòÉ
  11231.  
  11232. The relationship between a class template and an individual class is like the 
  11233. relationship between a class and an individual object. An individual class 
  11234. defines how a group of objects can be constructed, while a class template 
  11235. defines how a group of classes can be generated. 
  11236.  
  11237. A template definition is identical to any valid class definition that the 
  11238. template might generate, except for the following: 
  11239.  
  11240. o The class template definition is preceded by template 
  11241.   <template-argument-list> where template-argument-list can include zero or 
  11242.   more type-arguments and zero or more argument-declarations. The 
  11243.   template-argument-list must contain at least one argument. 
  11244.  
  11245. o Types, variables, constants and objects within the class template may be 
  11246.   declared with type-arguments as well as with explicit types (for example, int 
  11247.   or char). 
  11248.  
  11249. o The template-argument-list may include argument-declarations (for example,int 
  11250.   a or char* b), which are generally used to define constant values within the 
  11251.   created class. 
  11252.  
  11253. A class template may declare a class without defining it by using an elaborated 
  11254. type specifier. For example: 
  11255.  
  11256. template  <class L,class T> class key;
  11257.  
  11258. This reserves the name as a class template name. All template declarations for 
  11259. a class template must have the same types and number of template arguments. 
  11260. Only one template declaration containing the class definition is allowed. 
  11261.  
  11262. It is important to note the distinction between the terms class template and 
  11263. template class: 
  11264.  
  11265. o A class template is a template used to generate template classes. A class 
  11266.   template can be only a declaration or it can be a definition of the class. 
  11267.  
  11268. o A template class is an instance of a class template. 
  11269.  
  11270. You can instantiate the class template by declaring a template class. If the 
  11271. definitions of the member functions of the template class are not inlined, then 
  11272. you have to define them. The syntax for instantiation of a template class is: 
  11273.  
  11274.       template-class-name:
  11275.             template-name <
  11276. template-arg-list
  11277.       template-arg-list:
  11278.             template-arg
  11279.             template-arg-list , template-arg
  11280.       template-arg:
  11281.             assignment-expression
  11282.             type-name
  11283.  
  11284. When you instantiate a template class, the template-arg-list must match the 
  11285. template-argument-list in the class template declaration. 
  11286.  
  11287. Note:  When you have nested template argument lists, you must have a separating 
  11288. space between the > at the end of the inner list and the  at the end of the 
  11289. outer list. Otherwise, there is an ambiguity between the output operator  and 
  11290. two template list delimiters . 
  11291.  
  11292. For example: 
  11293.  
  11294. template  <class L,class T> class key
  11295. {
  11296. //      .
  11297. //      .
  11298. //      .
  11299. };
  11300. template <class L> class vector
  11301. {
  11302. //      .
  11303. //      .
  11304. //      .
  11305. };
  11306. void main ()
  11307. {
  11308. class key <int, vector<int> >; // instantiate template
  11309. }
  11310.  
  11311. Objects and functions of individual template classes can be accessed by any of 
  11312. the techniques used to access ordinary class member objects and functions. 
  11313. Given a class template: 
  11314.  
  11315. template<class T> class vehicle
  11316. {
  11317. public:
  11318.     vehicle() { /* ... */ }    // constructor
  11319.     ~vehicle() {};             // destructor
  11320.     T kind[16];
  11321.     T* drive();
  11322.     static void roadmap();
  11323.     // ...
  11324. };
  11325.  
  11326. and the declaration: 
  11327.  
  11328. vehicle<char> bicycle; // instantiates the template
  11329.  
  11330. the constructor, the constructed object, and the member function drive() can be 
  11331. accessed with any of the following (assuming the standard header file 
  11332. <string.h> is included in the program file): 
  11333.  
  11334. ΓöîΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö¼ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÉ
  11335. Γöé constructor                    Γöé vehicle<char> bicycle; //     Γöé
  11336. Γöé                                Γöé constructor called automat-   Γöé
  11337. Γöé                                Γöé ically  // object bicycle     Γöé
  11338. Γöé                                Γöé created                       Γöé
  11339. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  11340. Γöé object bicycle                 Γöé strcpy (bicycle.kind, "10     Γöé
  11341. Γöé                                Γöé speed"); bicycle.kind[0] =    Γöé
  11342. Γöé                                Γöé '2';                          Γöé
  11343. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  11344. Γöé function drive()               Γöé char* n = bicycle.drive();    Γöé
  11345. Γö£ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö╝ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöñ
  11346. Γöé function roadmap()             Γöé vehicle<char>::roadmap();     Γöé
  11347. ΓööΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓö┤ΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÇΓöÿ
  11348.  
  11349.  
  11350. ΓòÉΓòÉΓòÉ 14.3.1. Declarations  and Definitions ΓòÉΓòÉΓòÉ
  11351.  
  11352. A class template must be declared before any declaration of a corresponding 
  11353. template class. A class template definition can only appear once in any single 
  11354. compilation unit. A class template must be defined before any use of a template 
  11355. class that requires the size of the class or refers to members of the class. 
  11356. In the following example, the class template key is declared before it is 
  11357. defined. The declaration of the pointer keyiptr is valid because the size of 
  11358. the class is not needed.  The declaration of keyi, however, causes an error. 
  11359.  
  11360. template  <class L> class key;      // class template
  11361. declared,
  11362.                                     // not defined yet
  11363.                                     //
  11364. class key<int> *keyiptr;            // declaration
  11365. of pointer
  11366.                                     //
  11367. class key<int> keyi                 // error, cannot
  11368. declare keyi
  11369.                                     // without knowing size
  11370.                                     //
  11371. template <class L> class key;       // now class
  11372. template defined
  11373. {
  11374. //      .
  11375. //      .
  11376. //      .
  11377. };
  11378.  
  11379. If a template class is defined before the corresponding class template is 
  11380. defined, the &xcomp. &xcompos2. will issue an error. A class name with the 
  11381. appearance of a template class name is considered to be a template class. In 
  11382. other words, angle brackets are valid in a class name only if that class is a 
  11383. template class. 
  11384.  
  11385. The definition of a class template is not compiled until the definition of a 
  11386. template class is required. At that point, the class template definition is 
  11387. compiled using the template-arg-list of the template class to instantiate the 
  11388. template arguments. Any errors in the class definition are flagged at this 
  11389. time. If the definition of a class template is never required, it is not 
  11390. compiled. In this case, there may be errors in the definition that are not 
  11391. flagged by the &xcomp. &xcompos2.. The -qinfo option can be used to find 
  11392. possible errors in class templates that are not compiled. 
  11393.  
  11394.  
  11395. ΓòÉΓòÉΓòÉ 14.3.2. Reference and Uniqueness ΓòÉΓòÉΓòÉ
  11396.  
  11397. A class template can only be defined once within a compilation unit, and the 
  11398. class template name cannot be declared to refer to any other template, class, 
  11399. object, function, value, or type in the same scope. 
  11400.  
  11401.  
  11402. ΓòÉΓòÉΓòÉ 14.3.3. Nontype Template Arguments ΓòÉΓòÉΓòÉ
  11403.  
  11404. A nontype template argument provided within a template argument list is an 
  11405. expression whose value can be determined at compile time. Such arguments must 
  11406. be constant expressions, addresses of functions or objects with external 
  11407. linkage, or addresses of class members. Nontype template arguments are normally 
  11408. used to initialize a class or to specify the sizes of class members. 
  11409.  
  11410. For nontype integral arguments, the instance argument will match the 
  11411. corresponding template argument as long as the instance argument has a value 
  11412. and sign appropriate to the argument type. If the argument expression contains 
  11413. the < operator or the  operator, it should be enclosed in parentheses to 
  11414. prevent the operator from being interpreted as a delimiter for template 
  11415. argument list. 
  11416.  
  11417. For nontype address arguments, the type of the instance argument must be of the 
  11418. form identifier or &identifier, and the type of the instance argument must 
  11419. match the template argument exactly, except that a function name is changed to 
  11420. a pointer to function type before matching. 
  11421.  
  11422. Theresulting valuesof nontype template arguments within a template argument 
  11423. list form part of the template class's type. If two template class names have 
  11424. the same template name and if their arguments have identical values, they are 
  11425. the same class. In the following example, a class template is defined that 
  11426. requires a nontype template int argument as well as the type argument: 
  11427.  
  11428. template<class T, int size> class myfilebuf
  11429. {
  11430.       T* filepos;
  11431.       static int array[size];
  11432. public:
  11433.       myfilebuf() { /* ... */}
  11434.       ~myfilebuf();
  11435.       advance(); // function defined elsewhere in program
  11436. };
  11437.  
  11438. In the example above, the template argument size becomes a part of the template 
  11439. class name. An object of such a template class is created with both the type 
  11440. arguments of the class and the values of any additional template arguments. 
  11441.  
  11442. An object x, and its corresponding template class with arguments double and 
  11443. size=200, can be created from this template with a value as its second template 
  11444. argument: 
  11445.  
  11446. myfilebuf<double,200> x;
  11447.  
  11448. x can also be created using an arithmetic expression: 
  11449.  
  11450. myfilebuf<double,10*20> x;
  11451.  
  11452. The objects created by these expressions are identical because the template 
  11453. arguments evaluate identically. The value 200 in the first expression above 
  11454. could have been represented by an expression whose result at compile time is 
  11455. known to be equal to 200, as shown in the second construction. Note that 
  11456. arguments that contain the < operator or the > operator must be enclosed in 
  11457. parentheses to prevent the operator from being parsed as the template argument 
  11458. list delimiter when it is being used as a relational operator. For example, the 
  11459. arguments in the following definition are valid: 
  11460.  
  11461. myfilebuf<double, (20>10)> x;       // valid
  11462.  
  11463. This definition,however, is not valid because the "greater than" operator is 
  11464. interpreted as the closing delimiter of the template argument list: 
  11465.  
  11466. myfilebuf<double, 20>10> x;         // error
  11467.  
  11468. If the template arguments do not evaluate identically, the objects created are 
  11469. of different types: 
  11470.  
  11471. myfilebuf<double,200> x;            // create object
  11472. x of class
  11473.                                     // myfilebuf<double,200>
  11474. myfilebuf<double,200.0> y;          // error, 200.0 is a
  11475. double,
  11476.                                     // not an int
  11477.  
  11478. The instantiation of y fails because the value 200.0 is of type double and the 
  11479. template argument is of type int. 
  11480.  
  11481. The following two objects: 
  11482.  
  11483.       myfilebuf<double, 128> x
  11484.       myfilebuf<double, 512> y
  11485.  
  11486. belong to separate template classes, and referencing either of these objects 
  11487. later with myfilebuf<double> is an error. 
  11488.  
  11489. A class template does not need to have a type argument if it has nontype 
  11490. arguments. For example, the following template is a valid class template: 
  11491.  
  11492. template<int i> class C
  11493. {
  11494.       public:
  11495.             int k;
  11496.             C() { k = i;}
  11497. };
  11498.  
  11499. This class template can be instantiated by declarations such as: 
  11500.  
  11501. class C<100>;
  11502. class C<200>;
  11503.  
  11504. Again, these two declarations refer to distinct classes because the values of 
  11505. their nontype arguments differ. 
  11506.  
  11507.  
  11508. ΓòÉΓòÉΓòÉ 14.3.4. Explicitly Defined Template Classes ΓòÉΓòÉΓòÉ
  11509.  
  11510. You can override the definition of a class template of a particular template 
  11511. class by providing a class definition for the type of class required. For 
  11512. example, the following class template will create a class for each type for 
  11513. which it is referenced, but that class may be inappropriate for a particular 
  11514. type: 
  11515.  
  11516. template<class M> class portfolio
  11517. {
  11518.       double capital;
  11519.       M arr;
  11520.       // ...
  11521. } ;
  11522.  
  11523. The type for which the template class is inappropriate can be defined by using 
  11524. the applicable template class name. Assuming the inappropriately defined type 
  11525. was stocks, you could redefine the class portfolio<stocks> as follows: 
  11526.  
  11527. class portfolio<stocks>
  11528. {
  11529.       double capital;
  11530.       stocks yield;
  11531.       // ...
  11532. };
  11533.  
  11534. This explicit definition must be seen before the template class is referenced. 
  11535.  
  11536.  
  11537. ΓòÉΓòÉΓòÉ 14.4. Function Templates ΓòÉΓòÉΓòÉ
  11538.  
  11539. A function template allows you to define a group of functions that are the same 
  11540. except for the types of one or more of their arguments or objects. All type 
  11541. arguments in a function template must be used in the argument list or in the 
  11542. class qualifier for the function name. The type of a template function argument 
  11543. need not be explicitly specified when the template function is called. In this 
  11544. respect, a template function differs from a template class. 
  11545.  
  11546.  
  11547. ΓòÉΓòÉΓòÉ 14.4.1. Example of a Function Template ΓòÉΓòÉΓòÉ
  11548.  
  11549. If you want to create a function approximate() which determines whether two 
  11550. values are within 5% of each other, you can define the following template: 
  11551.  
  11552.       #include<math.h>
  11553.       template <class T> int approximate (T first, T
  11554. second)
  11555.       {
  11556.             double aptemp=double(first)/double(second);
  11557.             return int(abs(aptemp-1.0) <= .05);
  11558.       };
  11559.  
  11560. Assuming you have two values of type float you want to compare, you can use the 
  11561. approximate function template: 
  11562.  
  11563.       float a=3.24, b=3.35;
  11564.       if (approximate(a,b))
  11565.             cout << "a and b are pretty close" <<
  11566. endl;
  11567.  
  11568. A template function int approximate(float,float) is generated to resolve the 
  11569. call. 
  11570.  
  11571. Note:  It is important to note the distinction between the terms function 
  11572. template and template function: 
  11573.  
  11574. o Function template is a template used to generate template functions. A 
  11575.   function template can be only a declaration or it can define the function. 
  11576.  
  11577. o Template function is a function generated by a function template. 
  11578.  
  11579.  
  11580. ΓòÉΓòÉΓòÉ 14.4.2. Overloading Resolution for Template Functions ΓòÉΓòÉΓòÉ
  11581.  
  11582. When a function is invoked with overloaded arguments, overloading resolution is 
  11583. done in the following order: 
  11584.  
  11585.  1. Look for a function with an exact type match. This does not include 
  11586.     template functions, unless such functions were explicitly declared using a 
  11587.     function declaration. Trivial conversions are performed if they produce an 
  11588.     exact type match. 
  11589.  
  11590.  2. Look for a function template that allows generation of a function with an 
  11591.     exact type match. Trivial conversions are performed if they produce an 
  11592.     exact type match. 
  11593.  
  11594.  3. Try ordinary overloading resolution for functions already present. This 
  11595.     does not include template functions, unless such functions were explicitly 
  11596.     declared using a function declaration. 
  11597.  
  11598. A call to a template function causes an error and no overloading is done if the 
  11599. following conditions are true: 
  11600.  
  11601. o The only available functions for a call are template functions 
  11602.  
  11603. o These functions would require nontrivial conversions for the call to succeed 
  11604.  
  11605. o These functions have not been explicitly declared. 
  11606.  
  11607. In the case of the approximate() function template above, if the two input 
  11608. values are of different types, overloading resolution will not take place: 
  11609.  
  11610.       float a=3.24;
  11611.       double b=3.35;
  11612.       if (approximate(a,b))  // error, different types
  11613.       { /* ... */ }
  11614.  
  11615. The solution is to force a conversion to one of the available function types by 
  11616. explicitly declaring the function for the chosen type. To resolve the 
  11617. float/double example above, include the following function declaration: 
  11618.  
  11619.       int approximate(double a, double b);
  11620.       // force conversion of the float to double
  11621.  
  11622. This declaration creates a function approximate() which expects two arguments 
  11623. of type double, so that when approximate(a,b) is called, the overloading is 
  11624. resolved by converting variable a to type double. 
  11625.  
  11626. For further details on argument matching and conversions, see "Trivial 
  11627. Conversions" , "Type Conversions" , and "Integral Promotions" 
  11628.  
  11629.  
  11630. ΓòÉΓòÉΓòÉ 14.4.3. Defining Template Functions ΓòÉΓòÉΓòÉ
  11631.  
  11632. Because template functions may be generated in all compilation units that 
  11633. contain function template definitions, you may want to group function template 
  11634. definitions into one or two compilation units. 
  11635.  
  11636.  
  11637. ΓòÉΓòÉΓòÉ 14.4.4. Explicitly Defined Template Functions ΓòÉΓòÉΓòÉ
  11638.  
  11639. In some situations a function template may define a group of functions in 
  11640. which, for one function type, the function definition would be inappropriate. 
  11641. For instance, the function template: 
  11642.  
  11643.       template<class T> int approximate(T first, T second);
  11644.  
  11645. defined "Example of a Function Template" ) , determines whether two values are 
  11646. within 5% of each other. The algorithm used for this function template is 
  11647. appropriate for numerical values, but for char* values, it would indicate 
  11648. whether the pointers to two character strings are within 5% of one another, not 
  11649. whether the strings themselves are approximately equal. Whether two pointers 
  11650. are within 5% of each other is not useful information. You can define an 
  11651. explicit template function for char* values to compare the two strings 
  11652. themselves, character by character. The following explicitly defined template 
  11653. function compares two strings and returns a value indicating whether or not 
  11654. more than 5% of the characters differ between the two strings: 
  11655.  
  11656. #include<string.h>
  11657. int approximate(char *first, char *second)
  11658. {
  11659.       if (strcmp(first,second) == 0)
  11660.             return 1; // strings are identical
  11661.       double difct=0;
  11662.       int maxlen=0;
  11663.       if (strlen(first)>strlen(second))
  11664.             maxlen=strlen(first);
  11665.       else maxlen=strlen(second);
  11666.       for (int i=0; i<=maxlen ; ++i)
  11667.             if ( first[i] != second[i] )
  11668. difct++;
  11669.       return int((difct / maxlen) <= .05  );
  11670. }
  11671.  
  11672. Given this definition, the function call: 
  11673.  
  11674. approximate("String A","String B");
  11675.  
  11676. invokes the explicitly defined function above, and no template function will be 
  11677. generated. 
  11678.  
  11679. Explicit definition has the same effect on template overloading resolution as 
  11680. explicit declaration (see "Overloading Resolution for Template Functions" ). If 
  11681. a template function is explicitly defined for: 
  11682.  
  11683. int approximate(double a, double b) { /* ... */ }
  11684.  
  11685. then a call of: 
  11686.  
  11687. double a=3.54;
  11688. float b=3.5;
  11689. approximate(a,b);
  11690.  
  11691. resolves in a call to approximate(double a, double b), and variable b is 
  11692. converted to type double. 
  11693.  
  11694.  
  11695. ΓòÉΓòÉΓòÉ 14.4.5. Declarations and Definitions ΓòÉΓòÉΓòÉ
  11696.  
  11697. When a template function is defined explicitly within a compilation unit, this 
  11698. definition is used in preference to any instantiation from the function 
  11699. template. For example, if one compilation unit contains the code: 
  11700.  
  11701. #include<iostream.h>
  11702. template <class T> T f(T i) {return i+1;}
  11703. void main()
  11704. {
  11705.       cout << f(2) << endl;
  11706. }
  11707.  
  11708. and another contains: 
  11709.  
  11710. int f(int i) {return i+2;}
  11711.  
  11712. when compiled and run, the program prints the number 4 to standard output, 
  11713. indicating that the explicitly defined function was used to resolve the call to 
  11714. f(). 
  11715.  
  11716. Each template, whether of a class or of a function, must be defined at most 
  11717. once within a compilation unit. The same applies to an explicitly defined 
  11718. template class or function. Function templates and class templates may be 
  11719. declared many times. 
  11720.  
  11721. A template class is considered declared if its name is used. A template 
  11722. function is considered declared if any of the following applies: 
  11723.  
  11724. o A function whose name matches a function template's name is declared, and an 
  11725.   appropriate template function can be generated. 
  11726.  
  11727. o A function whose name matches a function template's name is called, and an 
  11728.   appropriate template function can be generated. 
  11729.  
  11730. o A function whose name matches a function template's name is called, and the 
  11731.   template function has been explicitly defined. 
  11732.  
  11733. o The address of a template function is taken in such a way that instantiation 
  11734.   can occur. This means the pointer to function must supply a return type and 
  11735.   argument types that can be used to instantiate the template function. 
  11736.  
  11737. A template function is instantiated or generated if the function is referenced 
  11738. in any of the following ways, provided that function is not explicitly defined 
  11739. elsewhere in the program: 
  11740.  
  11741. o The function is declared 
  11742. o A call to the function is made 
  11743. o The  address of the function is taken. 
  11744.  
  11745. When a template function is instantiated, the body of the function template is 
  11746. compiled using the template-arg-list of the template class to instantiate the 
  11747. template arguments. Any errors in the function definition are flagged at this 
  11748. time. If a template function is never generated from a function template, it is 
  11749. not compiled. In this case, there may be errors in the function definition that 
  11750. are not flagged by the &xcomp. &xcompos2.. 
  11751.  
  11752.  
  11753. ΓòÉΓòÉΓòÉ 14.5. Differences Between Class and Function Templates ΓòÉΓòÉΓòÉ
  11754.  
  11755. The name of a template class is a compound name consisting of the template name 
  11756. and  the full template argument list enclosed in angle braces. Any references 
  11757. to a template class must use this complete name. For example: 
  11758.  
  11759. template <class T, int range> class ex
  11760. {
  11761.       T a;
  11762.        int r;
  11763.       // ...
  11764. };
  11765. //...
  11766. ex<double,20> obj1;     // valid
  11767. ex<double> obj2;        // error
  11768. ex obj3;                // error
  11769.  
  11770. C++ requires this explicit naming convention to ensure that the appropriate 
  11771. class can be generated. 
  11772.  
  11773. A template function, on the other hand, has the name of its function template 
  11774. and the particular function chosen to resolve a given template function call is 
  11775. determined by the type of the calling arguments. In the following example, the 
  11776. call min(a,b) is effectively a call to min(int a, int b), and the call min(af, 
  11777. bf) is effectively a call to min(float a, float b): 
  11778.  
  11779. template<class T> T min(T a, T b)
  11780. {
  11781.       if (a < b)
  11782.             return a;
  11783.       else
  11784.             return b;
  11785. }
  11786. void main()
  11787. {
  11788.       int a = 0;
  11789.       int b = 2;
  11790.       float af = 3.1;
  11791.       float bf = 2.9;
  11792.       cout << "Here is the smaller int " <<
  11793. min(a,b) << endl;
  11794.       cout << "Here is the smaller float " <<
  11795. min(af, bf) << endl;
  11796. }
  11797.  
  11798.  
  11799. ΓòÉΓòÉΓòÉ 14.6. Member Function Templates ΓòÉΓòÉΓòÉ
  11800.  
  11801. In "Function Templates" a function template was defined outside of any template 
  11802. class. However, functions in C++ are often member functions of a class. If you 
  11803. want to create a class template and a set of function templates to go with that 
  11804. class template, you do not have to create the function templates explicitly, as 
  11805. long as the function definitions are contained within the class template. Any 
  11806. member function (inlined or noninlined) declared within a class template is 
  11807. implicitly a function template. When a template class is declared, it 
  11808. implicitly generates template functions for each function defined in the class 
  11809. template. 
  11810.  
  11811. There are three ways to define template member functions: 
  11812.  
  11813. o Explicitly at file scope for each type used to instantiate the template 
  11814.   class. For example: 
  11815.  
  11816.           template <class T> class key
  11817.           {
  11818.           public:
  11819.                 void f(T);
  11820.           };
  11821.           void key<char>::f(char) { /* ... */ }
  11822.           void key<int>::f(int ) { /* ... */ }
  11823.  
  11824.           void main()
  11825.           {
  11826.                 int i = 9;
  11827.                 key< int> keyobj;
  11828.                 keyobj.f(i);
  11829.           }
  11830.  
  11831. o At file scope with the template-arguments.  For example: 
  11832.  
  11833.           template <class T> class key
  11834.           {
  11835.           public:
  11836.                 void f(T);
  11837.           };
  11838.           template <class T> void key <T>::f(T) { /* ... */
  11839.     }
  11840.  
  11841.           void main()
  11842.           {
  11843.                 int i = 9;
  11844.                 key< int> keyobj;
  11845.                 keyobj.f(i);
  11846.           }
  11847.  
  11848. o Inlined in the class template itself. For example: 
  11849.  
  11850.       template <class T> class key
  11851.       {
  11852.       public:
  11853.             void f(T) { /* ... */ }
  11854.       };
  11855.  
  11856.       void main()
  11857.       {
  11858.             int i = 9;
  11859.             key< int> keyobj;
  11860.             keyobj.f(i);
  11861.       }
  11862.  
  11863. Member function templates are used to instantiate any functions that are not 
  11864. explicitly generated. If you have both a member function template and an 
  11865. explicit definition, the explicit definition is used. 
  11866.  
  11867. The template argument is not used in a constructor name. For example, 
  11868.  
  11869. template<class L> class Key
  11870. {
  11871.       Key();            // default constructor
  11872.       Key( L );         // constructor taking L by value
  11873.       Key<L>( L );      // error, <L> implicit within
  11874. class template
  11875. };
  11876.  
  11877. The declaration Key<L>(L) is an error because the constructor does not use the 
  11878. template argument. Assuming the above class template was corrected by removing 
  11879. the offending line, you can define a function template for the class template's 
  11880. constructor: 
  11881.  
  11882. // Constructor contained in function template:
  11883. template<class L>
  11884.       Key<L>::Key(int) { /* ... */ }
  11885.       // valid, constructor template argument assumed
  11886. template<class L>
  11887.       Key<L>::Key<L>(int) { /* ... */ }
  11888.       /* error, constructor template argument <L> implicit
  11889. in
  11890.       class template argument */
  11891.  
  11892. A template function name does not include the template argument. The template 
  11893. argument does, however, appear in the template class name if a member function 
  11894. of a template class is defined or declared outside of the class template. The 
  11895. definition: 
  11896.  
  11897. Key<L>::Key(int) { /* ... */ }
  11898.  
  11899. is valid because Key<L> (with template argument) refers to the class, while 
  11900. Key(int) { /* ... */ } refers to the member function. 
  11901.  
  11902.  
  11903. ΓòÉΓòÉΓòÉ 14.7. Friends ΓòÉΓòÉΓòÉ
  11904.  
  11905. A friend function can be declared in a class template either as a single 
  11906. function shared by all classes created by the template or as a template 
  11907. function that varies from class to class within the class template. For 
  11908. example: 
  11909.  
  11910. template<class T> class portfolio
  11911. {
  11912.       //...
  11913.       friend void taxes();
  11914.        friend void transact(T);
  11915.        friend portfolio<T>* invest(portfolio<T>*);
  11916.        friend portfolio* divest(portfolio*);        //error
  11917.        // ...
  11918. };
  11919.  
  11920. In this example, each declaration has the following characteristics: 
  11921.  
  11922. o taxes( ) is single function that can access private and protected members of 
  11923.   any template class generated by the class template. Note that taxes() is not 
  11924.   a template function. 
  11925.  
  11926. o transact(T) is a function template which declares a distinct function for 
  11927.   each class generated by the class template. The only private and protected 
  11928.   members that can be accessed by functions generated from this template are 
  11929.   the private and protected members of their template class. 
  11930.  
  11931. o invest(portfolio<T>*) is a function template whose return and argument types 
  11932.   are pointers to objects of type portfolio<T>. Each class generated by the 
  11933.   class template will have a friend function of this name, and each such 
  11934.   function will have a pointer to an object of its own class as both its return 
  11935.   type and its argument type. 
  11936.  
  11937. o divest(portfolio*) is an error because portfolio* attempts to point to a 
  11938.   class template. A pointer to a class template is undefined and produces an 
  11939.   error. This statement can be corrected by using the syntax of the invest() 
  11940.   function template instead. 
  11941.  
  11942. Because all friend functions in this example are declared but not defined, you 
  11943. could create a set of function templates to define those functions that are 
  11944. implicitly template functions (that is, all the valid functions except 
  11945. taxes()). The function templates would then be used to instantiate the template 
  11946. functions as required. 
  11947.  
  11948.  
  11949. ΓòÉΓòÉΓòÉ 14.8. Static Data Members ΓòÉΓòÉΓòÉ
  11950.  
  11951. A static declaration within a class template declares a static data member for 
  11952. each template class generated from the template. The static declaration may be 
  11953. of type template-argument or of any defined type. 
  11954.  
  11955. Like member function templates, you can explicitly define a static data member 
  11956. of a template class at file scope for each type used to instantiate a template 
  11957. class, for example: 
  11958.  
  11959. template <class T> class key
  11960. {
  11961. public:
  11962.       static T x;
  11963. };
  11964. int key<int>::x;
  11965. char key<char>::x;
  11966. void main()
  11967. {
  11968.       key<int>::x = 0;
  11969. }
  11970.  
  11971. You can also define a static data member of a template class using a template 
  11972. definition at file scope, for example: 
  11973.  
  11974. template <class T> class key
  11975. {
  11976. public:
  11977.       static T x;
  11978. };
  11979. template <class T> T key<T> ::x; // template definition
  11980. void main()
  11981. {
  11982.       key<int>::x = 0;
  11983. }
  11984.  
  11985. When you instantiate a template class, you must have either an explicit 
  11986. definition or a template definition for each static data member. If you have 
  11987. both, the explicit definition is used. 
  11988.  
  11989. In the following example: 
  11990.  
  11991. template<class L> class Key
  11992. {
  11993.       static L k;
  11994.       static L* kptr;
  11995.       static int length;
  11996.       // ...
  11997. }
  11998.  
  11999. the definitions of static variables and objects must be instantiated at file 
  12000. scope. If the classes Key<int> and Key<double> are instantiated from the above 
  12001. template, and no template definitions exist, the following static data members 
  12002. must be explicitly defined at file scope, or an error occurs: 
  12003.  
  12004. int Key<int>::k, Key<int>::length, Key<double>::length;
  12005. int* Key<int>::kptr;
  12006. double Key<double>::k;
  12007. double* Key<double>::kptr = 0;
  12008.  
  12009.  
  12010. ΓòÉΓòÉΓòÉ 14.9. define and implementation Pragmas ΓòÉΓòÉΓòÉ
  12011.  
  12012. The define pragma can be used to force the definition of a template class 
  12013. without actually defining an object of the class. The syntax is: 
  12014.  
  12015.       pragma-define:
  12016.             #pragma define (template-class-name)
  12017.  
  12018. The implementation pragma is used to tell the compiler the name of the file 
  12019. that contains the function template definitions corresponding to the template 
  12020. declarations in the include file containing the pragma. The syntax is: 
  12021.  
  12022.       pragma-implementation:
  12023.             #pragma implementation
  12024. (string-literal)
  12025.  
  12026. The pragmas can appear anywhere that a declaration is allowed. 
  12027.  
  12028. The define and implementation pragmas are used when organizing  your program 
  12029. for the efficient or automatic generation of template functions. 
  12030.  
  12031.  
  12032. ΓòÉΓòÉΓòÉ 14.10. Related Information ΓòÉΓòÉΓòÉ
  12033.  
  12034. "Functions" 
  12035.  
  12036. "C++ Classes" 
  12037.  
  12038.  
  12039. ΓòÉΓòÉΓòÉ 15. Chapter 15. Exception Handling ΓòÉΓòÉΓòÉ
  12040.  
  12041. This chapter describes the C++ implementation of exception handling and 
  12042. discusses the following topics: 
  12043.  
  12044. o Introduction to C[++] exception handling 
  12045. o Formal and Informal Exception Handling 
  12046. o Exception handling grammar 
  12047. o Transferring control 
  12048. o Constructors and destructors 
  12049. o Exception specifications 
  12050. o Special functions. 
  12051.  
  12052. You can also return to the table of contents 
  12053.  
  12054.  
  12055. ΓòÉΓòÉΓòÉ 15.1. Introduction to C++ Exception Handling ΓòÉΓòÉΓòÉ
  12056.  
  12057. Exception handling provides a way for a function that encounters an unusual 
  12058. situation to throw an exception and pass control to a direct or indirect caller 
  12059. of that function. The caller may or may not be able to handle the exception. 
  12060. Code that intercepts an exception is called a handler. Regardless of whether or 
  12061. not the caller can handle an exception, it may rethrow the exception so it can 
  12062. be intercepted by another handler. 
  12063.  
  12064. C++ provides three language constructs to implement exception handling: 
  12065.  
  12066. o Try blocks 
  12067. o Catch blocks 
  12068. o Throw expressions. 
  12069.  
  12070. Within a function, any unusual situation can be flagged with a throw 
  12071. expression. You can throw an object in order to pass information back to the 
  12072. caller. Any object can be thrown, including the object that caused the 
  12073. exception or an object constructed when the exception occurred. 
  12074.  
  12075. A call to a function that may throw an exception should be enclosed within a 
  12076. try statement. If the called function throws an exception and an exception 
  12077. handler is defined to catch the type of the object thrown, the exception 
  12078. handler is executed. In C++, a catch block implements an exception handler. 
  12079.  
  12080. A catch block follows immediately after a try statement or immediately after 
  12081. another catch block. A catch block includes a parenthesized exception 
  12082. declaration containing optional qualifiers, a type, and an optional variable 
  12083. name. The declaration specifies the type of object that the exception handler 
  12084. may catch. Once an exception is caught, the body of the catch block is 
  12085. executed. If a function throws an exception that cannot be caught, the program 
  12086. is terminated. 
  12087.  
  12088. Exception handling is not strictly synonymous with error handling, because the 
  12089. implementation allows the passing of an exception whether or not an error 
  12090. actually occurred. You can use exception handlers for things other than 
  12091. handling errors. 
  12092.  
  12093.  
  12094. ΓòÉΓòÉΓòÉ 15.2. Formal and Informal Exception Handling ΓòÉΓòÉΓòÉ
  12095.  
  12096. While the exception handling features of C++ offer a formal mechanism for 
  12097. handling exceptions (language implemented), in many situations informal 
  12098. exception handling (logic implemented) is more appropriate. Generally speaking, 
  12099. formal exception handling should be implemented in libraries, classes, and 
  12100. functions likely to be accessed by several programs or programmers and in 
  12101. classes and functions that are repeatedly accessed within a program but are not 
  12102. well-suited to handling their exceptions themselves. Since formal exception 
  12103. handling is designed for exceptional circumstances, exception handling is not 
  12104. guaranteed to be efficient. When you do not invoke exception handling, overhead 
  12105. is minimal. 
  12106.  
  12107. Informal exception handling, in which the user defines the appropriate action 
  12108. if an error or exception occurs, is often more suitable for handling errors. 
  12109. For example, a simple error, such as a user entering an incorrect input, can 
  12110. more easily and clearly be handled by testing the input for validity and by 
  12111. requesting the input again if the original input is incorrect. 
  12112.  
  12113.  
  12114. ΓòÉΓòÉΓòÉ 15.3. Exception Handling Grammar ΓòÉΓòÉΓòÉ
  12115.  
  12116. The three keywords designed for exception handling in C++ are try, throw, and 
  12117. catch. The syntax is: 
  12118.  
  12119.       try block:
  12120.             try compound-statement
  12121. handler-list
  12122.       handler-list:
  12123.             handler [handler-list]
  12124.       handler:
  12125.             catch (
  12126. exception-declaration )
  12127. compound-statement
  12128.       exception-declaration:
  12129.             type-specifier-list declarator
  12130.             type-specifier-list abstract-declarator
  12131.             type-specifier-list
  12132.             ...
  12133.       throw-expression:
  12134.             throw
  12135. [assignment-expression]
  12136.  
  12137. The steps required to implement an exception handler are: 
  12138.  
  12139.  1. Functions that are expected to be used by many programs are coded so that, 
  12140.     when an error is detected, an exception is thrown. The throw expression 
  12141.     generally throws an object. It may be created explicitly for purposes of 
  12142.     exception handling, or it may be the object that caused the error to be 
  12143.     detected. 
  12144.  
  12145.  2. Exceptions are anticipated in a caller by use of a try statement. Function 
  12146.     calls that you anticipate might produce an exception can be enclosed in 
  12147.     braces and preceded by the keyword try. 
  12148.  
  12149.  3. Immediately following the try block, you can code one or more catch blocks. 
  12150.     Each catch block identifies what type or class of objects it is capable of 
  12151.     catching. If the object thrown matches the type of a catch expression, 
  12152.     control passes to that catch block. If the object thrown does not match the 
  12153.     first catch block, subsequent catch blocks are searched for a matching 
  12154.     type. If no match is found, the search continues in all enclosing try 
  12155.     blocks and then in the caller of the current function. If no match is found 
  12156.     after all try blocks are searched, a call to terminate() is made, and the 
  12157.     program is terminated normally. (For details on the default handlers of 
  12158.     uncaught exceptions, see "terminate()" 
  12159.  
  12160.  1. Any object can be thrown if it can be copied and destroyed in the function 
  12161.     from which the throw occurs. 
  12162.  
  12163.  2. Exceptions should never be thrown from a signal handler. The result is 
  12164.     undefined, and can cause program termination. 
  12165.  
  12166. A catch argument is illegal if it is a value argument and it is not possible to 
  12167. generate a copy of it.  For example: 
  12168.  
  12169. class B {
  12170. public:
  12171.       B();
  12172.       B(B&);
  12173. };
  12174.              // the following catch block will cause an error
  12175.             //
  12176. catch(const B x)
  12177. {
  12178. //      .
  12179. //      .
  12180. //      .
  12181. }
  12182.  
  12183. The catch block causes an error because the &xcomp. &xcompos2. does not know 
  12184. the type of the object thrown at compile time.  It assumes that the type of the 
  12185. thrown object is the same as the type of the catch argument.  In the above 
  12186. example, the thrown object is assumed to be of type const B.  The compiler uses 
  12187. a copy constructor on the thrown argument to create the catch argument.  Since 
  12188. there is no copy constructor for class B that accepts const B as an input 
  12189. argument, the compiler is not able to perform the construction and an error 
  12190. occurs. Similarly, a throw expression causes an error if it is not possible to 
  12191. generate a copy of the value of the expression being thrown. 
  12192.  
  12193.  
  12194. ΓòÉΓòÉΓòÉ 15.4. Transferring Control ΓòÉΓòÉΓòÉ
  12195.  
  12196. C++ implements the termination model of exception handling. In the termination 
  12197. model, when an exception is thrown, control never returns to the throw point. 
  12198. The throw point is the point in program execution where the exception occurred. 
  12199.  
  12200. C++ exception handling does not implement the resumption model of exception 
  12201. handling which allows an exception handler to correct the exception and then 
  12202. return to the throw point. 
  12203.  
  12204. When an exception is thrown, control is passed out of the throw expression, and 
  12205. out of the try block that anticipated the exception. Control is passed to the 
  12206. catch block whose exception type matches the object thrown. The catch block 
  12207. handles the exception as appropriate. If the catch block ends normally, the 
  12208. flow of control passes over all subsequent catch blocks. 
  12209.  
  12210.  When an exception is not thrown from within a try block, the flow of control 
  12211. continues normally through the block, and passes over all catch blocks 
  12212. following the try block. 
  12213.  
  12214. An exception handler cannot return control to the source of the error by using 
  12215. the return statement. A return issued in this context returns from the function 
  12216. containing the catch block. 
  12217.  
  12218. If an exception is thrown and no try block is active, or if a try block is 
  12219. active and no catch block exception declaration matches the object thrown, a 
  12220. call to terminate() is issued. 
  12221.  
  12222. A call to terminate() in turn calls abort() to terminate the program. abort() 
  12223. is defined in the standard header file <stdlib.h terminate(), see "Special 
  12224. Functions" 
  12225.  
  12226. The following example illustrates the basic use of try, catch, and throw. The 
  12227. program prompts for a numerical user input and determines the input's 
  12228. reciprocal. Before it attempts to print the reciprocal to standard output, it 
  12229. checks that the input value is nonzero, to avoid a division by zero. If the 
  12230. input is zero, an exception is thrown, and the catch block catches the 
  12231. exception. If the input is nonzero, the reciprocal is printed to standard 
  12232. output. 
  12233.  
  12234. #include <iostream.h>
  12235. #include <stdlib.h>
  12236. class IsZero { /* ... */ };
  12237. void ZeroCheck( int i )
  12238. {
  12239.          if (i==0)
  12240.                 throw IsZero();
  12241. }
  12242. void main()
  12243. {
  12244.          double a;
  12245.           cout << "Enter a number: ";
  12246.           cin >> a;
  12247.           try
  12248.       {
  12249.                  ZeroCheck( a );
  12250.               cout << "Reciprocal is " <<
  12251. 1.0/a << endl;
  12252.           }
  12253.          catch ( IsZero )
  12254.           {
  12255.              cout << "Zero input is not valid"
  12256. << endl;
  12257.               exit(1);
  12258.           }
  12259.          exit(0);
  12260. }
  12261.  
  12262. This example could have been coded more efficiently by using informal exception 
  12263. handling. However, it provides a simple illustration of formal exception 
  12264. handling. 
  12265.  
  12266.  
  12267. ΓòÉΓòÉΓòÉ 15.4.1. Catching Exceptions ΓòÉΓòÉΓòÉ
  12268.  
  12269. You can declare a handler to catch many types of exceptions. The allowable 
  12270. objects that a function can catch are declared in an exception-declaration. You 
  12271. can catch objects of the fundamental types, base and derived class objects, 
  12272. references and pointers to all of these types. You can also catch const and 
  12273. volatile types. 
  12274.  
  12275. You can also use the catch(...) form of the handler to catch all thrown 
  12276. exceptions that have not been caught by a previous catch block. The ellipsis in 
  12277. the exception-declaration indicates that any exception thrown can be handled by 
  12278. this handler. 
  12279.  
  12280. If an exception is caught by a catch(...) block, there is no direct way to 
  12281. access the object thrown. Information about an exception caught by catch(...) 
  12282. is very limited. 
  12283.  
  12284. You can declare an optional variable name if you want to access the thrown 
  12285. object in the catch block. 
  12286.  
  12287. A catch block can only catch accessible objects. The object caught must have an 
  12288. accessible copy constructor. For more details on access, see "Member Access" 
  12289. For further details on copy constructors, see "Copy by Initialization" 
  12290.  
  12291.  
  12292. ΓòÉΓòÉΓòÉ 15.4.2. Order of Catching ΓòÉΓòÉΓòÉ
  12293.  
  12294. Always place a catch block that catches a derived class before a catch block 
  12295. that catches the base class of that derived class (following a try block). If a 
  12296. catch block for objects of a base class is followed by a catch block for 
  12297. objects of a derived class of that base class, the latter block is flagged as 
  12298. an error. 
  12299.  
  12300. A catch block of the form catch(...) must be the last catch block following a 
  12301. try block. This ensures that the catch(...) block does not prevent more 
  12302. specific catch blocks from catching exceptions intended for them. If a 
  12303. catch(...) block is provided after a try block, it must be the last catch block 
  12304. or an error occurs. 
  12305.  
  12306.  
  12307. ΓòÉΓòÉΓòÉ 15.4.3. Matching Between Exceptions Thrown and Caught ΓòÉΓòÉΓòÉ
  12308.  
  12309. An argument in the exception-declaration of a handler (catch argument) will 
  12310. match an argument in the expression of the throw expression (throw argument) if 
  12311. any of the following conditions is met: 
  12312.  
  12313. o The catch argument type matches the type of the thrown object. 
  12314.  
  12315. o The catch argument is a public base class of the thrown class object. 
  12316.  
  12317. o The catch specifies a pointer type, and the thrown object is a pointer type 
  12318.   that can be converted to the pointer type of the catch argument by standard 
  12319.   pointer conversion. 
  12320.  
  12321. Note:  If the type of the thrown object is const or volatile the catch argument 
  12322. must also be a const or volatile for a match to occur. However, a const, 
  12323. volatile, or reference type catch argument can match a nonconstant, 
  12324. nonvolatile, or nonreference object type. A non-reference catch argument type 
  12325. will match a reference to an object of the same type. 
  12326.  
  12327.  
  12328. ΓòÉΓòÉΓòÉ 15.4.4. Nested try Blocks ΓòÉΓòÉΓòÉ
  12329.  
  12330. When try blocks are nested and a throw occurs in a function called by an inner 
  12331. try block, control is transferred outwards through the nested try blocks until 
  12332. the first catch block is found whose argument matches the argument of the throw 
  12333. expression. For example: 
  12334.  
  12335. try
  12336. {
  12337.       func1();
  12338.          try
  12339.       {
  12340.               func2();
  12341.           }
  12342.          catch (spec_err) { /* ... */ }
  12343.          func3();
  12344.  }
  12345. catch (type_err) { /* ... */ }
  12346. // if no throw is issued, control resumes here.
  12347.  
  12348. In the above example, if spec_err is thrown within the inner try block (in this 
  12349. case, from func2() ), the exception is caught by the inner catch block, and, 
  12350. assuming this catch block does not transfer control, func3() is called. If 
  12351. spec_err is thrown after the inner try block (for instance, by func3() ), it is 
  12352. not caught and the function terminate() is called. If the entire try block in 
  12353. the example is in a function that has a throw list and does not include 
  12354. spec_err on its throw list, unexpected() is called. If the exception thrown 
  12355. from func2() in the inner try block is type_err, the program will skip out of 
  12356. both try blocks to the second catch block without invoking func3(), because no 
  12357. appropriate catch block exists following the inner try block. 
  12358.  
  12359. It is also possible to nest a try block within a catch block. 
  12360.  
  12361.  
  12362. ΓòÉΓòÉΓòÉ 15.4.5. Rethrowing an Exception ΓòÉΓòÉΓòÉ
  12363.  
  12364. If a catch block cannot handle the particular exception it has caught, you can 
  12365. rethrow the exception. The rethrow expression (throw; with no argument) causes 
  12366. the originally thrown object to be rethrown. 
  12367.  
  12368. Because the exception has already been caught at the scope in which the rethrow 
  12369. expression occurs, it is rethrown out to the next dynamically enclosing try 
  12370. block. Therefore, it cannot be handled by catch blocks at the scope in which 
  12371. the rethrow expression occurred. Any catch blocks following the dynamically 
  12372. enclosing try block have an opportunity to catch the exception. 
  12373.  
  12374. In the following example, catch(FileIO) catches any object of type FileIO and 
  12375. any objects that are public base classes of the FileIO class. It then checks 
  12376. for those exceptions it can handle. For any exception it cannot handle, it 
  12377. issues a rethrow expression to rethrow the exception and allow another handler 
  12378. in a dynamically enclosing try block to handle the exception. 
  12379.  
  12380. #include <iostream.h>
  12381. class FileIO
  12382. {
  12383. public:
  12384.       int notfound;
  12385.       int endfile;
  12386.       FileIO(); // initialize data members
  12387.       // the following member functions throw an exception
  12388.       // if an input error occurs
  12389.       void advance(int x);
  12390.       void clear();
  12391.       void put(int x, int y);
  12392. };
  12393. //      .
  12394. //      .
  12395. //      .
  12396. void f()
  12397. {
  12398.       FileIO fio;
  12399.       try
  12400.       {
  12401.             // call member functions of FileIO class
  12402.             fio.advance (1);
  12403.             fio.clear();
  12404.             fio.put(1,-1);
  12405.       }
  12406.  
  12407.       catch(FileIO fexc)
  12408.       {
  12409.             if (fexc.notfound)
  12410.                   cout << "File not Found" <<
  12411. endl;
  12412.             else if (fexc.endfile)
  12413.                   cout << "End of File" <<
  12414. endl;
  12415.             else
  12416.                   throw;            // rethrow to outer handler
  12417.       }
  12418.       catch(...) { /* ... */ }      // catch other
  12419. exceptions
  12420. }
  12421. main()
  12422. {
  12423.       try
  12424.       {
  12425.             f();
  12426.       }
  12427.       catch(FileIO) { cout << "Outer Handler" <<
  12428. endl;}
  12429. }
  12430.  
  12431. The rethrow expression can be caught by any catch(...) whose argument matches 
  12432. the argument of the exception originally thrown. Note that, in this example, 
  12433. the catch(...) will not catch the rethrow expression because, when the rethrow 
  12434. expression is issued, control passes out of the scope of the function f() into 
  12435. the next dynamically enclosing block. 
  12436.  
  12437.  
  12438. ΓòÉΓòÉΓòÉ 15.4.6. Using a Conditional Expression in a Throw Expression ΓòÉΓòÉΓòÉ
  12439.  
  12440. You can use a conditional expression as a throw expression. Consider the 
  12441. following example: 
  12442.  
  12443. #include <iostream.h>
  12444. void main() {
  12445.       int doit = 1;
  12446.       int dont = 0;
  12447.       float f = 8.9;
  12448.       int i = 7;
  12449.       int j = 6;
  12450.       try { throw doit ? i : f; }
  12451.       catch (int x)
  12452.       {
  12453.             cout << "Caught int " << x <<
  12454. endl;
  12455.       }
  12456.       catch (float x)
  12457.       {
  12458.             cout << "Caught float " << x
  12459. << endl;
  12460.       }
  12461.       catch (double x)
  12462.       {
  12463.             cout << "Caught double " << x
  12464. << endl;
  12465.       }
  12466.       catch (...)
  12467.       {
  12468.             cout << "Caught something " <<
  12469. endl;
  12470.       }
  12471. }
  12472.  
  12473. This example produces the following output: 
  12474.  
  12475. Caught float 7
  12476.  
  12477. At first glance, it looks as if the block that catches integer values should do 
  12478. the catch, but i is converted to a float value in the try block because it is 
  12479. in a conditional expression with the float value f. If the try block in the 
  12480. example is replaced with the following try block: 
  12481.  
  12482.       try { throw doit ? i : j; }
  12483.  
  12484. The following output is produced: 
  12485.  
  12486. Caught int 7
  12487.  
  12488.  
  12489. ΓòÉΓòÉΓòÉ 15.5. Constructors and Destructors ΓòÉΓòÉΓòÉ
  12490.  
  12491. When an exception is thrown and control passes to a catch block following a try 
  12492. block, destructors are called for all objects constructed since the beginning 
  12493. of the try block directly associated with that catch block. If an exception is 
  12494. thrown during construction of an object consisting of subobjects or array 
  12495. elements, destructors will only be called for those subobjects or array 
  12496. elements successfully constructed before the exception was thrown. 
  12497.  
  12498. For more information on constructors and destructors, see "Constructors and 
  12499. Destructors" 
  12500.  
  12501. If a destructor detects an exception and issues a throw, the exception can be 
  12502. caught if the caller of the destructor was contained within a try block and an 
  12503. appropriate catch is coded. 
  12504.  
  12505. If an exception is thrown by a function called from an inner try block, but 
  12506. caught by an outer try block (because the inner try block did not have an 
  12507. appropriate handler), all objects constructed within both the outer and all 
  12508. inner try blocks are destroyed. If the thrown object has a destructor, the 
  12509. destructor is not called until the exception is caught and handled. 
  12510.  
  12511. Because a throw expression throws an object and a catch statement can catch an 
  12512. object, the object thrown enables error-related information to be transferred 
  12513. from the point at which an exception is detected to the exception's handler. If 
  12514. you throw an object with a constructor, you can construct an object that 
  12515. contains information relevant to the catch expression. In the following 
  12516. example, an object of class DivideByZero is thrown by the function divide(). 
  12517. The constructor copies the string "Division by zero" into the char array 
  12518. errname. Since DivideByZero is a derived class of class Matherr, the catch 
  12519. block for Matherr catches the thrown exception. The catch block can then access 
  12520. information provided by the thrown object, in this case the text of an error 
  12521. message. 
  12522.  
  12523. #include<string.h>            // needed for strcpy
  12524. #include<iostream.h>
  12525. class Matherr { public: char errname[30]; };
  12526. class DivideByZero : public Matherr
  12527. {
  12528. public:
  12529.       DivideByZero() {strcpy (errname, "Division by
  12530. zero");}
  12531. };
  12532. double divide(double a, double b)
  12533. {
  12534.       if (b == 0) throw DivideByZero();
  12535.       return a/b;
  12536. }
  12537.  
  12538. void main()
  12539. {
  12540.       double a=7,b=0;
  12541.       try {divide (a,b);}
  12542.       catch (Matherr xx)
  12543.       {
  12544.             cout << xx.errname << endl;
  12545.       }
  12546. }
  12547.  
  12548. Exception handling can be used in conjunction with constructors and destructors 
  12549. to provide resource management that ensures that all locked resources are 
  12550. unlocked when an exception is thrown. Consider the following example: 
  12551.  
  12552. class data
  12553. {
  12554.       public:
  12555.             void lock();            // prevent other users
  12556. from
  12557.                               // changing the object
  12558.             void unlock();       // allow other users to change
  12559.                               // the object
  12560. };
  12561. void q(data&), bar(data&);
  12562. //      .
  12563. //      .
  12564. //      .
  12565. main()
  12566. {
  12567.       data important;
  12568.       important.lock();
  12569.       q(important);
  12570.       bar(important);
  12571.       important.unlock();
  12572. }
  12573.  
  12574. If q() or bar() throw an exception, important.unlock() will not be called and 
  12575. the data will stay locked. This problem can be corrected by using a helper 
  12576. class to write an "exception aware" program for resource management. 
  12577.  
  12578. class data
  12579. {
  12580.       public:
  12581.             void lock();       // prevent other users from
  12582.                               // changing the object
  12583.             void unlock();       // allow other users to change
  12584.                               // the object
  12585. };
  12586. class locked_data                  // helper class
  12587. {
  12588.       data& real_data;
  12589.       public:
  12590.             locked_data(data& d) : real_data(d)
  12591.                               {real_data.lock();}
  12592.             ~locked_data()       {real_data.unlock();}
  12593. };
  12594. void q(data&), bar(data&);
  12595. //      .
  12596. //      .
  12597. //      .
  12598. main()
  12599. {
  12600.       data important;
  12601.       locked_data my_lock(important);
  12602.       q(important);
  12603.       bar(important);
  12604. }
  12605.  
  12606. In this case if q() or bar() throws an exception, the destructor for my_lock 
  12607. will be called, and the data will be unlocked. 
  12608.  
  12609.  
  12610. ΓòÉΓòÉΓòÉ 15.6. Exception Specifications ΓòÉΓòÉΓòÉ
  12611.  
  12612. C++ provides a mechanism to ensure that a given function is limited to throwing 
  12613. only a specified list of exceptions. An exception specification at the 
  12614. beginning of any function acts as a guarantee to the function's caller that the 
  12615. function will not throw any exception not contained in the exception 
  12616. specification. For example, a function: 
  12617.  
  12618. void translate() throw(unknown_word,bad_grammar) { /* ...
  12619. */ }
  12620.  
  12621. explicitly states that it will not throw any exception other than unknown_word 
  12622. or bad_grammar. translate() must handle any exceptions thrown by functions it 
  12623. might call, unless those exceptions are specified in the exception 
  12624. specification of translate(). If an exception is thrown by a function called by 
  12625. translate() and the exception is not handled by translate() or contained in the 
  12626. exception specification of translate(), unexpected() is called. 
  12627.  
  12628.  
  12629. ΓòÉΓòÉΓòÉ 15.6.1. Exception Specification Grammar ΓòÉΓòÉΓòÉ
  12630.  
  12631. The syntax of theexception specification is: 
  12632.  
  12633.       exception-specification:
  12634.             throw (
  12635. [type-list]
  12636. )
  12637.       type-list:
  12638.             type-name
  12639.             type-list , type-name
  12640.  
  12641. For further details on type-name, see  "Type Names" 
  12642.  
  12643. If an exception is thrown from a function that has not specified the thrown 
  12644. exception in its exception specification, a call of the function unexpected(), 
  12645. which is discussed in the following section  "Special Functions", will result. 
  12646.  
  12647.  
  12648. ΓòÉΓòÉΓòÉ 15.6.2. Empty Exception Specifications ΓòÉΓòÉΓòÉ
  12649.  
  12650. A function with an empty throw() specification guarantees that the function 
  12651. will not throw any exceptions. 
  12652.  
  12653.  
  12654. ΓòÉΓòÉΓòÉ 15.6.3. Functions Without an Exception Specification ΓòÉΓòÉΓòÉ
  12655.  
  12656. A function without an exception specification allows any object to be thrown 
  12657. from the function. 
  12658.  
  12659.  
  12660. ΓòÉΓòÉΓòÉ 15.6.4. Other Exception Specifications ΓòÉΓòÉΓòÉ
  12661.  
  12662. The compiler does not prevent an exception specification from defining a more 
  12663. limited set of valid exceptions than the set of exceptions the function may 
  12664. actually throw. Such an error will be detected only at run time, and only if 
  12665. the unspecified exception is thrown. 
  12666.  
  12667. In the following example, NameTooShort is thrown from within a function that 
  12668. explicitly states that it will only throw NameTooLong. This is a valid 
  12669. function, although at run time, if NameTooShort is thrown, a call to 
  12670. unexpected() will be made. 
  12671.  
  12672. #include <string.h>            // needed for strlen
  12673. class NameTooLong {};
  12674. class NameTooShort {};
  12675. void check(char* fname) throw (NameTooLong)
  12676.   {
  12677.        if ( strlen(fname)<4 ) throw NameTooShort();
  12678.   }
  12679.  
  12680. If a function with an exception specification calls a subfunction with a less 
  12681. restrictive exception specification (an exception specification that contains 
  12682. more objects than the calling function's exception specification), any thrown 
  12683. objects from within the subfunction that are not handled by the subfunction and 
  12684. that are not part of the outer function's specification list must be handled 
  12685. within the outer function. If the outer function fails to handle an exception 
  12686. not in its exception specification, a call to unexpected() is made. 
  12687.  
  12688.  
  12689. ΓòÉΓòÉΓòÉ 15.7. Special Functions ΓòÉΓòÉΓòÉ
  12690.  
  12691. Not all thrown errors can be caught and successfully dealt with by a catch 
  12692. block. There are situations where the most sensible way to handle an exception 
  12693. is to terminate the program. Two special library functions are implemented in 
  12694. C++ to process exceptions not properly handled by catch blocks, or exceptions 
  12695. thrown outside of a valid try block. These functions are unexpected() and 
  12696. terminate(). 
  12697.  
  12698.  
  12699. ΓòÉΓòÉΓòÉ 15.7.1. unexpected() ΓòÉΓòÉΓòÉ
  12700.  
  12701. When a function with an exception specification throws an exception that is not 
  12702. listed in its exception specification, the function unexpected() is called. The 
  12703. function unexpected() calls a function specified by the set_unexpected() 
  12704. function. By default, unexpected() calls the function terminate(). In turn, 
  12705. terminate() calls abort() by default, terminating the program. For more 
  12706. details, see "set_unexpected() and set_terminate()". 
  12707.  
  12708.  
  12709. ΓòÉΓòÉΓòÉ 15.7.2. terminate() ΓòÉΓòÉΓòÉ
  12710.  
  12711. In some cases, the exception handling mechanism will fail and a call to 
  12712. terminate() will be made. This terminate() call occurs in any of the following 
  12713. situations: 
  12714.  
  12715. o When terminate() is explicitly called 
  12716.  
  12717. o When no catch can be matched to a thrown object 
  12718.  
  12719. o When the stack becomes corrupted during the exception-handling process 
  12720.  
  12721. o When a system defined unexpected() is called. 
  12722.  
  12723. terminate() calls abort(), which exits from the program. You can replace this 
  12724. call to terminate() with another function by using the set_terminate() 
  12725. function. 
  12726.  
  12727.  
  12728. ΓòÉΓòÉΓòÉ 15.7.3. set_unexpected() and set_terminate() ΓòÉΓòÉΓòÉ
  12729.  
  12730. The function unexpected(), when invoked, calls the function most recently 
  12731. supplied as an argument to set_unexpected(). If set_unexpected() has not yet 
  12732. been called, unexpected() calls terminate(). 
  12733.  
  12734. The function terminate(), when invoked, calls the function most recently 
  12735. supplied as an argument to set_terminate(). If set_terminate() has not yet been 
  12736. called, terminate() calls abort(), which ends the program. 
  12737.  
  12738. You can use set_unexpected() and set_terminate() to replace terminate() and 
  12739. abort(), respectively, with your own functions. set_unexpected() and 
  12740. set_terminate() are included in the standard header files <terminate.h> and 
  12741. <unexpected.h>. Each of these functions has as its return type and its argument 
  12742. type a pointer to function with a void return type and no arguments. The 
  12743. pointer to function you supply as the argument becomes the function called by 
  12744. the corresponding special function: the argument to set_unexpected() becomes 
  12745. the function called by unexpected(), and the argument to set_terminate() 
  12746. becomes the function called by terminate(). Both set_unexpected() and 
  12747. set_terminate() return a pointer to the function that was previously called by 
  12748. their respective special functions (unexpected() and terminate()). By saving 
  12749. the return values, you can restore the original special functions later so that 
  12750. unexpected() and terminate() will once again call terminate() and abort(). 
  12751.  
  12752. If you use set_terminate() to define your own function to replace abort(), the 
  12753. final action of that program should be to exit from the program. If you attempt 
  12754. to return from the function called by terminate(), abort() is called instead 
  12755. and the program ends. 
  12756.  
  12757. The following example, shows the flow of control and special functions used in 
  12758. exception handling: 
  12759.  
  12760. #include <terminate.h>
  12761. #include <unexpected.h>
  12762. #include <iostream.h>
  12763. class X { /* ... */ };
  12764. class Y { /* ... */ };
  12765. class A { /* ... */ };
  12766. // pfv type is pointer to function returning void
  12767. typedef void (*pfv)();
  12768. void my_terminate()
  12769. {      cout << "Call to my terminate" <<
  12770. endl; }
  12771. void my_unexpected()
  12772. {      cout << "Call to my unexpected" <<
  12773. endl; }
  12774. void f() throw(X,Y)      // f() is permitted to throw objects
  12775. of class
  12776.                   // types X and Y only
  12777. {      A aobj;
  12778.       throw(aobj); // error, f() throws a class A object
  12779. }
  12780. main()
  12781. {
  12782.       pfv old_term = set_terminate(my_terminate);
  12783.       pfv old_unex = set_unexpected(my_unexpected);
  12784.       try{ f(); }
  12785.       catch(X)       { /* ... */ }
  12786.       catch(Y)       { /* ... */ }
  12787.       catch (...)       { /* ... */ }
  12788.  
  12789.       set_unexpected(old_unex);
  12790.       try { f();}
  12791.       catch(X)       { /* ... */ }
  12792.       catch(Y)       { /* ... */ }
  12793.       catch (...)       { /* ... */ }
  12794. }
  12795.  
  12796. At run time, this program behaves as follows: 
  12797.  
  12798.  1. The call to set_terminate() assigns to old_term the address of the function 
  12799.     last passed to set_terminate() when set_terminate() was previously called. 
  12800.  
  12801.  2. The call to set_unexpected() assigns to old_unex the address of the 
  12802.     function last passed to set_unexpected() when set_unexpected() was 
  12803.     previously called. 
  12804.  
  12805.  3. Within a try block, function f() is called. Because f() throws an 
  12806.     unexpected exception, a call to unexpected() is made. unexpected() in turn 
  12807.     calls my_unexpected(), which prints a message to standard output and 
  12808.     returns. 
  12809.  
  12810.  4. The second call to set_unexpected() replaces the user-defined function 
  12811.     my_unexpected() with the saved pointer to the original function 
  12812.     (terminate()) called by unexpected(). 
  12813.  
  12814.  5. Within a second try block, function f() is called once more. Because f() 
  12815.     throws an unexpected exception, a call to unexpected() is again made. 
  12816.     unexpected() automatically calls terminate(), which calls the function 
  12817.     myterminate(). 
  12818.  
  12819.  6. myterminate() displays a message, it returns, and the system calls abort() 
  12820.     which terminates the program. 
  12821.  
  12822. At run time, the following information is displayed, and the program ends: 
  12823.  
  12824. Call to my_unexpected
  12825. Call to my_terminate
  12826.  
  12827. Note:  The catch blocks following the try block are not entered, because the 
  12828. exception was handled by my_unexpected() as an unexpected throw, not as a valid 
  12829. exception. 
  12830.  
  12831.  
  12832. ΓòÉΓòÉΓòÉ 15.8. Related Information ΓòÉΓòÉΓòÉ
  12833.  
  12834. "Expressions and Operators" 
  12835.  
  12836. "Constructors and Destructors" 
  12837.  
  12838.  
  12839. ΓòÉΓòÉΓòÉ 16. Chapter 16. The Preprocessor ΓòÉΓòÉΓòÉ
  12840.  
  12841. This chapter describes C++  preprocessing. It discusses the following topics: 
  12842.  
  12843. o Introduction to the preprocessor 
  12844. o Preprocessor directive format 
  12845. o Phases of preprocessing 
  12846. o Macro definition and expansion 
  12847. o The # operator 
  12848. o Macro concatenation with the ## operator 
  12849. o Scope of macro names and #undef 
  12850. o File inclusion using #include 
  12851. o Conditional compilation in  C++ 
  12852. o Line control in C++ 
  12853. o Error directive (#error) 
  12854. o Pragmas 
  12855. o Null directive (#) 
  12856. o Predefined macro names 
  12857.  
  12858. You can also return to the table of contents 
  12859.  
  12860.  
  12861. ΓòÉΓòÉΓòÉ 16.1. Introduction to the Preprocessor ΓòÉΓòÉΓòÉ
  12862.  
  12863. Preprocessing is a step in the compilation process that enables you to: 
  12864.  
  12865. o Replace identifiers in the current file with specified source text 
  12866.  
  12867. o Imbed files within the current file 
  12868.  
  12869. o Conditionally compile sections of the current file 
  12870.  
  12871. o Change the line number of the next line of source and change the file name of 
  12872.   the current file 
  12873.  
  12874. o Generate diagnostic messages. 
  12875.  
  12876. The preprocessor recognizes the following directives: 
  12877.  
  12878. o #define 
  12879. o #undef 
  12880. o #include 
  12881. o #if 
  12882. o #ifdef 
  12883. o #ifndef 
  12884. o #else 
  12885. o #elif 
  12886. o #endif 
  12887. o #line 
  12888. o #error 
  12889. o #pragma. 
  12890.  
  12891. This chapter also discusses: 
  12892.  
  12893. o The # operator 
  12894.  
  12895. o Macro concatenation with the ## operator 
  12896.  
  12897. o Null directive (#) 
  12898.  
  12899. o Predefined macros. 
  12900.  
  12901.  
  12902. ΓòÉΓòÉΓòÉ 16.2. Preprocessor Directive Format ΓòÉΓòÉΓòÉ
  12903.  
  12904. Preprocessor directives begin with the # character, followed by a preprocessor 
  12905. keyword. White space can appear before the # character. These lines have syntax 
  12906. independent of the rest of the language. They have effects that last 
  12907. (independent of the scoping rules of C++ ) until the end of the compilation 
  12908. unit. 
  12909.  
  12910. A preprocessor directive ends at the end of a line unless the last character of 
  12911. the line is the \ (backslash) character. If the \ character appears as the last 
  12912. character in the preprocessor line, the preprocessor interprets the \ as a 
  12913. continuation marker. The preprocessor ignores the \ (and the following new-line 
  12914. character) and interprets the following line as a continuation of the current 
  12915. preprocessor line. The last character in a source file cannot be a backslash 
  12916. character. 
  12917.  
  12918. Except for some pragma directives, preprocessor directives can appear at any 
  12919. line in a program. 
  12920.  
  12921.  
  12922. ΓòÉΓòÉΓòÉ 16.3. Phases of Preprocessing ΓòÉΓòÉΓòÉ
  12923.  
  12924. Preprocessing appears as if it occurs in several phases. 
  12925.  
  12926.  1. New-line characters are introduced as needed to replace system-dependent 
  12927.     end-of-line indicators, and any other system-dependent character-set 
  12928.     translations are done. Equivalent single characters replace trigraph 
  12929.     sequences. 
  12930.  
  12931.  2. Each \ (backslash) followed by a new-line character pair is deleted. The 
  12932.     next source line is appended to the line that contained the sequence. 
  12933.  
  12934.  3. The source text is decomposed into preprocessing tokens and sequences of 
  12935.     white space. A single white space replaces each comment. A source file 
  12936.     cannot end with a partial token or comment. 
  12937.  
  12938.  4. Preprocessing directives are executed and macros are expanded. 
  12939.  
  12940.  5. Escape sequences in character constants and string literals are replaced by 
  12941.     their equivalent values. 
  12942.  
  12943.  6. Adjacent string literals are concatenated. 
  12944.  
  12945.     The preprocessor output is syntactically and semantically analyzed and 
  12946.     translated, and then linked as necessary with other programs and libraries. 
  12947.  
  12948.  
  12949. ΓòÉΓòÉΓòÉ 16.4. Macro Definition and Expansion (#define) ΓòÉΓòÉΓòÉ
  12950.  
  12951. A preprocessor define directive directs the preprocessor to replace all 
  12952. subsequent occurrences of an identifier or macro with specified source text. 
  12953.  
  12954. The #define preprocessor directive has the form: 
  12955.  
  12956.       #define identifier token-string
  12957.  
  12958.       #define identifier(
  12959. identifier , ... ,
  12960. identifier
  12961. )
  12962.                                                token-string
  12963.  
  12964. The #define directive can contain an object-like definition or a function-like 
  12965. definition. 
  12966.  
  12967.  
  12968. ΓòÉΓòÉΓòÉ 16.4.1. Object-Like Macro Definition ΓòÉΓòÉΓòÉ
  12969.  
  12970. An object-like macro definition replaces a single identifier with the specified 
  12971. source text. The following definition causes the preprocessor to replace all 
  12972. subsequent instances of the identifier COUNT with the constant 1000: 
  12973.  
  12974. :id='51V01093'.
  12975. #define COUNT 1000
  12976.  
  12977. If the statement: 
  12978.  
  12979. :id='51V01095'.
  12980. int arry[COUNT];
  12981.  
  12982. appears in a file following the definition of COUNT, the preprocessor changes 
  12983. the statement to: 
  12984.  
  12985. :id='51V01097'.
  12986. int arry[1000];
  12987.  
  12988. in the output of the preprocessor. 
  12989.  
  12990. Other definitions can make reference to the identifier COUNT: 
  12991.  
  12992. :id='51V01099'.
  12993. #define MAX_COUNT COUNT + 100
  12994.  
  12995. The preprocessor replaces each subsequent occurrence of MAX_COUNT with COUNT + 
  12996. 100, which the preprocessor then replaces with 1000 + 100. 
  12997.  
  12998.  
  12999. ΓòÉΓòÉΓòÉ 16.4.2. Function-Like Macro Definition ΓòÉΓòÉΓòÉ
  13000.  
  13001. A function-like definition is an identifier followed by a parenthesized 
  13002. argument list and the replacement code. The arguments are imbedded in the 
  13003. replacement code. White space cannot separate the identifier for the macro name 
  13004. and the left parenthesis of the argument list. A comma must separate each 
  13005. argument. For portability, do not use more than 31 arguments for a macro. 
  13006.  
  13007. A function-like macro invocation is an identifier followed by a parenthesized 
  13008. list of arguments. A comma must separate each argument. Once the preprocessor 
  13009. identifies a function-like macro invocation, argument substitution takes place. 
  13010. An argument in the replacement code is replaced by the corresponding argument 
  13011. in the parenthesized list. Any macro invocations contained in the argument 
  13012. itself are completely replaced before the argument is replaced. 
  13013.  
  13014. Note:  :id='218TO1899'. Arguments of the # and ## operators are converted 
  13015. before replacement of arguments in a function-like macro. 
  13016.  
  13017. The following line defines the macro SUM as having two arguments, a and b, and 
  13018. the replacement code (a + b): 
  13019.  
  13020. :id='51V010a2'.
  13021. #define SUM(a,b) (a + b)
  13022.  
  13023. If the statements: 
  13024.  
  13025. :id='51V010a4'.
  13026. c = SUM(x,y);
  13027. c = d * SUM(x,y);
  13028.  
  13029. appear after this definition and in the same file as the definition, the 
  13030. preprocessor changes the statement to: 
  13031.  
  13032. :id='51V010a6'.
  13033. c = (x + y);
  13034. c = d * (x + y);
  13035.  
  13036. in the output of the preprocessor. 
  13037.  
  13038. Use parentheses to ensure correct evaluation of replacement text. For example, 
  13039. the definition: 
  13040.  
  13041. :id='218TO189b'.
  13042. #define SQR(c) ((c) * (c))
  13043.  
  13044. requires parentheses around each argument c in the definition to correctly 
  13045. evaluate an expression like: 
  13046.  
  13047. :id='218TO189d'.
  13048. y = SQR(a + b);
  13049.  
  13050. The preprocessor expands this statement to: 
  13051.  
  13052. :id='218TO189f'.
  13053. y = ((a + b) * (a + b));
  13054.  
  13055. Without parentheses in the definition, the correct order of evaluation is not 
  13056. preserved, and the preprocessor output is: 
  13057.  
  13058. :id='218TO18a1'.
  13059. y = (a + b * a + b);
  13060.  
  13061. See "Parenthesized Expressions" for more information about using parentheses. 
  13062.  
  13063.  
  13064. ΓòÉΓòÉΓòÉ 16.4.3. Notes ΓòÉΓòÉΓòÉ
  13065.  
  13066. A macro call must have the same number of arguments as the corresponding macro 
  13067. definition has arguments. A macro call can specify an empty argument list. 
  13068.  
  13069. In the macro call argument list, commas that appear as character constants, in 
  13070. string literals or surrounded by parentheses, do not separate arguments. 
  13071.  
  13072. The scope of a macro definition begins at the definition and does not end until 
  13073. a corresponding #undef  directive is encountered. If there is no corresponding 
  13074. #undef directive, the scope of the macro definition lasts until the end of the 
  13075. source file is reached. 
  13076.  
  13077. A recursive macro is not fully expanded. For example, the following definition: 
  13078.  
  13079. :id='51V010ac'.
  13080. #define x(a,b) x(a+1,b+1) + 4
  13081.  
  13082. would expand: 
  13083.  
  13084. :id='162TO14a4'.
  13085. x(20,10)
  13086.  
  13087. to 
  13088.  
  13089. :id='162TO14a6'.
  13090. x(20+1,10+1) + 4
  13091.  
  13092. rather than trying to expand the macro x over and over within itself. 
  13093.  
  13094. A definition is not required to specify replacement code. The following 
  13095. definition removes all instances of the word debug from subsequent lines in the 
  13096. current file: 
  13097.  
  13098. :id='51V010b0'.
  13099. #define debug
  13100.  
  13101. This is the same as specifying the -Ddebug= compiler option. Note that 
  13102. specifying -Ddebug without the = (equal sign) gives the digit 1 as replacement 
  13103. text. 
  13104.  
  13105. If you want to change the definition of a defined identifier, you must have an 
  13106. #undef directive before the second #define directive. The #undef directive 
  13107. nullifies the first definition so that the same identifier can be used in a 
  13108. redefinition. 
  13109.  
  13110. Within the text of the program, the preprocessor does not scan character 
  13111. constants, string literals, or comments for macro calls. 
  13112.  
  13113. The following program contains two macro definitions and a macro call that 
  13114. references both of the defined macros: 
  13115.  
  13116. :id='51V010b5'.
  13117. #include <iostream.h>
  13118. #define SQR(s) ((s) * (s))
  13119. #define PRNT(a,b)\
  13120. cout << "value 1 = " << a;\
  13121. cout << "value 2 = " << b;
  13122. void main()
  13123. {
  13124.   int x = 2;
  13125.    int y = 3;
  13126.    PRNT(SQR(x),y);
  13127. }
  13128.  
  13129. After being interpreted by the preprocessor, this program is replaced by code 
  13130. equivalent to the following: 
  13131.  
  13132. :id='51V010b7'.
  13133. void main()
  13134. {
  13135.   int x = 2;
  13136.    int y = 3;
  13137.    cout << "value 1 = " << ((x) * (x));
  13138.    cout << "value 2 = " << y;
  13139. }
  13140.  
  13141. This program produces the following output: 
  13142.  
  13143. :id='51V010b9'.
  13144. value 1 = 4
  13145. value 2 = 3
  13146.  
  13147.  
  13148. ΓòÉΓòÉΓòÉ 16.5. The # Operator ΓòÉΓòÉΓòÉ
  13149.  
  13150. The # (single number sign) operator converts an argument of a function-like 
  13151. macro into a character string literal. If a macro ABC is defined using the 
  13152. following directive: 
  13153.  
  13154. :id='51V01141'.
  13155. #define ABC(x) #x
  13156.  
  13157. all subsequent occurrences of the macro ABC are expanded into a character 
  13158. string literal containing the argument passed to ABC. 
  13159.  
  13160. For example: :id='162TO14a9'. Invocation    Result of Macro Expansion 
  13161.  
  13162. :id='162TO14aa'.
  13163. ABC(1)                  "1"
  13164.  
  13165. :id='162TO14ab'.
  13166. ABC(Hello there)      "Hello there"
  13167.  
  13168.  
  13169. ΓòÉΓòÉΓòÉ 16.5.1. Using the # Operator in a Function-Like Macro Definition ΓòÉΓòÉΓòÉ
  13170.  
  13171. When you use the # operator in a function-like macro definition, the following 
  13172. rules apply: An argument in a function-like macro that is preceded by the # 
  13173. operator is converted into a character string literal containing the argument 
  13174. passed to the macro. White-space characters that appear before or after the 
  13175. argument passed to the macro are deleted. Multiple white-space characters 
  13176. imbedded within the argument passed to the macro are replaced by a single-space 
  13177. character. If the argument passed to the macro contains a string literal and if 
  13178. a \ (backslash) character appears within the literal, a second \ character is 
  13179. inserted before the original \ when the macro is expanded. If the argument 
  13180. passed to the macro contains a " (double quotation mark) character, a \ 
  13181. character is inserted before the " when the macro is expanded. If the argument 
  13182. passed to the macro contains a ' (single quotation mark) character, a \ 
  13183. character is inserted before the ' when the macro is expanded. The conversion 
  13184. of an argument into a string literal occurs before macro expansion. If more 
  13185. than one ## operator and/or # operator appears in the replacement list of a 
  13186. macro definition, the order of evaluation of the operators is not defined. If 
  13187. the result of the macro expansion is not a valid character string literal, the 
  13188. behavior is undefined. 
  13189.  
  13190. The following examples demonstrate these rules. 
  13191.  
  13192. :id='51V01150'.
  13193. #define STR(x)  #x
  13194. #define XSTR(x)  STR(x)
  13195. #define ONE   1
  13196. :id='162TO14ac'. Invocation    Result of Macro Expansion 
  13197.  
  13198. :id='162TO14ad'.
  13199. STR(\n "\n" '\n')      "\n \"\\n\" '\\n'"
  13200.  
  13201. :id='162TO14ae'.
  13202. STR(ONE)            "ONE"
  13203.  
  13204. :id='162TO14af'.
  13205. XSTR(ONE)            "1"
  13206.  
  13207. :id='162TO14b0'.
  13208. XSTR("hello")            "\"hello\""
  13209.  
  13210.  
  13211. ΓòÉΓòÉΓòÉ 16.6. Macro Concatenation with the ## Operator ΓòÉΓòÉΓòÉ
  13212.  
  13213. The ## (double number sign) operator is defined in ANSI for macro replacement. 
  13214. The ## operator concatenates two items (text and/or arguments) given in a macro 
  13215. definition. If a macro, XY, is defined using the following directive: 
  13216.  
  13217. :id='51V01155'.
  13218. #define XY(x, y) x##y
  13219.  
  13220. the two arguments passed to XY are concatenated. :id='162TO14b1'. Invocation 
  13221. Result of Macro Expansion 
  13222.  
  13223. :id='162TO14b2'.
  13224. XY(1, 2)            12
  13225.  
  13226. :id='162TO14b3'.
  13227. XY(Green, house)      Greenhouse
  13228.  
  13229.  
  13230. ΓòÉΓòÉΓòÉ 16.6.1. The ## Operator ΓòÉΓòÉΓòÉ
  13231.  
  13232. Use the ## operator according to the following constraints: The ## operator 
  13233. cannot be the very first or very last item in the replacement list of a macro 
  13234. definition. The argument before the ## operator is concatenated with the 
  13235. argument after the ## operator. Concatenation takes place before any arguments 
  13236. are expanded. If the result of a concatenation contains valid macro names, 
  13237. further macro expansions can take place. If more than one ## operator and/or # 
  13238. operator appears in the replacement list of a macro definition, the order of 
  13239. evaluation of the operators is not defined. 
  13240.  
  13241. The following examples demonstrate the use of the ## operator. 
  13242.  
  13243. :id='51V01160'.
  13244. #define ArgArg(x, y)    x##y
  13245. #define ArgText(x)      x##TEXT
  13246. #define TextArg(x)      TEXT##x
  13247. #define TextText        TEXT##text
  13248. #define Jitter          1
  13249. #define bug             2
  13250. #define Jitterbug       3
  13251. :id='162TO14b4'. Invocation    Result of Macro Expansion 
  13252.  
  13253. :id='162TO14b5'.
  13254. ArgArg(lady,bug)      ladybug
  13255.  
  13256. :id='162TO14b6'.
  13257. ArgText(con)            conTEXT
  13258.  
  13259. :id='162TO14b7'.
  13260. TextArg(book)      TEXTbook
  13261.  
  13262. :id='162TO14b8'.
  13263. TextText            TEXTtext
  13264.  
  13265. :id='162TO14b9'.
  13266. ArgArg(Jitter,bug)      3
  13267.  
  13268.  
  13269. ΓòÉΓòÉΓòÉ 16.7. Scope of Macro Names and #undef ΓòÉΓòÉΓòÉ
  13270.  
  13271. Once defined, a preprocessor identifier remains defined and in scope 
  13272. (independent of the scoping rules of C++ ) until the end of a translation unit 
  13273. or until it is undefined by an #undef preprocessor directive. 
  13274.  
  13275. The #undef preprocessor directive has the form: 
  13276.  
  13277. :id='87V0578c'.
  13278.       #undef identifier
  13279.  
  13280. If the identifier is not currently defined as a macro, #undef is ignored. 
  13281.  
  13282. The following directives define BUFFER and SQR: 
  13283.  
  13284. :id='51V010c1'.
  13285. #define BUFFER 512
  13286. #define SQR(x) ((x) * (x))
  13287.  
  13288. The following directives nullify these definitions: 
  13289.  
  13290. :id='51V010c3'.
  13291. #undef BUFFER
  13292. #undef SQR
  13293.  
  13294. Occurrences of the identifiers BUFFER and SQR that appear following these 
  13295. #undef directives are not substituted for the previously defined code. Once the 
  13296. definition of a macro has been removed by an #undef directive, the identifier 
  13297. can be used in a new #define directive. 
  13298.  
  13299.  
  13300. ΓòÉΓòÉΓòÉ 16.8. File Inclusion (#include) ΓòÉΓòÉΓòÉ
  13301.  
  13302. A preprocessor include directive causes the preprocessor to replace the 
  13303. directive with the contents of the specified file. 
  13304.  
  13305. The #include preprocessor directive has the form: 
  13306.  
  13307. :id='87V0578f'.
  13308.       #include " filename "
  13309.  
  13310.       #include < filename
  13311. >
  13312.  
  13313.       #include token-string
  13314.  
  13315. If the file name is enclosed in double quotation marks, the preprocessor 
  13316. searches the place (for example, directories or libraries) that contains the 
  13317. source file, then a standard or specified sequence of places, until it finds 
  13318. the specified file. For example: 
  13319.  
  13320. :id='51V01100'.
  13321. #include "payroll.h"
  13322.  
  13323. If the file name is enclosed in the characters < and  , the preprocessor 
  13324. searches only the standard or specified places for the specified file. For 
  13325. example: 
  13326.  
  13327. :id='51V01102'.
  13328. #include <iostream.h>
  13329.  
  13330. Otherwise, the preprocessor resolves macros contained on a #include directive. 
  13331. After macro replacement, the resulting character sequence must consist of a 
  13332. file name enclosed in either double quotation marks or the characters < and . 
  13333. For example: 
  13334.  
  13335. :id='51V01104'.
  13336. #define MONTH <july.h>
  13337. #include MONTH
  13338.  
  13339. The -I compiler option specifies a search path if the file name in the #include 
  13340. directive is not an absolute path. See the -I compiler option in the 
  13341. Programming Guide. for more information. 
  13342.  
  13343. If you have a number of definitions that several files use, you can place all 
  13344. these definitions in one file and include that file in each file that must know 
  13345. the definitions. For example, the following file defs.h contains several 
  13346. definitions and an inclusion of an additional file of definitions: 
  13347.  
  13348. :id='51V01107'.
  13349. /* defs.h */
  13350. #define TRUE 1
  13351. #define FALSE 0
  13352. #define BUFFERSIZE 512
  13353. #define MAX_ROW 66
  13354. #define MAX_COLUMN 80
  13355. int hour;
  13356. int min;
  13357. int sec;
  13358. #include "mydefs.h"
  13359.  
  13360. You can imbed the definitions that appear in defs.h with the following 
  13361. directive: 
  13362.  
  13363. :id='51V01109'.
  13364. #include "defs.h"
  13365.  
  13366. The preprocessor looks for the file defs.h first in the directory that contains 
  13367. the current source file. If the file is not found there, the preprocessor 
  13368. searches a sequence of specified or standard locations. 
  13369.  
  13370. The following example shows one way to combine the use of preprocessor 
  13371. directives. The #define  directive defines a macro that represents the name of 
  13372. the C++ standard I/O header file. The #include directive makes the header file 
  13373. available to the C++ program. 
  13374.  
  13375. :id='51V0110c'.
  13376. #define ABC <iostream.h>
  13377. //  .
  13378. //  .
  13379. //  .
  13380. #include ABC // equivalent to specifying #include <iostream.h>
  13381. //  .
  13382. //  .
  13383. //  .
  13384.  
  13385.  
  13386. ΓòÉΓòÉΓòÉ 16.8.1. Restrictions ΓòÉΓòÉΓòÉ
  13387.  
  13388. The new-line character and the  cannot appear in a file-name delimited by < and 
  13389.  
  13390. The new-line character and the " (double quotation marks) character cannot 
  13391. appear in a file-name delimited by " and ", although  can appear. 
  13392.  
  13393.  
  13394. ΓòÉΓòÉΓòÉ 16.9. Conditional Compilation in C++ ΓòÉΓòÉΓòÉ
  13395.  
  13396. A preprocessor conditional compilation directive causes the preprocessor to 
  13397. conditionally suppress the compilation of portions of source code. These 
  13398. conditional compilation directives test a constant expression or an identifier 
  13399. to determine which portions of the source file the preprocessor should pass on 
  13400. to the &xcomp. and which portions should be removed from the source file during 
  13401. preprocessing. The preprocessor conditional compilation directive spans several 
  13402. lines: 
  13403.  
  13404. o The condition specification line 
  13405.  
  13406. o Lines containing code that the preprocessor passes on to the &xcomp. if the 
  13407.   condition evaluates to a nonzero value (optional) 
  13408.  
  13409. o The #else line (optional) 
  13410.  
  13411. o Lines containing code that the preprocessor passes on to the &xcomp. if the 
  13412.   condition evaluates to zero (optional) 
  13413.  
  13414. o The preprocessor #endif directive. 
  13415.  
  13416. Preprocessor conditional compilation has the form: 
  13417.  
  13418.       conditional:
  13419.             if-part
  13420. [elif-parts][else-part]
  13421. endif-line
  13422.       if-part:
  13423.             if-line text
  13424.       if-line:
  13425.             #if constant-expression
  13426.             #ifdef identifier
  13427.             #ifndef identifier
  13428.  
  13429. A preprocessor conditional compilation directive can have one of three types of 
  13430. conditions: #if, #ifdef, and #ifndef. These directives, along with the #elif, 
  13431. #else, and #endif directives, control which portions of the source file are 
  13432. passed on to the &xcomp.. 
  13433.  
  13434. The following describes the use of each directive: :id='128TO117f'. Condition 
  13435. Description 
  13436.  
  13437. #if, #elif If the constant expression evaluates to a nonzero value, the source 
  13438.           that immediately follows the condition is passed on to the &xcomp.. 
  13439.  
  13440. #ifdef    If the identifier specified is defined as a macro, the source that 
  13441.           immediately follows the condition is passed on to the &xcomp.. 
  13442.  
  13443. #ifndef   If the identifier specified is not defined as a macro, the source 
  13444.           that immediately follows the condition is passed on to the &xcomp.. 
  13445.  
  13446.           If the condition evaluates to 0 (zero) and the conditional 
  13447.           compilation directive contains a preprocessor #elif directive, the 
  13448.           condition of the #elif directive is evaluated. If the #elif condition 
  13449.           evaluates to nonzero, the source text between this #elif and the next 
  13450.           #elif or preprocessor #else directive is selected by the preprocessor 
  13451.           to be passed on to the &xcomp.. The #elif directive cannot appear 
  13452.           after the preprocessor #else directive. 
  13453.  
  13454.           The #elif preprocessor directive has the following form: 
  13455.  
  13456.                           elif-parts:
  13457.  
  13458.                                 elif-line text
  13459.  
  13460.                                 elif-parts elif-line text
  13461.  
  13462.                           elif-line:
  13463.  
  13464.                     :id='87V05791'.
  13465.                                 # elif constant-expression
  13466.  
  13467.           If the condition evaluates to 0 (zero) and the conditional 
  13468.           compilation directive contains a preprocessor #else directive, the 
  13469.           source text located between the preprocessor #else directive and the 
  13470.           preprocessor #endif directive is selected by the preprocessor to be 
  13471.           passed on to the &xcomp.. 
  13472.  
  13473.           The #else preprocessor directive has the following form: 
  13474.  
  13475.                           else-part:
  13476.  
  13477.                                 else-line text
  13478.  
  13479.                           else-line:
  13480.  
  13481.                     :id='87V05792'.
  13482.                                 # else
  13483.  
  13484.           The #endif preprocessor directive ends the conditional compilation 
  13485.           directive. The #endif directive has the form: 
  13486.  
  13487.                           endif-line:
  13488.  
  13489.                     :id='87V05793'.
  13490.                                 # endif
  13491.  
  13492.           You can nest preprocessor conditional directives. 
  13493.  
  13494.  
  13495. ΓòÉΓòÉΓòÉ 16.9.1. #if, #elif ΓòÉΓòÉΓòÉ
  13496.  
  13497. The #if keyword and the #elif keyword must be followed by an integral constant 
  13498. expression. The constant expression cannot contain C++ identifiers (for 
  13499. example, a sizeof expression or a type cast) because the preprocessor can only 
  13500. recognize identifiers defined by the #define directive. 
  13501.  
  13502. Note:  :id='51V01120'. If a macro is not defined, a value of 0 (zero) is 
  13503. assigned to it. In the following example, TEST must be a macro identifier; 
  13504. otherwise, neither the #if macro nor the #elif macro will be passed to the 
  13505. &xcomp. : 
  13506.  
  13507. :id='51V01121'.
  13508.       #if TEST >= 1
  13509.              cout << "i = " << i <<
  13510. endl;
  13511.             cout << "array[i] = " << array[i]
  13512. << endl;
  13513.       #elif TEST < 0
  13514.             cout <<"array subscript out of bounds"
  13515. << endl;
  13516.       #endif
  13517.  
  13518. The constant expression can contain the keyword defined. It can be used only 
  13519. with the preprocessor keywords #if and #elif. The expression: 
  13520.  
  13521. :id='51V01123'.
  13522. defined identifier
  13523.  
  13524. or 
  13525.  
  13526. :id='51V01125'.
  13527. defined (identifier)
  13528.  
  13529. evaluates to 1 if the identifier is defined in the preprocessor; otherwise, to 
  13530. 0 (zero). For example: 
  13531.  
  13532. :id='51V01127'.
  13533. #if defined(TEST1) || defined(TEST2)
  13534.  
  13535.  
  13536. ΓòÉΓòÉΓòÉ 16.9.2. #ifdef ΓòÉΓòÉΓòÉ
  13537.  
  13538. An identifier must follow the #ifdef keyword. The following example defines 
  13539. MAX_LEN to be 75 if EXTENDED is defined for the preprocessor. Otherwise, 
  13540. MAX_LEN is defined to be 50. 
  13541.  
  13542. :id='51V0112a'.
  13543. #ifdef EXTENDED
  13544. #  define MAX_LEN 75
  13545. #else
  13546. #  define MAX_LEN 50
  13547. #endif
  13548.  
  13549. A control line of the form: 
  13550.  
  13551. #ifdef identifier
  13552.  
  13553. is equivalent to: 
  13554.  
  13555. #if defined identifier
  13556.  
  13557.  
  13558. ΓòÉΓòÉΓòÉ 16.9.3. #ifndef ΓòÉΓòÉΓòÉ
  13559.  
  13560. An identifier must follow the #ifndef keyword. The following example defines 
  13561. MAX_LEN to be 50 if EXTENDED is not defined for the preprocessor. Otherwise, 
  13562. MAX_LEN is defined to be 75. 
  13563.  
  13564. :id='51V0112d'.
  13565. #ifndef EXTENDED
  13566. #  define MAX_LEN 50
  13567. #else
  13568. #  define MAX_LEN 75
  13569. #endif
  13570.  
  13571. A control line of the form: 
  13572.  
  13573. #ifndef identifier
  13574.  
  13575. is equivalent to: 
  13576.  
  13577. #if !defined identifier
  13578.  
  13579. The following example shows how you can nest preprocessor conditional 
  13580. compilation directives: 
  13581.  
  13582. :id='51V01130'.
  13583. #if defined(TARGET1)
  13584. #   define SIZEOF_INT 16
  13585. #   ifdef PHASE2
  13586. #     define MAX_PHASE 2
  13587. #   else
  13588. #    define MAX_PHASE 8
  13589. #   endif
  13590. #elif defined(TARGET2)
  13591. #   define SIZEOF_INT 32
  13592. #   define MAX_PHASE 16
  13593. #else
  13594. #   define SIZEOF_INT 32
  13595. #   define MAX_PHASE 32
  13596. #endif
  13597.  
  13598. The following program contains preprocessor conditional compilation directives: 
  13599.  
  13600. :id='51V01132'.
  13601. 1  #include <iostream.h>
  13602. 2  void main()
  13603. 3  {
  13604. 4    static int array[ ] = { 1, 2, 3, 4, 5 };
  13605. 5    int i;
  13606. 6    for (i = 0; i <= 4; i++)
  13607. 7    {
  13608. 8      array[i] *= 2;
  13609. 9
  13610. 10 #if TEST >= 1
  13611. 11   cout << "i = " << i;
  13612. 12   cout << "array[i] = " << array[i]
  13613. << endl;
  13614. 13 #endif
  13615. 14    }
  13616. 15 }
  13617.  
  13618.  
  13619. ΓòÉΓòÉΓòÉ 16.10. Line Control in C++ ΓòÉΓòÉΓòÉ
  13620.  
  13621. A preprocessor line control directive causes the next source line to be treated 
  13622. as having the specified number. 
  13623.  
  13624. The #line preprocessor directive has the form: 
  13625.  
  13626. :id='87V05794'.
  13627.       #line constant
  13628. ["filename"]
  13629.  
  13630. A file name specification enclosed in double quotation marks can follow the 
  13631. line number. If file-name appears, the directive sets the predefined macro 
  13632. __FILE__ to the specified file name. The directive sets the predefined macro 
  13633. __LINE__ so that the line number of the next source line is considered to be 
  13634. the specified constant. 
  13635.  
  13636. The identifier on a #line directive is subject to macro replacement. After 
  13637. macro replacement, the resulting character sequence must consist of a decimal 
  13638. constant, optionally followed by a file name enclosed in double quotation 
  13639. marks. 
  13640.  
  13641. Note:  :id='218TO18ab'. The keyword line is optional. The directive: 
  13642.  
  13643. :id='218TO18ac'.
  13644. # line 300
  13645.  
  13646. is equivalent to: 
  13647.  
  13648. :id='218TO18ae'.
  13649. # 300
  13650.  
  13651. You can use line control directives to see more meaningful error messages. The 
  13652. following program uses line control directives to give each function an easily 
  13653. recognizable line number. 
  13654.  
  13655. :id='51V01139'.
  13656. 1  #include <iostream.h>
  13657. 2  #define LINE200 200
  13658. 3
  13659. 4  void main()
  13660. 5  {
  13661. 6     func_1();
  13662. 7     func_2();
  13663. 8  }
  13664. 9
  13665. 10 #line 100
  13666. 11 func_1() /* This line is viewed as line 100 */
  13667. 12 {
  13668. 13 cout << "Func_1 - current line number is <<
  13669. __LINE__ << endl;
  13670. 14 }
  13671. 15
  13672. 16 #line LINE200
  13673. 17 func_2()
  13674. 18 {
  13675. 19 cout << "Func_2 - current line number is " <<
  13676. __LINE__ << endl;
  13677. 20 }
  13678.  
  13679. This program produces the following output: 
  13680.  
  13681. :id='51V0113b'.
  13682. Func_1 - current line number is 102
  13683. Func_2 - current line number is 202
  13684.  
  13685.  
  13686. ΓòÉΓòÉΓòÉ 16.11. Error Directive (#error) ΓòÉΓòÉΓòÉ
  13687.  
  13688. A preprocessor error directive causes the preprocessor to generate a severe (S) 
  13689. diagnostic message that includes the given token sequence. Preprocessing 
  13690. continues, but no object code is generated. 
  13691.  
  13692. The #error preprocessor directive has the form: 
  13693.  
  13694. :id='87V0578d'.
  13695.       #error token-string
  13696.  
  13697. The directive: 
  13698.  
  13699. :id='51V010f8'.
  13700. #error Error in TESTPGM1 - This section should not be compiled
  13701.  
  13702. generates the error message: 
  13703.  
  13704. :id='218TO18a8'.
  13705. Error in TESTPGM1 - This section should not be compiled
  13706.  
  13707. The #error directive is useful as a safety check during compilation. For 
  13708. example, if your program uses preprocessor conditional compilation directives, 
  13709. place #error directives in the source file to prevent generation of object code 
  13710. if a particular section of the program is reached. 
  13711.  
  13712.  
  13713. ΓòÉΓòÉΓòÉ 16.12. Pragmas ΓòÉΓòÉΓòÉ
  13714.  
  13715. A pragma is an implementation-defined instruction to the &xcomp.. It has the 
  13716. general form given below, where token-string is a series of characters giving a 
  13717. specific compiler instruction, and arguments, if any. Pragmas have the general 
  13718. form: 
  13719.  
  13720.       #pragma token-string
  13721.  
  13722. The token-string on a pragma is not subject to macro substitutions. More than 
  13723. one pragma option can be specified on a single #pragma directive. 
  13724.  
  13725. The following pragmas are available in C++ : 
  13726.  
  13727. o alloca 
  13728. o chars 
  13729. o comment 
  13730. o disjoint 
  13731. o isolated_call 
  13732. o langlvl 
  13733. o options 
  13734. o strings 
  13735. o define 
  13736. o implementation. 
  13737.  
  13738.  
  13739. ΓòÉΓòÉΓòÉ 16.12.1. alloca ΓòÉΓòÉΓòÉ
  13740.  
  13741. The #pragma alloca directive has the form: 
  13742.  
  13743. :id='87V0579f'.
  13744. pragma-alloca:
  13745.             #pragma alloca
  13746.  
  13747. It specifies that the function, alloca(size_t size), is to allocate space for 
  13748. an object of size bytes. The allocated space is put on the stack. 
  13749.  
  13750. You must include the #pragma alloca directive to have the &xcomp. provide an 
  13751. inlined version of alloca. Alternatively, the -ma compiler option substitutes 
  13752. inline code for calls to function alloca without specifying the #pragma alloca 
  13753. directive in the source code. If #pragma alloca is unspecified, or if you do 
  13754. not use -ma, alloca is treated as a user-defined identifier, rather than as a 
  13755. built-in function. 
  13756.  
  13757. Whenever you make a call to alloca, you must include the header file <malloc.h> 
  13758. to define alloca. 
  13759.  
  13760. This pragma must be included in the source before the first function 
  13761. definition. Once specified, it applies to the rest of the file and cannot be 
  13762. turned off. If a source file contains any functions that you want compiled 
  13763. without #pragma alloca, place these functions in a different file. 
  13764.  
  13765.  
  13766. ΓòÉΓòÉΓòÉ 16.12.2. chars ΓòÉΓòÉΓòÉ
  13767.  
  13768. The #pragma chars directive specifies that the &xcomp. is to treat all char 
  13769. objects as signed or unsigned. 
  13770.  
  13771. The #pragma chars directive has the form: 
  13772.  
  13773.       pragma-chars:
  13774.  
  13775. :id='87V0579e'.
  13776.             #pragma chars (
  13777. sign
  13778. )
  13779.  
  13780.       sign:
  13781.  
  13782.             signed
  13783.  
  13784.             unsigned
  13785.  
  13786.  
  13787. ΓòÉΓòÉΓòÉ 16.12.3. comment ΓòÉΓòÉΓòÉ
  13788.  
  13789. The #pragma comment directive places a comment into the object file. 
  13790.  
  13791. The #pragma comment directive has the form: 
  13792.  
  13793.       pragma-comment:
  13794.  
  13795.             #pragma comment (
  13796. comment-type
  13797. )
  13798.  
  13799.       comment-type:
  13800.  
  13801. :id='87V0579b'.
  13802.             compiler
  13803.  
  13804.             date
  13805.  
  13806.             timestamp
  13807.  
  13808.             copyright[,
  13809. "token-string"]
  13810.  
  13811.             user[,
  13812. "token-string"]
  13813.  
  13814. The comment-type can be: 
  13815.  
  13816. compiler  The name and version of the compiler is appended to the end of the 
  13817.           generated object module. 
  13818.  
  13819. date      The date and time of compilation is appended to the end of the 
  13820.           generated object module. 
  13821.  
  13822. timestamp The date and time of the last modification of the source is appended 
  13823.           to the end of the generated object module. 
  13824.  
  13825. copyright The text specified by the token-string is placed by the &xcomp. into 
  13826.           the generated object module and is loaded into memory when the 
  13827.           program is run. 
  13828.  
  13829. user      The text specified by the token-string field is placed by the &xcomp. 
  13830.           into the generated object but is not loaded into memory when the 
  13831.           program is run. 
  13832.  
  13833.  
  13834. ΓòÉΓòÉΓòÉ 16.12.4. disjoint ΓòÉΓòÉΓòÉ
  13835.  
  13836. The #pragma disjoint directive lists the identifiers that are not aliased to 
  13837. each other within the scope of their use. 
  13838.  
  13839. The #pragma disjoint directive has the form: 
  13840.  
  13841.       pragma-disjoint:
  13842.             #pragma disjoint (
  13843. disjoint-name-list
  13844. )
  13845.  
  13846.       disjoint-name-list:
  13847.             disjoint-name
  13848.             disjoint-name-list ,
  13849. disjoint-name
  13850.  
  13851.       disjoint-name:
  13852.             name
  13853.             disjoint-pointer
  13854.  
  13855.       disjoint-pointer:
  13856.             name
  13857.             * disjoint-pointer
  13858.  
  13859. where name  can be an identifier, operator-function-name, 
  13860. conversion-function-name, destructor, or a qualified-name. 
  13861.  
  13862. The directive informs the &xcomp. that none of the identifiers listed shares 
  13863. the same physical storage, which provides more opportunity for optimizations. 
  13864. If any identifiers actually share physical storage, the pragma may give 
  13865. incorrect results. 
  13866.  
  13867. The pragma can appear anywhere in the source program that a declaration is 
  13868. allowed. An identifier in the directive must be visible at the point in the 
  13869. program where the pragma appears. The identifiers listed cannot refer to any of 
  13870. the following: 
  13871.  
  13872. o A member of a class, structure, or union 
  13873. o A class, structure, or union tag 
  13874. o An enumeration constant 
  13875. o A label. 
  13876.  
  13877. The identifiers must be declared before they are used in the pragma. A pointer 
  13878. in the identifier list must not have been dereferenced or used as a function 
  13879. argument before appearing in the directive. 
  13880.  
  13881. The following example shows the use of the #pragma disjoint directive. Because 
  13882. external pointer ptr_a does not share storage with and never points to the 
  13883. external variable b, the assignment of 7 to the object that ptr_a points to 
  13884. will not change the value of b. Likewise, external pointer ptr_b does not share 
  13885. storage with and never points to the external variable a. The argument to 
  13886. another_function has the value 6. 
  13887.  
  13888. :id='128TO11b8'.
  13889. int a, b, *ptr_a, *ptr_b;
  13890. #pragma disjoint(*ptr_a, b)        // *ptr_a never points
  13891. to b
  13892. #pragma disjoint(*ptr_b, a)        // *ptr_b never points
  13893. to a
  13894. one_function()
  13895. {
  13896.       b = 6;
  13897.        *ptra = 7;    // Assignment will not change the value
  13898. of b
  13899.       another_function(b);        // Argument "b" has the
  13900. value 6
  13901. }
  13902.  
  13903. The -qignprag compiler option causes aliasing pragmas to be ignored. Use this 
  13904. option to debug applications containing the #pragma disjoint directive. 
  13905.  
  13906.  
  13907. ΓòÉΓòÉΓòÉ 16.12.5. isolated_call ΓòÉΓòÉΓòÉ
  13908.  
  13909. The #pragma isolated_call directive lists functions that do not alter data 
  13910. objects visible at the time of the function call. 
  13911.  
  13912. The #pragma isolated_call directive has the form: 
  13913.  
  13914.       pragma-isolated-call:
  13915.             #pragma isolated_call (
  13916. isolated_call-name-list
  13917. )
  13918.  
  13919.       isolated_call-name-list:
  13920.             name
  13921.             isolated_call-name-list , name
  13922.  
  13923. where name can be an identifier, operator-function-name, 
  13924. conversion-function-name, destructor, or a qualified-name. 
  13925.  
  13926. The pragma should appear before calls to the functions in the identifier list. 
  13927. The identifiers listed must be declared before they are used in the pragma. 
  13928. They must be of type function or a typedef of function. If a name refers to an 
  13929. overloaded function, all variants of that function declared before the pragma 
  13930. are marked as isolated calls. 
  13931.  
  13932. The pragma informs the &xcomp. that none of the functions listed has side 
  13933. effects. Accessing a volatile object, modifying an external object, modifying a 
  13934. file, or calling a function that does any of these can be considered side 
  13935. effects. Any change in the state of the run-time environment is considered a 
  13936. side effect. Passing function arguments by reference is one side effect that is 
  13937. allowed, but in general, functions with side effects can give incorrect results 
  13938. when listed in #pragma isolated_call directives. 
  13939.  
  13940. Marking a function as isolated indicates to the optimizer that external and 
  13941. static variables will not be changed by the called function and that references 
  13942. to storage can be deleted from the calling function where appropriate. 
  13943. Instructions can be reordered with more freedom, resulting in fewer pipeline 
  13944. delays and faster execution in the processor. Note that instruction reordering 
  13945. might, however, result in code that requires more values to be maintained 
  13946. across the isolated call. When the isolated call is not located in a loop, the 
  13947. overhead of saving and restoring extra registers might not be worth the savings 
  13948. that result from deleting the storage references. 
  13949.  
  13950. Functions specified in the identifier list are permitted to examine external 
  13951. objects and return results that depend on the state of the run-time 
  13952. environment. The functions can also modify the storage pointed to by any 
  13953. pointer arguments passed to the function; that is, calls by reference. Do not 
  13954. specify a function that calls itself or relies on local static storage. Listing 
  13955. such functions in the #pragma isolated_call directive can give unpredictable 
  13956. results. 
  13957.  
  13958. The following example shows the use of the #pragma isolated_call directive. 
  13959. Because the function this_function does not have side effects, a call to it 
  13960. will not change the value of the external variable a. The argument to 
  13961. other_function has the value 6. 
  13962.  
  13963. :id='128TO11ba'.
  13964. int a, this_function(int);      // Assumed to have no side
  13965. effects
  13966. #pragma isolated_call(this_function)
  13967. that_function()
  13968. {
  13969.       a = 6;
  13970.       this_function(7);      // Call does not change the
  13971. value of a
  13972.       other_function(a);      // Argument "a" has the value
  13973. 6
  13974. }
  13975.  
  13976. The -qignprag compiler option causes aliasing pragmas to be ignored. Use this 
  13977. option to debug applications containing the #pragma isolated_call directive. 
  13978.  
  13979.  
  13980. ΓòÉΓòÉΓòÉ 16.12.6. langlvl ΓòÉΓòÉΓòÉ
  13981.  
  13982. The #pragma langlvl directive selects the C++ language level for compilation. 
  13983. It has the following form: 
  13984.  
  13985.       pragma-langlvl:
  13986.             #pragma langlvl (
  13987. language-level
  13988. )
  13989.       language-level:
  13990.             ansi
  13991.             compat
  13992.             extended
  13993.  
  13994. The &xcomp. uses predefined macros in the header files to make declarations and 
  13995. definitions available that define the specified language level. This pragma 
  13996. must appear before any statements in a file. 
  13997.  
  13998. o &ansilvl.  defines  the predefined macro __ANSI_ _ and undefines other 
  13999.   langlvl variables. The default language level for the xlC compiler invocation 
  14000.   command is &ansilvl. . 
  14001.  
  14002. o &saalvl.  defines the predefined macro __COMPAT__ and undefines other langlvl 
  14003.   variables. 
  14004.  
  14005. o &extlvl.  defines the predefined macro __EXTENDED__ and undefines other 
  14006.   langlvl variables. 
  14007.  
  14008.  
  14009. ΓòÉΓòÉΓòÉ 16.12.7. options ΓòÉΓòÉΓòÉ
  14010.  
  14011. The #pragma options directive has the form: 
  14012.  
  14013. :id='87V057a0'.
  14014.       #pragma options option
  14015. [ ... ]
  14016.  
  14017. It specifies options to the &xcomp. in your source program. Except for #pragma 
  14018. options source, the #pragma options directive must be the first statement in 
  14019. your source program; only comments and blank lines can precede it. 
  14020.  
  14021. By default, the options specified apply to your entire source program. The 
  14022. #pragma options source directive and the other #pragma directives can be used 
  14023. throughout your program to turn an option on or off for a selected block of 
  14024. source code. If you specify more than one compiler option, use either a comma 
  14025. or a blank space to separate the options. 
  14026.  
  14027. See "Compiler Options" in the Programming Guide for detailed information about 
  14028. compiler options. 
  14029.  
  14030.  
  14031. ΓòÉΓòÉΓòÉ 16.12.8. strings ΓòÉΓòÉΓòÉ
  14032.  
  14033. The #pragma strings directive has the form: 
  14034.  
  14035.       pragma-strings:
  14036.  
  14037. :id='87V0579d'.
  14038.             #pragma strings (
  14039. storage-type
  14040. )
  14041.  
  14042.       storage-type:
  14043.  
  14044.             readonly
  14045.  
  14046.             writable
  14047.  
  14048. It specifies that the &xcomp. can place strings into read-only memory or must 
  14049. place strings into read/write memory. This pragma must appear before any C++ 
  14050. code in a file. The default for ansi mode is readonly. 
  14051.  
  14052.  
  14053. ΓòÉΓòÉΓòÉ 16.12.9. define ΓòÉΓòÉΓòÉ
  14054.  
  14055. The #pragma define is described in "The define and implementation Pragmas" in 
  14056. "Chapter 14. Templates". 
  14057.  
  14058.  
  14059. ΓòÉΓòÉΓòÉ 16.12.10. implementation ΓòÉΓòÉΓòÉ
  14060.  
  14061. The #pragma implementation is described in "The define and implementation 
  14062. Pragmas" in "Chapter 14. Templates". 
  14063.  
  14064.  
  14065. ΓòÉΓòÉΓòÉ 16.13. Null Directive (#) ΓòÉΓòÉΓòÉ
  14066.  
  14067. The null directive performs no action. It consists of a single # on a line of 
  14068. its own. 
  14069.  
  14070. In the following example, if MINVAL is a defined macro name, no action is 
  14071. performed. If MINVAL is not a defined identifier, it is defined as the value 1. 
  14072.  
  14073. :id='51V0113f'.
  14074. #ifdef MINVAL
  14075. #
  14076. #else
  14077. #  define MINVAL 1
  14078. #endif
  14079.  
  14080.  
  14081. ΓòÉΓòÉΓòÉ 16.14. Predefined Macro Names ΓòÉΓòÉΓòÉ
  14082.  
  14083. C++ provides predefined macro names to provide the following information during 
  14084. compilation. 
  14085.  
  14086.  
  14087. ΓòÉΓòÉΓòÉ 16.14.1. ANSI Standard Predefined Macro Names ΓòÉΓòÉΓòÉ
  14088.  
  14089. __LINE__  An integer representing the current source line number. __LINE__ and 
  14090.           __FILE__ can be set by the #line directive. For details, see "Line 
  14091.           Control in C++ " 
  14092.  
  14093. __FILE__  A character string literal containing the name of the source file 
  14094.           being compiled. 
  14095.  
  14096. :id='51V010cb'. __DATE__ A character string literal containing the date when 
  14097.           the source file was compiled. The date is in the form: 
  14098.  
  14099. :id='51V010cc'.
  14100. "Mmm dd yyyy"
  14101.  
  14102. where: 
  14103.  
  14104. o Mmm represents the month in an abbreviated form (Jan, Feb, Mar, Apr, May, 
  14105.   Jun, Jul, Aug, Sep, Oct, Nov, or Dec). 
  14106.  
  14107. o dd represents the day. If the day is less than 10, the first d is a blank 
  14108.   character. 
  14109.  
  14110. o yyyy represents the year. 
  14111.  
  14112. o _ _TIME_ _ is a character string literal containing the time when the source 
  14113.   file was compiled. The time is in the form: 
  14114.  
  14115. :id='51V010d2'.
  14116. "hh:ss"
  14117.  
  14118. where: 
  14119.  
  14120. o hh represents the hour. 
  14121.  
  14122. o mm represents the minutes. 
  14123.  
  14124. o ss represents the seconds. 
  14125.  
  14126. o _ _STDC_ _ is the integer 0 (zero), indicating that C++ does not conform to 
  14127.   ANSI C. 
  14128.  
  14129.  
  14130. ΓòÉΓòÉΓòÉ 16.14.2. C++ Predefined Macro Names ΓòÉΓòÉΓòÉ
  14131.  
  14132. __cplusplus The integer 1 (one) indicates that the compiler is a C++ compiler. 
  14133.           This macro name has no trailing underscores. 
  14134.  
  14135. __TIMESTAMP__ A character string literal containing the date and time when the 
  14136.           source file was last modified. The date and time are in the form: 
  14137.  
  14138. :id='51V010d8'.
  14139. "Day Mmm dd hh:ss yyyy"
  14140.  
  14141. where: 
  14142.  
  14143. o Day represents the day of the week (Mon, Tue, Wed, Thu, Fri, Sat, or Sun). 
  14144.  
  14145. o Mmm represents the month in an abbreviated form (Jan, Feb, Mar, Apr, May, 
  14146.   Jun, Jul, Aug, Sep, Oct, Nov, or Dec). 
  14147.  
  14148. o dd represents the day of the month. If the day is less than 10, the first d 
  14149.   is a blank character. 
  14150.  
  14151. o hh represents the hour. 
  14152.  
  14153. o mm represents the minutes. 
  14154.  
  14155. o ss represents the seconds. 
  14156.  
  14157. o yyyy represents the year. 
  14158.  
  14159. o __ANSI__ is a macro defined when the &ansilvl.  language level is specified. 
  14160.  
  14161. o __COMPAT__ is a macro defined when the &saalvl.  language level is specified. 
  14162.  
  14163. o __EXTENDED__ is a macro defined when the &extlvl.  language level is 
  14164.   specified. 
  14165.  
  14166. o __MATH__The &xcomp. can generate substitute code for calls to some math 
  14167.   functions available in the standard C++ run-time libraries. The functions 
  14168.   handled this way are defined as inline routines in 
  14169.   /usr/lpp/xlC/include/math.h. 
  14170.  
  14171. o __STR__The &xcomp. can generate substitute code for calls to some string 
  14172.   functions available in the standard C++ run-time libraries. The functions 
  14173.   handled this way are defined as inline routines in 
  14174.   /usr/lpp/xlC/include/string.h. 
  14175.  
  14176.  
  14177. ΓòÉΓòÉΓòÉ 16.14.3. Restrictions ΓòÉΓòÉΓòÉ
  14178.  
  14179. Except for __MATH__ and __STR__, the predefined macro names cannot be the 
  14180. subject of a #define or #undef preprocessor directive. The preprocessor ignores 
  14181. any redefined macros and issues an error message. 
  14182.  
  14183.  
  14184. ΓòÉΓòÉΓòÉ 16.14.4. Notes ΓòÉΓòÉΓòÉ
  14185.  
  14186. These predefined macro names consist of two underscore ( __ ) characters 
  14187. immediately preceding the name, the name in uppercase letters, and two 
  14188. underscore characters immediately following the name (except for __cplusplus). 
  14189.  
  14190. The value of __LINE__ changes during compilation as subsequent lines of your 
  14191. source program are processed. Also, the values of __FILE__ and __TIMESTAMP__ 
  14192. change as any include files that are part of your source program are processed. 
  14193.  
  14194. The cout statements in the following program display the values of the 
  14195. predefined macros (__LINE__ , __FILE__ , __TIME__ , and __DATE__) and print a 
  14196. message indicating conformance to the ANSI C standard based on __STDC__ . 
  14197.  
  14198. :id='51V010ed'.
  14199. #include <iostream.h>
  14200. #if __STDC__
  14201. #    define CONFORM "conforms"
  14202. #else
  14203. #    define CONFORM "does not conform"
  14204. #endif
  14205. void main()
  14206. {
  14207.       cout << "Line "       << __LINE__
  14208.              << " of file "   << __FILE__
  14209.              << " has been executed.\n";
  14210.        cout << "This file was compiled on " <<
  14211. __DATE__
  14212.             << ".\n";
  14213.       cout << "This compiler "  << CONFORM
  14214.              << " to ANSI C standards.\n";
  14215. }
  14216.  
  14217.  
  14218. ΓòÉΓòÉΓòÉ 16.15. Related Information ΓòÉΓòÉΓòÉ
  14219.  
  14220. "Lexical Conventions". 
  14221.  
  14222.  
  14223. ΓòÉΓòÉΓòÉ 17. Appendix A. C-C++ Compatibility ΓòÉΓòÉΓòÉ
  14224.  
  14225. The differences between ANSI C and C++ fall into two categories: 
  14226.  
  14227. o Constructs found in C++ but not in ANSI C 
  14228. o Constructs found in both C++and ANSI C but treated differently in the two 
  14229.   languages. 
  14230.  
  14231. You can also return to the table of contents 
  14232.  
  14233.  
  14234. ΓòÉΓòÉΓòÉ 17.1. C[++] Constructs Not Found in ANSI C ΓòÉΓòÉΓòÉ
  14235.  
  14236. C++ contains many constructs that are not found in ANSI C. They include: 
  14237.  
  14238. o Single line comments beginning with // 
  14239.  
  14240. o Scope operator 
  14241.  
  14242. o Free store management using the operators new  and delete 
  14243.  
  14244. o Linkage specification for functions 
  14245.  
  14246. o Reference types 
  14247.  
  14248. o Default arguments for functions 
  14249.  
  14250. o Inline functions 
  14251.  
  14252. o Classes 
  14253.  
  14254. o Anonymous unions 
  14255.  
  14256. o Overloaded operators and functions 
  14257.  
  14258. o Class templates and function templates 
  14259.  
  14260. o Exception handling 
  14261.  
  14262.  
  14263. ΓòÉΓòÉΓòÉ 17.2. Constructs Found in Both C[++] and ANSI C ΓòÉΓòÉΓòÉ
  14264.  
  14265. Because C++ is based on ANSI C, the two languages have many constructs in 
  14266. common. The use of some of these shared constructs differs, as shown here. 
  14267.  
  14268.  
  14269. ΓòÉΓòÉΓòÉ 17.2.1. Character Array Initialization ΓòÉΓòÉΓòÉ
  14270.  
  14271. In C++, when you initialize character arrays, a trailing '\0' (zero of type 
  14272. char) is appended to the string initializer. You cannot initialize a character 
  14273. array with more initializers than there are array elements. 
  14274.  
  14275. In ANSI C, space for the trailing '\0' can be omitted in this type of 
  14276. initialization. 
  14277.  
  14278. The following initialization, for instance, is not valid in C++ : 
  14279.  
  14280. char v[3] = "asd"; // not valid in C++, valid in ANSI C
  14281.  
  14282. because four elements are required.This initialization produces an error 
  14283. because there is no space for the implied trailing '\0' (zero of type char). 
  14284. For more details, see "Array Initialization" 
  14285.  
  14286.  
  14287. ΓòÉΓòÉΓòÉ 17.2.2. Character Constants ΓòÉΓòÉΓòÉ
  14288.  
  14289. A character constant has type char in C++ and int in ANSI C. 
  14290.  
  14291.  
  14292. ΓòÉΓòÉΓòÉ 17.2.3. Class and typedef Names ΓòÉΓòÉΓòÉ
  14293.  
  14294. In C++, a class and a typedef  cannot both use the same name to refer to a 
  14295. different type within the same scope (unless the typedef is a synonym for the 
  14296. class name). In C, a typedef name and a struct tag name declared in the same 
  14297. scope can have the same name because they have different name spaces. For 
  14298. example: 
  14299.  
  14300. void main ()
  14301. {
  14302.      typedef double db;
  14303.      struct db; // error in C++, valid in ANSI C
  14304.  
  14305.      typedef struct st st; // valid ANSI C and C++
  14306. }
  14307.  
  14308.  
  14309. ΓòÉΓòÉΓòÉ 17.2.4. Class and Scope Declarations ΓòÉΓòÉΓòÉ
  14310.  
  14311. In C++, a class declaration introduces the class name into the scope where it 
  14312. is declared and hides any object, function, or other declaration of that name 
  14313. in an enclosing scope. In ANSI C, an inner scope declaration of a struct name 
  14314. does not hide an object or function of that name in an outer scope. For 
  14315. example: 
  14316.  
  14317. double db;
  14318. void main ()
  14319. {
  14320.      struct db // hides double object db in C++
  14321.      { char* str; };
  14322.      int x = sizeof(db);     // size of struct in C++
  14323.                     // size of double in ANSI C
  14324. }
  14325.  
  14326.  
  14327. ΓòÉΓòÉΓòÉ 17.2.5. const Object Initialization ΓòÉΓòÉΓòÉ
  14328.  
  14329. In C++, const objects must be initialized. In ANSI C, they can be left 
  14330. uninitialized. For more details, see "volatile and const Attributes" 
  14331.  
  14332.  
  14333. ΓòÉΓòÉΓòÉ 17.2.6. Definitions ΓòÉΓòÉΓòÉ
  14334.  
  14335. An object declaration, for example: 
  14336.  
  14337. int i;
  14338.  
  14339. is a definition in C++. In ANSI C it is a tentative definition. 
  14340.  
  14341. In C++, a global data object must be defined only once. In ANSI C, a global 
  14342. data object can be declared several times without using the extern keyword. 
  14343.  
  14344. In C++, multiple definitions for a single variable will cause an error. A C 
  14345. compilation unit can contain many identical tentative definitions for a 
  14346. variable. 
  14347.  
  14348. For  more details, see "Declarations" 
  14349.  
  14350.  
  14351. ΓòÉΓòÉΓòÉ 17.2.7. Definitions Within Return or Argument Types ΓòÉΓòÉΓòÉ
  14352.  
  14353. In C++, types may not be defined in return or argument types. ANSI C allows 
  14354. such definitions. For example, the declarations: 
  14355.  
  14356. void print(struct X { int i;} x); // error in C++
  14357. enum count{one, two, three} counter(); // error in C++
  14358.  
  14359. produce errors in C++ but are valid declarations in ANSI C. For more details, 
  14360. see "Function Declarations" , and "Calling Functions and Argument Passing" 
  14361.  
  14362.  
  14363. ΓòÉΓòÉΓòÉ 17.2.8. Enumerator Type ΓòÉΓòÉΓòÉ
  14364.  
  14365. An enumerator has the same type as its enumeration in C++. In ANSI C, an 
  14366. enumeration has type int. 
  14367.  
  14368.  
  14369. ΓòÉΓòÉΓòÉ 17.2.9. Enumeration Type ΓòÉΓòÉΓòÉ
  14370.  
  14371. The assignment to an object of enumeration type with a value that is not of 
  14372. that enumeration type will produce an error in C++. In ANSI C, an object of 
  14373. enumeration type can be assigned values of any integral type. 
  14374.  
  14375.  
  14376. ΓòÉΓòÉΓòÉ 17.2.10. Function Declarations ΓòÉΓòÉΓòÉ
  14377.  
  14378. In C++, all declarations of a function must match the unique definition of a 
  14379. function. ANSI C has no such restriction. For more details, see "Function 
  14380. Declarations" 
  14381.  
  14382.  
  14383. ΓòÉΓòÉΓòÉ 17.2.11. Functions With an Empty Argument List ΓòÉΓòÉΓòÉ
  14384.  
  14385. Consider the following function declaration: 
  14386.  
  14387.      int f();
  14388.  
  14389. In C++, this function declaration means that the function takes no arguments. 
  14390. In ANSI C, it could take any number of arguments, of any type. 
  14391.  
  14392.  
  14393. ΓòÉΓòÉΓòÉ 17.2.12. Global Constant Linkage ΓòÉΓòÉΓòÉ
  14394.  
  14395. In C++, an object declared const has internal linkage, unless it has previously 
  14396. been given external linkage. In ANSI C, it has external linkage. For more 
  14397. details, see "Program Linkage" 
  14398.  
  14399.  
  14400. ΓòÉΓòÉΓòÉ 17.2.13. Jump Statements ΓòÉΓòÉΓòÉ
  14401.  
  14402. C++ does not allow you to jump over declarations containing initializations. 
  14403. ANSI C does allow you to use jump statements for this purpose. For more 
  14404. details, see "Initialization within Compound Statements" 
  14405.  
  14406.  
  14407. ΓòÉΓòÉΓòÉ 17.2.14. Keywords ΓòÉΓòÉΓòÉ
  14408.  
  14409. C++ contains some additional keywords not found in ANSI C. ANSI C programs that 
  14410. use these keywords as identifiers are not valid C++ programs: le cols='* * * * 
  14411. *'. asm friend operator public throw catch inline private template try class 
  14412. new protected this virtual delete :exmp.