对于类,其结构并不难,但要理解其设计思想也并不容易,在此,我们可以通过下面的代码进一步理解和使用类:

 1 # ifndef VECTOR_H_
 2 # define VECTOR_H_
 3 # include "iostream"
 4
 5 namespace VECTOR //注意,这里对这个类定义了名称空间,实际上,在写自己的类时,也应该定义自己的名称空间
 6 {
 7     class Vector
 8     {
 9     public:
10         enum Mode{RECT,POL};//因为这个量需要用户自己去设定
11     private:           //注意:私有成员(无论是函数还是变量)只能被类内部成员访问
12         double x;
13         double y;
14         double mag;
15         double ang;
16         Mode mode;
17
18         void set_mag();
19         void set_ang();
20         void set_x();
21         void set_y();   //体会将这些函数放在这里的用意!!
22     public:             //共有成员可以被所有访问!!理解这个意思
23         Vector();//构造函数
24         Vector(double n1,double n2,Mode form = RECT);//注意,这里有默认参数
25         void reset(double n1, double n2, Mode form = RECT);
26         ~Vector();//析构函数
27         double xval() const{ return x; }
28         double yval() const{ return y; }
29         double magval() const{ return mag; }
30         double angval() const{ return ang; }
31         void polar_mode();
32         void rect_mode();
33
34         Vector operator+(const Vector &b) const;
35         Vector operator-(const Vector &b) const;
36         Vector operator-() const;
37         Vector operator*(double n) const;
38
39         friend Vector operator*(double n, const Vector &a);//注意这里采用了友元函数的做法,应该显示包含所有参数
40         friend std::ostream & operator<<(std::ostream &os, const Vector & v);//昨天没有思考返回引用是否存在问题???因为局部变量被销毁的问题
41     };
42
43 }
44 # endif

该类定义中:除了备注的一些以外,总结这么几点:

1 定义了一个类的时候,限定了该类的名称空间通常是一件好事,以免自己的变量和别人的发生了冲突

2   公有还是私有并无界限之分,完全取决于程序的功能。

3  我们通常会发现:当定义一个类成员函数时,通常需要:构造函数,析构函数,甚至友元函数

4  私有成员(无论是变量还是函数)只能被类内部的成员进行访问,而共有成员 可以被其他类甚至其他任何东西访问。究其本质:公有部分 是提供的接口

下面给出该定义:

  1 # include"cmath"  //从下文的调用方法来看,这里应该是函数库,而不是类库
  2 # include "vector.h"
  3 using std::sqrt;   //注意 std 包含了很多
  4 using std::sin;
  5 using std::cos;
  6 using std::atan;
  7 using std::atan2;
  8 using std::cout;
  9
 10 namespace VECTOR  //名称空间的意义是很有必要的
 11 {
 12     const double Rad_to_deg = 45.0 / atan(1.0);
 13     void Vector::set_ang()
 14     {
 15         mag = sqrt(x*x + y*y); //求极长
 16     }
 17
 18     void Vector::set_ang()
 19     {
 20         if (x == 0.0  && y == 0.0)
 21             ang = 0.0;
 22         else
 23             ang = atan2(y, x);//求极角
 24     }
 25
 26     void Vector::set_x() //这些是私有函数
 27     {
 28         x = mag*cos(ang);//私有函数可以访问私有变量表明私有成员也可以相互访问
 29     }
 30
 31     void Vector::set_y()
 32     {
 33         y = mag*sin(ang);
 34     }
 35
 36     Vector::Vector()
 37     {
 38         x = y = mag = ang = 0.0;
 39         mode = RECT;
 40     }
 41
 42     Vector::Vector(double n1, double n2, Mode form)
 43     {
 44         mode  = form;
 45         if (form == RECT)
 46         {
 47             x = n1;
 48             y = n2;
 49             set_mag();//访问了私有成员
 50             set_ang();//体会这里的设计思想
 51         }
 52         else if (form == POL)
 53         {
 54             mag = n1;
 55             ang = n2;
 56             set_x();
 57             set_y();
 58         }
 59         else
 60         {
 61             cout << "Incorrect 3rd argument to Vector()--";
 62             cout << "vector set to 0\n";
 63             x = y = mag = ang = 0.0;
 64             mode =RECT;
 65         }
 66     }
 67     void Vector::reset(double n1, double n2, Mode form)
 68     {
 69         mode = form;
 70         if (form = RECT)
 71         {
 72             x = n1;
 73             y = n2;
 74             set_mag();
 75             set_ang();
 76         }
 77         else if (form = POL)
 78         {
 79             mag = n1;
 80             ang= n2;
 81             set_x();
 82             set_y();
 83         }
 84         else
 85         {
 86             cout << "Incorrect 3rd argument to Vector()--";
 87             cout << "vector set to 0\n";
 88             x = y = mag = ang = 0.0;
 89             mode = RECT;
 90         }
 91     }
 92     Vector::~Vector()//
 93     {
 94
 95     }
 96
 97     void Vector::polar_mode()
 98     {
 99         mode = POL;
100     }
101
102     void Vector::rect_mode()
103     {
104         mode = RECT;
105     }
106
107     Vector Vector::operator+(const Vector &b) const
108     {
109         return Vector(x + b.x, y + b.y);
110     }
111
112     Vector Vector::operator-(const Vector &b) const
113     {
114         return Vector(x - b.x, y - b.y);
115     }
116
117     Vector Vector::operator-() const
118     {
119         return Vector(-x, -y);
120     }
121 
        Vector Vector::operator*(double n) const
        {          return(n*x,x*y)        }

122     Vector operator*(double n, const Vector & a)
123     {
124         return a*n; //注意,虽然这里进行了返回,但并没有结束,而是继续调用了成员函数,
125     }
126
127     std::ostream & operator<<(std::ostream & os, const Vector & v)
128     {
129         if (v.mode == Vector::RECT)
130             os << "(x,y) = (" << v.x << "," << v.y << ")";
131         else if (v.mode == Vector::POL)
132         {
133             os << "(m,a) = (" << v.mag << "," << v.ang + Rad_to_deg << ")";
134         }
135         else
136             os << "Vector object mode is invalid";
137     }
138 }

1.  我们注意107行和112行的代码:本质上,进行了加法和减法之后,得到的是一个新的类对象,但由于这个类对象不止一种表示形式(直角坐标和极坐标),这里巧妙的利用了 返回构造函数的执行。这告诉我们:构造函数并不仅仅用于初始化,构造函数的本意:构造新的对象,一定要认识这一本质特征和思想。

2  我们注意124行的代码:return a*n; 本质上,对象乘以一个数无法实现,但这里,其实,并没有返回,而是回去重新调用了上面的*。

3 注意:129行和131行:if (v.mode == Vector::RECT)。为何要加Vector::RECT而不是RECT,这是因为:

友元函数虽然在public中,但友元函数并不在类作用域中!!! 这对于所有友元函数都成立!!!

转载于:https://www.cnblogs.com/shaonianpi/p/9943993.html

c++入门之 再话类相关推荐

  1. JDBC学习笔记01【JDBC快速入门、JDBC各个类详解、JDBC之CRUD练习】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  2. Python面向对象——面向对象介绍、实现面向对象编程、定义类、再调用类产生对象、总结__init__方法、查找顺序

    文章目录 面向对象介绍 实现面向对象编程 一:先定义类 二:再调用类产生对象 总结__init__方法 查找顺序 面向对象介绍 ''' 面向过程:核心是"过程"二字过程的终极奥义就 ...

  3. Java面向对象编程入门练习:Manager类继承Employee类并实现求得员工平均业绩

    Java面向对象编程入门练习:Manager类继承Employee类并实现求得员工平均业绩 请定义一个Manager类,该类继承Employee类,并定义两个变量及一个构造方法,两个变量:depart ...

  4. html中怎么写小箭头,HTML+CSS入门 CSS用伪类制作小箭头

    本篇教程介绍了HTML+CSS入门 CSS用伪类制作小箭头,希望阅读本篇文章以后大家有所收获,帮助大家HTML+CSS入门. < 本文对轮播图左右按钮的处理方法一改往常,不是简单地用btn.pr ...

  5. 拯救pandas计划(22)——再话extract和extractall

    拯救pandas计划(22)--再话extract和extractall 最近发现周围的很多小伙伴们都不太乐意使用pandas,转而投向其他的数据操作库,身为一个数据工作者,基本上是张口pandas, ...

  6. 快速入门开发实现订单类图片识别结果抽象解析

    一.背景 面对订单数据纸质文件或图片,仅靠人眼识别的话效率很低,需引入机器学习来识别和解析图片以提高效率.当前市面上已有收费的图片识别服务,包括阿里.百度等,识别效果较好,但针对订单类图片,不仅要关注 ...

  7. C++入门>>初识类

    文章目录 前言: 认识面向过程与面向对象 封装 浅谈C的结构体与C++类 类与对象–上篇 class的引入 类的定义 类中的限定符 类的实例化 如何计算类的大小 隐形的this指针!!!!非常重要 t ...

  8. RxJava 教程第一部分:入门之 关键的类

    原文出处:http://blog.chengyunfeng.com/?p=948#ixzz4KaT7AZOW Rx 有两个最基础的类型,和其他一些扩展这两种类型的类.两个核心的类为: Observab ...

  9. Visual C++ 2008入门经典 第九章类的继承和虚函数

    // 第九章类的继承和虚函数 //.cpp: 主项目文件. //1 继承如何与面向对像的编程思想适应 //2 根据现有类定义新类 //3 使用protected关键字为类成员指定新的访问特性 //4 ...

最新文章

  1. gdb图形化调试工具总结
  2. IDEA 13 tomcat 进行远程调试
  3. CentOS 6.5下SSH总提示Warning: Permanently added '****' (RSA) to the list of known hosts.
  4. Elastic 使用Heartbeat监测服务运行状态
  5. 标题在图表上_用图表说话——漫谈商务图表的设计理念
  6. MYSQL5.7---ONLY_FULL_GROUP_BY 异常处理
  7. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
  8. The Maven Integration requires that Eclipse be running in a JDK……
  9. Android学习——写个小实例
  10. 备战2019秋招之程序员代码面试指南(左程云)C++
  11. Python学习(52周存钱)
  12. 后台提示登录失败----YYC松鼠短视频开源
  13. 1109 Group Photo (25分)/1055 集体照 (25分)后三个测试点
  14. Window设置开机自启软件的几种方式
  15. “缴费”和“交费”的区别
  16. uboat-slitaz 中文 美化 uboat定制版 基于xorg
  17. 【VMware】下安装OSX10.10-Yosemite【Mac】系统
  18. latex 行内公式和行间公式高亮问题、多行高亮问题
  19. 1998ieee圆周率c语言,华人留学生开发首个古汉语编程语言,实现易经算命、圆周率计算,Github获赞14.7k...
  20. 计算机系迎新晚会策划,学院迎新晚会活动方案

热门文章

  1. 《Java程序员,上班那点事儿》书名的由来
  2. ROS系统 常用命令行工具的使用
  3. bobo老师机器学习笔记1.1 - 什么是机器学习
  4. mysql的in和not in的用法(特别注意not in结果集中不能有null)
  5. JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用
  6. 纸牌游戏——小猫钓鱼
  7. Java IO学习笔记(四)打印流
  8. Java 加密 AES 对称加密算法
  9. 【编程题】简单的四则运算
  10. 单词前后位置颠倒,大小写颠倒