c++面向对象程序设计总结(类的使用)
本篇算是学习c++有关类的知识的一些易错点吧.....
并不是特别详细,以后会更新吧....
几点并不关于类的东西
1.函数模板,用虚拟类型来实现模板的功能
#include<iostream>
using namespace std;
template <typename t>//t为虚拟类型的名字,自己起的
t maxx(t a,t b,t c)
{
return max(a,max(b,c));
} int main()
{
double a=1.1,b=2.2,c=3.3;//不管为double 还是int都可以调用maxx
cout<<maxx(a,b,c)<<endl;
int a1=,b1=,c1=;
cout<<maxx(a1,b1,c1)<<endl;
}
2.关于函数默认的参数值要放到最右边
void f1(float a,int b=,int c,char d='a');//错误,
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>
using namespace std;
class box{
public:
box(int ,int ,int );//构造函数 (有无默认参数都行)
int volume();
private:
int h;
int w;
int l;
};
box::box(int a,int b,int c)
{
h=a,w=b,l=c;
}
//其实一般这样写
// 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);}
可以用另一个对象初始化另一个
time t1;
time t2=t1; //注意是吧t1的数据成员复制到t2,而不调用t2的构造函数
4.析构函数
注意一点,先构造的后析构,相当于栈,先进后出
静态局部对象,在函数结束时,并不释放,也就不调用析构函数
5.对象数组
box b[3] = (1 , 2 ,3)//这样其实不对,这三个实参则分别作为3个元素的第一个实参
初始化应该
box a[]={
box(,,);
box(,,);
box(,,);
}
6.对象指针
先说下函数指针。。。。还有函数指针????
类型名(* 指针变量名)(参数列表)
void (* p)();//p是一个指向void型函数的指针
p=fun;//fun函数入口地址付给p 注意没有括号
(*p)();
对象成员函数有些复杂
要求 函数参数类型和个数匹配 函数返回值类型一样 所属的类一样
void ( time:: *p )();//此时p为指向time类中的成员函数指针
time t;
void (time:: *p)();
p = &time::gettime();
(t.*p)();
7.this指针(指向当前对象)
当前被调用的成员函数所在对象的起始地址
int box::volume()
{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.类的模板
temple<class t>//t 为虚拟变量名字 可以有多个,但都要加class 如:temple<class t1,class t2>
class compare{
public:
compare(t a,t b)
{
x=a,y=b;
}
t max() {
return max(a,b);
}
private:
t x,y;
};
定义对象时为:
compare<int> cmp(3,4);
//多个时 compare<int ,double> cmp(3,4);
12.对运算符的重载
class yuan{
public:
yuan(double a,double b):x(a),y(b){};
yuan operator +(yuan &t)
{
return yuan(x+t.x, y+t.y);
}
private:
double x,y;
};
此时如果有
yuan c1(1,2),c2(1,2),c3;
c3 = c1 + c2;
则实际为 c3 = c1.operator(c2);
但其实我觉得更方便的是通过友元函数
class yuan{
public:
yuan(double a,double b):x(a),y(b){};
friend yuan operator +(yuan &t1,yuan &t2)//这个其实挺灵活的,可以自行改变
{
return yuan(t1.x+t2.x, t1.y+t2.y);
}
private:
double x,y;
};
c3 = c1 + c2 则解释为operator +(c1,c2);
13.继承
派生类拥有基类的数据成员,其分配如下
先说公有继承
基类属性 派生类
private 不可访问
public 公有继承后 public
protected protected
私有继承
基类属性 派生类
private 不可访问
public 私有继承后 private
protected private
保护继承
保护成员:只有子女(派生类)可以访问,(友元函数也不行)
基类属性 派生类
private 不可访问
public 保护继承后 protected
protected protected
14.有子对象的派生构造函数
#include<iostream>
using namespace std;
class Student{
public:
void display();
Student(int n,string nam):num(n),name(nam){}
protected:
int num;
string name;
};
class Student1: public Student{
public:
Student1(int n,string nam,int n1,string nam1,int a,string ad):
Student(n,nam),monitor(n1,nam1),age(a),addr(ad){}//注意初始化,一般用初始化表来 ,同样的,在多级派生中也是如此来构造
void show()
{
monitor.display();
}
protected:
Student monitor;//派生类中的子对象
int age;
string addr;
};
int main()
{ }
多级的形式
派生类构造名: 基类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,这样会保留多份数据成员的拷贝
虚基类是的在继承简介共同基类时只保留一份
class A
{
A(int i){}
.....
};
class B: virtual public A
{
B(int n):A(n){}
...
};
class C: virtual public A
{
C(int n):C(n){}
...
};
class D:public B,public C
{
D(int n):A(n),B(n),C(n){}//这个必须由最后的派生类中对直接基类和虚基类初始化
}
17.类型的转化
派生类可以向基类对象赋值 (大材小用),也可以向积累对象的引用进行赋值或初始化
派生类对象的地址可以赋给基类对象的指针变量,也就是说,指向基类对象的指针变量也可以用来指向派生类对象
18.多态性
分为两种 ,静态多态性和动态多态性(啥玩意啊,玩的怪花(小声bb))
静态多态性 就是 函数重载 和运算符的重载
动态 就是通过虚函数来实现的
说一下虚函数,作用还是要解决继承中的二义性问题,
解决方法是想通过指针的方法来实现
Student stu(...);
Graduate grad(...);//假设grad是stu的派生,且两者都有display函数
Student *p = &stu;
p->display();
p = &grad;//想通过变换指针指向来,但单单的这样做是不行的,因为这样做会把grad类型强制转化成student的类型
p->display();
解决上述问题的方法是将Student类中的display()函数前加上virtual
注意问题是 成原函数 定义为虚函数后,其派生类都为虚函数
使用方法是指向一个基类对象的指针变量,并使它指向同一类族中需要调用该函数的对象
19.虚析构函数
如下面代码
class Point{
public:
point();
~point();
};
class Circle: public Point
{
public:
Circle();
~Circle();
}
int main()
{
Point *p = new Circle;
delete p;
return ;
}
new的一个对象,在释放的时候,只会执行基类的析构函数,而不执行派生类的
解决方法是 在Point 的析构函数前加上 virtual
个人理解(这个virtual 在继承中 都会遗传)
20.纯虚函数
先说一点吧,往往有一些类,他们不用来生成对象,唯一目的就是用它去建立派生类,叫做抽象类
比如,点 可以派生出 园 ,圆可以派生出圆柱体 ,但这些都是 shape 的直接派生或者间接派生
比如
class Shape{
public:
virtual float area() const {return 0.0;}//虚函数
virtual float volume() const {return 0.0;}//虚函数
virtual void shapeName() const = ; // 纯虚函数 形式为 virtual 函数类型 函数名字 (参数列表) =0;
};
最后来个差不多的
#include<iostream>
using namespace std;
class Shape
{
public:
virtual float area() const {return 0.00;}
virtual float volume() const {return 0.00;}
virtual void ShapeName() const = ;
};
class Point: public Shape
{
public:
Point(float a=,float b=): x(a), y(b){};
void SetPoint(float a,float b)
{
x=a,y=b;
}
float getX() const {return x;}
float getY() const {return y;} virtual void ShapeName() const {cout<<"point"<<endl;}
friend ostream &operator <<(ostream &,const Point &);
protected:
float x,y;
};
ostream &operator <<(ostream &output,const Point &p)
{
output<<"["<<p.x<<","<<p.y<<"]"<<endl;
return output;
}
class Circle: public Point
{
public:
Circle(float x=,float y=,float r=):Point(x,y),radius(r) {} void SetRaidus(float r){ radius = r;} float GetRadius() const {return radius;} virtual float area() const{ return 3.14 * radius * radius;} virtual void ShapeName() const {cout<<"Circle"<<endl;} friend ostream &operator <<(ostream &,const Circle &);
protected:
float radius;
};
ostream &operator <<(ostream &out,const Circle &c)
{
out<<"["<<c.x<<" "<<c.y<<"]"<<endl;
out<<"r="<<c.radius<<endl;
return out;
}
class Yuan: public Circle
{
public:
Yuan(float x=,float y=,float r=,float h=):Circle(x,y,r),height(h){} void SetHeight(float h) {height = h;} virtual float area() const {return * Circle::area() + * 3.14 * radius * height;} virtual float vulume() const {return Circle::area() * height;} virtual void ShapeName() const {cout<<"Yuan"<<endl;} friend ostream &operator <<(ostream &,const Yuan &);
protected:
float height;
};
ostream & operator <<(ostream &out,const Yuan &Y)
{
out<<"["<<Y.x<<" "<<Y.y<<"],r="<<Y.radius<<"H="<<Y.height<<endl;
return out;
} int main()
{
Point point (3.2,4.5);
Circle circle(2.4,1.2,5.6);
Yuan yuan(3.4,6.4,5.2,10.5);
point.ShapeName();
cout<<point<<endl; circle.ShapeName();
cout<<circle<<endl; yuan.ShapeName();
cout<<yuan<<endl; Shape *pt;
pt=&point;
pt->ShapeName(); pt=&circle;
pt->ShapeName();
pt=&yuan;
pt->ShapeName();
return ;
}
可能以和还会更新吧..............
c++面向对象程序设计总结(类的使用)的更多相关文章
- Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)
一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...
- python程序设计——面向对象程序设计:类
理解面向对象 基本原则是,计算机程序由多个能够起到子程序作用的单元或对象组合而成 关键性观念是,数据以及对数据的操作封装在一起,组成一个相互依存.不可分割的整体,即对象 python面向对象特性 完全 ...
- 20175333曹雅坤 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- [.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图
[.net 面向对象程序设计深入](1)UML——在Visual Studio 2013/2015中设计UML类图 1.UML简介 Unified Modeling Language (UML)又称统 ...
- [.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类
[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) Json 序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能 ...
- [.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类
[.net 面向对象程序设计进阶] (11) 序列化(Serialization)(三) 通过接口 IXmlSerializable 实现XML序列化 及 通用XML类 本节导读:本节主要介绍通过序列 ...
- Java第7次作业:造人类(用private封装,用static关键字自己造重载输出方法)什么是面向对象程序设计?什么是类和对象?什么是无参有参构造方法 ?什么是封装?
什么是面向对象程序设计? 我们称为OOP(Object Oriented Programming) 就是非结构化的程序设计 要使用类和对象的方法来进行编程 什么是类,什么是对象 类就是封装了属性和 ...
- 第7章 Python类型、类、协议 第7.1节 面向对象程序设计的相关知识
Python被视为一种面向对象的语言,在介绍Python类相关的内容前,本节对面向对象程序设计相关的概念进行简单介绍. 一. 类和对象(实例) 在面向对象的程序设计(OOP)过程中有两个重要概念 ...
- [.net 面向对象程序设计深入](0) 开篇
[.net 面向对象程序设计深入](0)开篇 [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...
- [.net 面向对象程序设计进阶] (1) 开篇
[.net 面向对象程序设计进阶] (1) 开篇 上一系列文章<.net 面向对象编程基础>写完后,很多小伙伴们希望我有时间再写一点进阶的文章,于是有了这个系列文章.这一系列的文章中, 对 ...
随机推荐
- 4-1 R语言函数 lapply
#lapply函数 #可以循环处理列表中的每一个元素 #lapply(参数):lapply(列表,函数/函数名,其他参数) #总是返回一个列表 #sapply:简化结果 #结果列表元素长度均为1,返回 ...
- 2.1 The Python Interpreter(python解释器)
2.1 The Python Interpreter(Python解释器) Python是一门解释性语言.Python的解释器一次只能运行一个命令.标准的Python解释器环境可以用通过输入pytho ...
- Centos7安装anaconda3
Centos7安装anaconda3 1. 安装bunzip2 yum install bunzip2 2. 下载anaconda3 wget https://repo.anaconda.com/ar ...
- sqoop数据导入命令 (sql---hdfs)
mysql------->hdfs sqoop导入数据工作流程: sqoop提交任务到hadoop------>hadoop启动mapreduce------->mapreduce通 ...
- [LuoguP1462]通往奥格瑞玛的道路($SPFA+$二分)
#\(\mathcal{\color{red}{Description}}\) \(Link\) 有一个图,求其在\(1-N\)的最短路小于一个给定值下,点权最大值的最小值. #\(\mathcal{ ...
- jmeter报错之“请在微信客户端打开链接”
这是一个还没解决的问题,这里纯粹记录自己思考的过程,后续给自己参考. 先说明情景:对微信公众号的一个接口进行调用跑通,后续可能需要压测(是的,仅仅是调通一个接口而已o(╥﹏╥)o) 1.按照我理解的正 ...
- P1412 经营与开发
题目描述 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXploit(经营与开发) ...
- HDU1042 N!(大数问题,万进制)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1042 N! Time Limit: 10000/5000 MS (Java/Others) M ...
- ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1498], [18713], [18720]
数据库server出现ORA-00600[kcratr_nab_less_than_odr].不能open数据库 1.open数据库报ORA-00600[kcratr_nab_less_than_od ...
- Linux Shell常用技巧(三)
八. 流编辑器sed: sed一次处理一行文件并把输出送往屏幕.sed把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space).一旦sed完成对模式空间中的行的处理,模式空间中的行 ...