本篇算是学习c++有关类的知识的一些易错点吧.....

并不是特别详细,以后会更新吧....

几点并不关于类的东西

1.函数模板,用虚拟类型来实现模板的功能

  1. #include<iostream>
  2. using namespace std;
  3. template <typename t>//t为虚拟类型的名字,自己起的
  4. t maxx(t a,t b,t c)
  5. {
  6. return max(a,max(b,c));
  7. }
  8.  
  9. int main()
  10. {
  11. double a=1.1,b=2.2,c=3.3;//不管为double 还是int都可以调用maxx
  12. cout<<maxx(a,b,c)<<endl;
  13. int a1=,b1=,c1=;
  14. cout<<maxx(a1,b1,c1)<<endl;
  15. }

2.关于函数默认的参数值要放到最右边

  1. void f1(float a,int b=,int c,char d='a');//错误,
  2. void f2(float a,int c,int b=,char d='a');//正确

3.内置函数

函数最左边加上inline(我觉得没啥用),规模很小的函数才用

4.字符串

sizeof(string) 为4,因为系统分配的是固定的字节数,存放的是字符串的地址

.......(以后再补充把)

开始类的学习

1.三种类的类型

public

这个就不多说了,类的对外接口

private

想要访问只能通过该类中的函数来访问

protected

和private差不多,区别在于继承时,以后说

2.类的声明和成员函数的分离(以后更新)

3.构造函数

没有返回值,名字和类名字一样#include<iostream>

  1. using namespace std;
  2. class box{
  3. public:
  4. box(int ,int ,int );//构造函数 (有无默认参数都行)
  5. int volume();
  6. private:
  7. int h;
  8. int w;
  9. int l;
  10. };
  11. box::box(int a,int b,int c)
  12. {
  13. h=a,w=b,l=c;
  14. }
  15. //其实一般这样写
  16. // box::box(int a,int b,int c):h(a),w(b),l(c){}
    //注意如果是数组的话 则要写在大括号内
    //box::box(int a,int b,int c,char nam[]):h(a),w(b),l(c)
    //{strcpy(name,nam);}
  1.  

可以用另一个对象初始化另一个

time t1;

time t2=t1;   //注意是吧t1的数据成员复制到t2,而不调用t2的构造函数

4.析构函数

注意一点,先构造的后析构,相当于栈,先进后出

静态局部对象,在函数结束时,并不释放,也就不调用析构函数

5.对象数组

box b[3] = (1 , 2 ,3)//这样其实不对,这三个实参则分别作为3个元素的第一个实参

初始化应该

  1. box a[]={
  2. box(,,);
  3. box(,,);
  4. box(,,);
  5. }

6.对象指针

先说下函数指针。。。。还有函数指针????

类型名(* 指针变量名)(参数列表)

  1. void (* p)();//p是一个指向void型函数的指针
  2. p=fun;//fun函数入口地址付给p 注意没有括号
  3. (*p)();

对象成员函数有些复杂

要求    函数参数类型和个数匹配        函数返回值类型一样     所属的类一样

void ( time:: *p )();//此时p为指向time类中的成员函数指针

  1. time t;
  2. void (time:: *p)();
  3. p = &time::gettime();
  4. (t.*p)();

7.this指针(指向当前对象)

当前被调用的成员函数所在对象的起始地址

  1. int box::volume()
  2. {return (h*l*w);}//实际为{ return this->h * this->l * this->w;}

调用时 如 a.volume() ,实际为将对象a的地址传给形参this指针

8.常对象
只能通过构造函数参数表来对其初始化,所有数据成员绝对不能被改变,并且只能调用它的常成员函数
如果非要改变,要加上 mutable 如有一个计数变量count, 则要 mutable int count;

非const数据成员 非const函数可引用和改变 const函数可引用不可改变
const数据成员 非const函数可引用不可改变 const函数可引用不可改变
const函数不可调用非const函数

常指针 如
Time t1;
Time * const p = =&t1;
p不可再改变
常变量只能被常指针指向,,
普通变量也可被常指针指向,但这时该普通变量就在这期间变成的常变量,不能改变

复制构造函数
Box box2(box);

9.静态数据成员

数据声明前 加 static
特点是可以被每个该同类对象所引用,只能在类体外进行初始化,在类外也可直接引用
如 int Box::height = 10;//不必加static
可以通过对象名来引用,也可以通过类名

cout<<a.count<<endl;
cout<<Box::count<<endl;

10.友元
友元函数可以使一般的,也可以是另一个类中的,可以访问私有数据成员
友元类就是全家都是友元函数
注意是单向的,注意不能传递

11.类的模板

  1. temple<class t>//t 为虚拟变量名字 可以有多个,但都要加class 如:temple<class t1,class t2>
  2. class compare{
  3. public:
  4. compare(t a,t b)
  5. {
  6. x=a,y=b;
  7. }
  8. t max() {
  9. return max(a,b);
  10. }
  11. private:
  12. t x,y;
  13. };

定义对象时为:
compare<int> cmp(3,4);
//多个时 compare<int ,double> cmp(3,4);

12.对运算符的重载

  1. class yuan{
  2. public:
  3. yuan(double a,double b):x(a),y(b){};
  4. yuan operator +(yuan &t)
  5. {
  6. return yuan(x+t.x, y+t.y);
  7. }
  8. private:
  9. double x,y;
  10. };

此时如果有
yuan c1(1,2),c2(1,2),c3;
c3 = c1 + c2;
则实际为 c3 = c1.operator(c2);

但其实我觉得更方便的是通过友元函数

  1. class yuan{
  2. public:
  3. yuan(double a,double b):x(a),y(b){};
  4. friend yuan operator +(yuan &t1,yuan &t2)//这个其实挺灵活的,可以自行改变
  5. {
  6. return yuan(t1.x+t2.x, t1.y+t2.y);
  7. }
  8. private:
  9. double x,y;
  10. };

c3 = c1 + c2 则解释为operator +(c1,c2);

13.继承

派生类拥有基类的数据成员,其分配如下

先说公有继承

基类属性                               派生类

private                                  不可访问

public          公有继承后        public

protected                            protected

私有继承

基类属性                               派生类

private                                  不可访问

public          私有继承后        private

protected                            private

保护继承

保护成员:只有子女(派生类)可以访问,(友元函数也不行)

基类属性                               派生类

private                                  不可访问

public          保护继承后        protected

protected                            protected

14.有子对象的派生构造函数

  1. #include<iostream>
  2. using namespace std;
  3. class Student{
  4. public:
  5. void display();
  6. Student(int n,string nam):num(n),name(nam){}
  7. protected:
  8. int num;
  9. string name;
  10. };
  11. class Student1: public Student{
  12. public:
  13. Student1(int n,string nam,int n1,string nam1,int a,string ad):
  14. Student(n,nam),monitor(n1,nam1),age(a),addr(ad){}//注意初始化,一般用初始化表来 ,同样的,在多级派生中也是如此来构造
  15. void show()
  16. {
  17. monitor.display();
  18. }
  19. protected:
  20. Student monitor;//派生类中的子对象
  21. int age;
  22. string addr;
  23. };
  24. int main()
  25. {
  26.  
  27. }

多级的形式

派生类构造名: 基类1构造函数(参数表) , 基类2构造函数(参数表) , 基类3构造函数(参数表)

{  派生类中新增的数据成员初始化语句 }

15 . 关于多重继承的二义性问题

就是继承的函数名  和   派生的函数名一样了

假设有类A和类B,此时类C同时继承类A和类B,现在问题是  类A 类B  类C都有一个  叫display()的函数

C c1;

c1.display()//此时该是谁呢,是最新的也就是c的display()。这个会覆盖

此时要想访问A的display(),则要限定作用域 。

比如  c.A::display();

16.虚基类

D 是 B 和 C 的派生类,B 和 C 又都是继承了A,这样会保留多份数据成员的拷贝

虚基类是的在继承简介共同基类时只保留一份

  1. class A
  2. {
  3. A(int i){}
  4. .....
  5. };
  6. class B: virtual public A
  7. {
  8. B(int n):A(n){}
  9. ...
  10. };
  11. class C: virtual public A
  12. {
  13. C(int n):C(n){}
  14. ...
  15. };
  16. class D:public B,public C
  17. {
  18. D(int n):A(n),B(n),C(n){}//这个必须由最后的派生类中对直接基类和虚基类初始化
  19. }

17.类型的转化

派生类可以向基类对象赋值  (大材小用),也可以向积累对象的引用进行赋值或初始化

派生类对象的地址可以赋给基类对象的指针变量,也就是说,指向基类对象的指针变量也可以用来指向派生类对象

18.多态性

分为两种 ,静态多态性和动态多态性(啥玩意啊,玩的怪花(小声bb))

静态多态性 就是  函数重载   和运算符的重载

动态  就是通过虚函数来实现的

说一下虚函数,作用还是要解决继承中的二义性问题,

解决方法是想通过指针的方法来实现

  1. Student stu(...);
  2. Graduate grad(...);//假设grad是stu的派生,且两者都有display函数
  3. Student *p = &stu;
  4. p->display();
  5. p = &grad;//想通过变换指针指向来,但单单的这样做是不行的,因为这样做会把grad类型强制转化成student的类型
  6. p->display();

解决上述问题的方法是将Student类中的display()函数前加上virtual

  注意问题是  成原函数 定义为虚函数后,其派生类都为虚函数

  使用方法是指向一个基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象

 

19.虚析构函数

如下面代码

  1. class Point{
  2. public:
  3. point();
  4. ~point();
  5. };
  6. class Circle: public Point
  7. {
  8. public:
  9. Circle();
  10. ~Circle();
  11. }
  12. int main()
  13. {
  14. Point *p = new Circle;
  15. delete p;
  16. return ;
  17. }

new的一个对象,在释放的时候,只会执行基类的析构函数,而不执行派生类的

解决方法是  在Point 的析构函数前加上 virtual

个人理解(这个virtual  在继承中 都会遗传)

20.纯虚函数

先说一点吧,往往有一些类,他们不用来生成对象,唯一目的就是用它去建立派生类,叫做抽象类

比如,点 可以派生出 园 ,圆可以派生出圆柱体  ,但这些都是 shape 的直接派生或者间接派生

比如

  1. class Shape{
  2. public:
  3. virtual float area() const {return 0.0;}//虚函数
  4. virtual float volume() const {return 0.0;}//虚函数
  5. virtual void shapeName() const = ; // 纯虚函数 形式为 virtual 函数类型 函数名字 (参数列表) =0;
  6. };

最后来个差不多的

  1. #include<iostream>
  2. using namespace std;
  3. class Shape
  4. {
  5. public:
  6. virtual float area() const {return 0.00;}
  7. virtual float volume() const {return 0.00;}
  8. virtual void ShapeName() const = ;
  9. };
  10. class Point: public Shape
  11. {
  12. public:
  13. Point(float a=,float b=): x(a), y(b){};
  14. void SetPoint(float a,float b)
  15. {
  16. x=a,y=b;
  17. }
  18. float getX() const {return x;}
  19. float getY() const {return y;}
  20.  
  21. virtual void ShapeName() const {cout<<"point"<<endl;}
  22. friend ostream &operator <<(ostream &,const Point &);
  23. protected:
  24. float x,y;
  25. };
  26. ostream &operator <<(ostream &output,const Point &p)
  27. {
  28. output<<"["<<p.x<<","<<p.y<<"]"<<endl;
  29. return output;
  30. }
  31. class Circle: public Point
  32. {
  33. public:
  34. Circle(float x=,float y=,float r=):Point(x,y),radius(r) {}
  35.  
  36. void SetRaidus(float r){ radius = r;}
  37.  
  38. float GetRadius() const {return radius;}
  39.  
  40. virtual float area() const{ return 3.14 * radius * radius;}
  41.  
  42. virtual void ShapeName() const {cout<<"Circle"<<endl;}
  43.  
  44. friend ostream &operator <<(ostream &,const Circle &);
  45. protected:
  46. float radius;
  47. };
  48. ostream &operator <<(ostream &out,const Circle &c)
  49. {
  50. out<<"["<<c.x<<" "<<c.y<<"]"<<endl;
  51. out<<"r="<<c.radius<<endl;
  52. return out;
  53. }
  54. class Yuan: public Circle
  55. {
  56. public:
  57. Yuan(float x=,float y=,float r=,float h=):Circle(x,y,r),height(h){}
  58.  
  59. void SetHeight(float h) {height = h;}
  60.  
  61. virtual float area() const {return * Circle::area() + * 3.14 * radius * height;}
  62.  
  63. virtual float vulume() const {return Circle::area() * height;}
  64.  
  65. virtual void ShapeName() const {cout<<"Yuan"<<endl;}
  66.  
  67. friend ostream &operator <<(ostream &,const Yuan &);
  68. protected:
  69. float height;
  70. };
  71. ostream & operator <<(ostream &out,const Yuan &Y)
  72. {
  73. out<<"["<<Y.x<<" "<<Y.y<<"],r="<<Y.radius<<"H="<<Y.height<<endl;
  74. return out;
  75. }
  76.  
  77. int main()
  78. {
  79. Point point (3.2,4.5);
  80. Circle circle(2.4,1.2,5.6);
  81. Yuan yuan(3.4,6.4,5.2,10.5);
  82. point.ShapeName();
  83. cout<<point<<endl;
  84.  
  85. circle.ShapeName();
  86. cout<<circle<<endl;
  87.  
  88. yuan.ShapeName();
  89. cout<<yuan<<endl;
  90.  
  91. Shape *pt;
  92. pt=&point;
  93. pt->ShapeName();
  94.  
  95. pt=&circle;
  96. pt->ShapeName();
  97. pt=&yuan;
  98. pt->ShapeName();
  99. return ;
  100. }

可能以和还会更新吧..............

c++面向对象程序设计总结(类的使用)的更多相关文章

  1. Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

    一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...

  2. python程序设计——面向对象程序设计:类

    理解面向对象 基本原则是,计算机程序由多个能够起到子程序作用的单元或对象组合而成 关键性观念是,数据以及对数据的操作封装在一起,组成一个相互依存.不可分割的整体,即对象 python面向对象特性 完全 ...

  3. 20175333曹雅坤 实验二 Java面向对象程序设计

    实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...

  4. [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图

    [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...

  5. [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类

    [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...

  6. [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类

    [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...

  7. Java第7次作业:造人类(用private封装,用static关键字自己造重载输出方法)什么是面向对象程序设计?什么是类和对象?什么是无参有参构造方法 ?什么是封装?

    什么是面向对象程序设计? 我们称为OOP(Object  Oriented  Programming) 就是非结构化的程序设计 要使用类和对象的方法来进行编程 什么是类,什么是对象 类就是封装了属性和 ...

  8. 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识

    Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍. 一.    类和对象(实例) 在面向对象的程序设计(OOP)过程中有两个重要概念 ...

  9. [.net 面向对象程序设计深入](0) 开篇

    [.net 面向对象程序设计深入](0)开篇        [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...

  10. [.net 面向对象程序设计进阶] (1) 开篇

    [.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...

随机推荐

  1. 转载】JQuery中如何传递参数如click(),change()等具体实现

    转载地址:http://www.jb51.net/article/36249.htm 有个需求让两个select中option相互转换,这个作业就是给几个按钮添加click()事件接下来为大家介绍下如 ...

  2. HAproxy.md

    HAProxy HAProxy是什么 HAProxy(High Available Proxy)是基于四层和七层的高可用负载均衡代理服务器,配置简单.支持多达上万条并发请求. HAProxy工作原理 ...

  3. cocos2d-x(十一)Lua开发飞机大战-6-加入子弹

    接下来我们为飞机加入子弹,首先创建一个BulletLayer: module("BulletLayer",package.seeall) local bulletBatchNode ...

  4. hdu 4803 Poor Warehouse Keeper(贪心+数学)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/26005267 题目链接:hdu 4803 P ...

  5. Day1 Mybatis初识(一)

    框架 将重复的,繁琐的代码实现封装,让程序员将更多的精力放在业务的理解和分析上. 框架的作用 提高开发效率 隐藏细节 三大框架SSH  -->   SSM 1)        表述层:   用户 ...

  6. 跳转到appstore下载app的链接 记录一下

    这是链接: https://itunes.apple.com/cn/app/da-dou-dou-lao-shi/id1395835036?mt=8 其中值得一提的是mt参数是啥意思 见下图:

  7. C语言程序设计I—第九周教学

    第九周教学总结(28/10-03/11) 教学内容 第三章 分支结构 3.3 查询自动售货机中商品的价格 课前准备 在蓝墨云班课发布资源: PTA:2018秋第九周作业1 3.3 分享码:530571 ...

  8. 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  9. Linux内存调试工具初探-MEMWATCH(转)

    C 语言作为 Linux 系统上标准的编程语言给予了我们对动态内存分配很大的控制权.这种自由可能会导致严重的内存管理问题,可能导致程序崩溃或随时间的推移导致性能降级. 内存泄漏(即 malloc()  ...

  10. .NET Core中多语言支持

    在.NET Core项目中也是可以使用.resx资源文件,来为程序提供多语言支持.以下我们就以一个.NET Core控制台项目为例,来讲解资源文件的使用. 新建一个.NET Core控制台项目,然后我 ...