C++的类(1)

_C++ Primer Plus_Chap10_Compiler-DevC++_

一、理解书中函数(P.343)

①stock.h_在头文件中定义类

 1 #ifndef STOCK00_H_  //ifndef防止双重定义
 2 #define STOCK00_H_
 3
 4 #include <string>
 5
 6 class Stock //Stock即新类类型名
 7 {
 8     private:  //使用该类的程序必须通过public成员函数(或友元函数,见chap11)才能访问private部分
 9         std::string company;
10         long shares;  //股票数量
11         double share_val;  //股票价格
12         double total_val;  //股票总价
13         void set_tot() {total_val=shares*share_val;}
14     public:  //使用该类的程序皆可直接访问public部分
15         void acquire(const std::string & co,long n,double pr);
16         void buy(long num,double price);
17         void sell(long num,double price);
18         void update(double price);
19         void show();
20 };  //别忘了class花括号后有";"
21
22 #endif
23
24 /*还有第三种访问控制关键字protected,见后续chap13*/ 

②stock.cpp_类成员函数的实现

 1 /***类成员函数的实现***/
 2 /*类成员函数头使用作用域运算符解析(::)来标识归属*/
 3 /*如update()成员函数的函数头:void Stock::update(double price),标识符update()具有类作用域*/
 4 /*这种表示方法意味着可以将另一个累的成员函数命名为同名的update()*/
 5 /*与update()同属一类的其他成员函数可以不经(::)访问它,在类之外使用update()则需要其他措施(待续)*/
 6 /***类的实现***/
 7
 8 #include <iostream>
 9 #include "stock.h"
10
11 /*aquire管理对某公司股票的首次购买*/
12 void Stock::acquire(const std::string & co,long n,double pr)
13 {
14     company=co;
15     if(n<0)
16     {
17         std::cout<<"Number of shares can‘t be negative,"
18                  <<company<<"shares set to 0.\n";
19         shares=0;
20     }
21     else
22         shares=n;
23     share_val=pr;
24     set_tot();
25 }
26
27 /*buy和sell管理增加和减少持有的股票*/
28 void Stock::buy(long num,double price)
29 {
30     if(num<0)
31     {
32         std::cout<<"Number of shares perchased can‘t be negative,"
33                  <<"Transaction is aborted.\n";
34     }
35     else
36     {
37         shares+=num;
38         share_val=price;
39         set_tot();
40     }
41 }
42
43 /*sell管理售出股票*/
44 void Stock::sell(long num,double price)
45 {
46     using std::cout;
47     if(num<0)
48     {
49         cout<<"Number of shares sold can‘t be negative."
50             <<"Transaction is aborted.\n";
51     }
52     else if(num>shares)
53         cout<<"You can‘t sell more than you have."
54             <<"Transaction is aborted.\n";
55     else
56     {
57         shares-=num;
58         share_val=price;
59         set_tot();
60     }
61 }
62
63 /**/
64 void Stock::update(double price)
65 {
66     share_val=price;
67     set_tot();
68 }
69
70 /**/
71 void Stock::show()
72 {
73     std::cout<<"Company:"<<company
74              <<" Shares:"<<shares<<‘\n‘
75              <<"Share Price:$"<<share_val
76              <<" Total Worth:$"<<total_val<<‘\n‘;
77 }
78 

→注意上述类中一成员函数“set_tot”,在头文件中对其进行了定义,并在之后stock.cpp中的四个其他成员函数中对其进行了调用。这里涉及到内联函数知识:

①对于定义位于类声明中的函数,它们都将自动生成内联函数,Stock::set_tot即是一个内联函数。亦可在类声明外定义内联函数,此时只要在定义时使用inline既定符即可;

②内联函数在编译时不进行真正的调用,编译器将内联函数代码粘贴在调用(形式上称为调用)处,即在每个使用它的地方插入全部算法而不是真正的将函数地址传过去的调用;

③内联函数通常是小内存的函数,其的作用——如上例中的set_tot(),节省了在每个调用它的成员函数中重复输入重置total的公式,有效地节省了时间提高效率。

③usestock.cpp_使用类

 1 #include <iostream>
 2 #include "stock.h"
 3 int main()
 4 {
 5     Stock mc;
 6     mc.acquire("NanoSmart",20,12.50);
 7     mc.show();
 8     mc.buy(15,18.125);
 9     mc.show();
10     mc.sell(400,20.00);
11     mc.show();
12     mc.buy(300000,40.125);
13     mc.show();
14     mc.sell(300000,0.125);
15     mc.show();
16     return 0;
17 }

④运行结果

与书本无异。

时间: 2024-10-07 02:12:01

C++的类(1)的相关文章

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术

iOS -- SKScene类

SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKScene.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开

iOS -- SKPhysicsWorld类

SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKPhysicsWorld.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术文档.虽然已经审阅了本文档的技术准确性,但是它不是最终的版本.本机密信息仅适用于

C#嵌套类

嵌套类顾名思义就是类或者结构中定义的类 class Container { class Nested { Nested() { } } } <1>嵌套类的默认访问权限是private ,可以指定为public,protected,private,internal,protected internal.<2>嵌套类型可以访问外部类(包裹嵌套类的类),如果要访问外部类型,要把外部类通过构造函数传进一个实例<3>嵌套类中只能访问外部类中的静态成员,不能直接访问外部类的非静态成

一个实用的C#网页抓取类代码分享

一个实用的C# 网页抓取类 模拟蜘蛛,类中定义了超多的C#采集文章.网页抓取文章的基础技巧,下面分享代码: using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using Sys

类图(Rose) - Windows XP经典软件系列

最近开始了自己高级数据结构之旅,在这次旅行中,我将持续把一些高级的数据结构从理论到编码都过一遍,同时通过博客形式分享出来,希望大家指出不足之处! 二叉排序树是一种动态排序的数据结构,支持插入.删除.查找等操作,且平均时间复杂度为O(log(N)),但是普通二叉排序树不能保证树退化为一颗分支的情况,此时最坏情况下的时间复杂度为O(N).此时,平衡二叉树的产生了.平衡二叉树是一种动态调整平衡的数据结构,但理想的平衡二叉树很难,于是人们使用AVL.红黑树.Treap.伸展树等来替代平衡二叉树,这些数据

java 类对象使用

在学习反射机制时,总结一下获得类对象方式: 第一种方式:通过类本身来获得对象 Class<?> classname = this.getClass(); 或者this.class 第二种方式:通过子类的实例获取父类对象 ClassName cn = new ClassName(); UserClass = cn.getClass(); Class<?> SubUserClass = UserClass.getSuperclass(); 第三种方式:通过类名加.class获取对象 C

Python-class类的相关总结

在Python中,所有的数据类型都可以视为对象,自定义的对象数据类型就是面向对象中的类(class)的概念. 面向对象编程:object oriented programming简称OOP. 1 ###简单举例,以登记学生的姓名和成绩举例 2 #!/usr/bin/python 3 #-*- coding:utf-8 -*- 4 class Student(object): ##定义student类 5 def __init__(self, name, score): ##__init__可以绑

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中