C++学习笔记面向对象.docx
- 文档编号:23944069
- 上传时间:2023-05-22
- 格式:DOCX
- 页数:27
- 大小:132.74KB
C++学习笔记面向对象.docx
《C++学习笔记面向对象.docx》由会员分享,可在线阅读,更多相关《C++学习笔记面向对象.docx(27页珍藏版)》请在冰豆网上搜索。
C++学习笔记面向对象
1.类:
class类名
{};类后面要加分号
在类中不能给属性赋值,
由于构造函数在建立实例的时候自动调用,所以可以再构造函数的实现过程中给属性赋值。
在类中不能给属性赋值,如果属性是私有的,那么外面定义的对象实例不能给它赋值,内部又不能给他赋值,怎么办呢?
所以构造函数可以对私有变量赋值。
之所以构造函数可以引用私有变量是因为,私有变量是只能给类内部使用的,而构造函数是属于类内部的,所以可以使用它。
所以只要是类里面的函数,在实现的时候都可以使用类中的私有变量。
#include"stdafx.h"
#include
usingnamespacestd;
classPen
{
public:
intage;
char*sex;
Pen();//构造函数
private:
char*color;
};
Pen:
:
Pen()//实现构造函数
{
color="blue";//构造函数可以对私有变量赋值
sex=color;//构造函数可以引用私有变量
}
int_tmain(intargc,_TCHAR*argv[])
{
Penpen;
pen.age=10;
cout< getchar(); } 2.对象: 对象时类的实例化。 定义一个对象: 类名对象名。 对象的定义是通过类来进行的,类名就像变量前面的那个int一样的。 3.类的成员的安全级别为: public、private、protected。 默认情况下,类的成员是私有的(private)。 公有成员(public)能够被类的所有对象访问,并能够被继承。 保护成员(protected)不能够被对象访问,但能够被继承。 私有成员(private)只能在类的本身的方法内访问,类的对象不能够访问私有成员。 在类的外部不能访问私有成员和保护成员,只能访问公有成员。 #include"stdafx.h" #include #include usingnamespacestd; classstudent { public: intage;//这里定义类型的时候需要冒号: public: char*sex;//字符串可以采用这种方式定义 public: char*name; };//这里定义完类后需要加一个分号 //类中不能定义变量的值。 //只有静态常量整型数据成员才可以在类中初始化 intmain(intargc,_TCHAR*argv[]) { studenttt; tt.age=18; tt.name="liming"; tt.sex="male"; cout< cout< cout< getchar(); } 4.实现类的方法 如果类中定义了方法,就需要在外面对他进行实现,实现的方法是加“: : ” #include"stdafx.h" #include #include usingnamespacestd; classstudent { public: intage; public: char*sex; public: char*name; public: intadd(inta,intb);//定义了函数 }; intstudent: : add(inta,intb)//在类外面实现函数 { returna+b; } intmain(intargc,_TCHAR*argv[]) { studenttt; tt.age=18; tt.name="liming"; tt.sex="male"; cout< cout< cout< cout< getchar(); } 5.默认构造函数 在类里面,写一个与类同名的方法,就称为构造函数。 #include"stdafx.h" #include #include usingnamespacestd; classstudent { public: intage; public: char*sex; public: char*name; student();//定义默认的构造函数 }; student: : student()//实现构造函数 { age=10; sex="femal"; name="zhulei"; } intmain(intargc,_TCHAR*argv[]) { studenttt;//调用默认的构造函数来定义对象。 cout< cout< cout< getchar(); } 6.自定义构造函数: #include"stdafx.h" #include #include usingnamespacestd; classstudent { public: intage; public: char*sex; public: char*name; student();//默认构造函数 student(inta,char*s,char*n);//自定义构造函数,也称为重载构造函数 }; student: : student()//实现默认构造函数 { age=10; sex="femal"; name="zhulei"; } student: : student(inta,char*s,char*n)//重载构造函数 { age=a; sex=s; name=n; } intmain(intargc,_TCHAR*argv[]) { studenttt;//由默认构造函数来定义对象 cout< cout< cout< studentdd(14,"male","xiaohong");//由重载构造函数来定义对象。 cout< cout< cout< getchar(); } 7.析构函数: 析构函数与构造函数是相对的,它是在对象被撤销后消除并释放所分配的内存,析构函数与构造函数同名,只是前面有一个“~”号,析构函数没有返回值和参数,但也是需要实现的,但不需要写内容。 系统在结束最后自动回调用析构函数的。 #include"stdafx.h" #include #include usingnamespacestd; classstudent { public: intage; public: char*sex; public: char*name; student(); ~student();//析构函数 }; student: : student() { age=10; sex="femal"; name="zhulei"; } student: : ~student() { cout<<"最后调用析构函数进行释放内存"; } intmain(intargc,_TCHAR*argv[]) { studenttt; cout< cout< cout< //getchar(); } 析构函数没有返回值,也没有参数,由于没有参数,所以析构函数不能被重载,一个类可以有很多个构造函数(重载),但只能有一个析构函数。 在调用构造函数的时候,就把对应名称的析构函数放入栈中,到最后执行析构函数,从中我们可以看出,若一个构造函数最先执行,那么他对应的析构函数最后执行,因为放在了栈的最底部。 8.继承 C++能多重继承,相当于java中的接口。 classdog: publicAnimal class+类名+: +访问限定符(public、private和protected)+父类名称。 1)访问限定符public: 表示对于基类(父类)中的public数据和方法,在派生类中仍然是public,对于基类中的protected数据成员和方法,在派生类中仍然是protected. 2)访问限定符protected: 表示对于基类中的public、protected数据成员和方法,在派生类中均为protected 3)访问限定符private: 表示对于基类中的public、protected数据成员和方法,在派生类中均为private. #include"stdafx.h" #include #include usingnamespacestd; classAnimal//基类 { public: char*color; char*sex; voidmove(); }; voidAnimal: : move()//实现函数 { cout<<"DogisMoving"; } classdog: publicAnimal//派生类继承于基类 { public: char*name; intage; dog(); voidrun(); }; dog: : dog()//实现默认构造函数 { name="xiaoming"; age=18; sex="male"; color="red"; } voiddog: : run()//实现函数 { cout<<"dogisruning"; } intmain(intargc,_TCHAR*argv[]) { dogcdog; cout< cout< cout< cout< cdog.move();//派生类调用基类函数 cdog.run();//派生类调用自身函数 getchar(); } C++能多重继承。 如果父类和子类具有相同的函数或属性,那么默认情况下调用的就是子类的,但如果想调用父类的,那就需要用’: : ’ 即子类实例.父类类名.父类里的属性。 #include"stdafx.h" #include usingnamespacestd; classPen { public: char*name; Pen(); }; Pen: : Pen() { name="father"; } classBi: publicPen { public: char*name; Bi(); }; Bi: : Bi() { name="child"; } int_tmain(intargc,_TCHAR*argv[]) { Penpen; Bibi; cout<<"Penname: "< "< cout<<"BiandPen: "< : name; getchar(); } 9.虚函数 在函数前面加入virtual关键字,就使该函数为虚函数。 classAnimal { public: char*color; char*sex; virtualvoidmove();//虚函数 }; 我们通过下面的比对,来了解虚函数的作用: #include"stdafx.h" #include usingnamespacestd; classPen { public: voiddisplay(); }; voidPen: : display() { cout<<"thisispen"< } classBi: publicPen { public: voiddisplay(); }; voidBi: : display() { cout<<"thisisbi"< } int_tmain(intargc,_TCHAR*argv[]) { Penpen; Bibi; Pen*p; p=&pen; p->display(); p=&bi; p->display(); getchar(); } 如果我们在pen上加了virtual,那么效果就完全不一样了。 从中可以看出,将基类(父类)的成员函数声明为虚函数主要是为了考虑到派生类(子类)的使用需要。 从上面可以看出,虚函数是使用基类类型的指针,实际指向派生类,并且指针调用的是派生类的函数,这就是C++中多态性的本质。 10.纯虚函数: 在虚函数的末尾加上“=0”,就是一个纯虚函数,纯虚函数可以只有声明,没有实现。 一个类如果包含了纯虚函数,该类称为抽象类,我们只能从抽象类派生子类,不能声明抽象类对象,同时子类必须实现抽象类中的纯虚函数。 存续函数是由于基类中已经是抽象的,所以没有必要输出,只需要具体的派生类输出即可,所以索性把它赋值为0,没有任何含义。 #include"stdafx.h" #include #include usingnamespacestd; classAnimal { public: char*color; char*sex; virtualvoidmove()=0;//纯虚函数 }; classdog: publicAnimal { public: char*name; intage; dog(); voidmove();//在子类中实现基类的纯虚函数 }; dog: : dog() { name="xiaoming"; age=18; sex="male"; color="red"; } voiddog: : move()//通过子类实现纯虚函数 { cout<<"dogismoving"; } intmain(intargc,_TCHAR*argv[]) { dogcdog; cout< cout< cout< cout< cdog.move(); getchar(); } 10.在类中定义的函数默认为内联函数,所谓内联函数,就是在编译的时候,直接把函数体覆盖每一处使用到这个函数的地方,加快程序运行经度,由于在类中定义的函数一般都比较小,所以这样做不会太占用空间,但可以明显加快速度。 11.多重继承 在C++中,允许一个类继承与多个基类,这很有用哦。 #include"stdafx.h" #include #include usingnamespacestd; classBird { public: char*color; char*sex; }; classFish { public: char*love; intage; }; classdog: publicBird,publicFish//实现多重继承 { public: char*name; intvalue; dog(); }; dog: : dog() { name="xiaoming"; age=18; sex="male"; color="red"; love="jiejie"; value=10; } intmain(intargc,_TCHAR*argv[]) { dogcdog; cout< cout< cout< cout< cout< cout< getchar(); } 12.派生类调用两个基类中名字相同的方法: #include"stdafx.h" #include #include usingnamespacestd; classBird { public: char*color; char*sex; voidmove(); }; voidBird: : move() { cout<<"Birdismove"<<'\n'; } classFish { public: char*love; intage; voidmove(); }; voidFish: : move() { cout<<"Fishismove"<<'\n'; } classdog: publicBird,publicFish { public: char*name; intvalue; dog(); }; dog: : dog() { name="xiaoming"; age=18; sex="male"; color="red"; love="jiejie"; value=10; } intmain(intargc,_TCHAR*argv[]) { dogcdog; cout< cout< cout< cout< cout< cout< cdog.Bird: : move(); cdog.Fish: : move();//这时就需要具体说明调用哪一个类的方法。 getchar(); } 13.静态成员数据: 是指其数据属于类,通过类名就可以访问的成员数据。 在声明时,只需要前面加入关键字static。 静态成员数据可以由类名就可以直接访问,也可以由对象名来调用。 普通成员不能通过类名来访问,只能通过对象来访问。 classFish { public: char*love; staticintage; voidmove(); }; 初始化静态成员变量,要在类的外部进行。 intFish: : age=10;//直接通过类名来访问,不过前面要加数据类型名: int,但不必在初始化语句中加上关键字static. 静态成员在内存中只创建一份,即在类中写上static,就开始分配内存空间,不管有没有创建对象实例,而它释放的时候也不是对象撤销的时候,而是程序结束的时候。 并不是每一个由类生成的对象都有自己的静态变量,而是他们共享这个变量,这就使得,当这个对象对自己的静态成员改变值时,其实也改变了其他对象他们自己所谓的静态成员,一边全变,就这个特点。 静态方法也是一样,但静态方法里面只能访问静态成员。 14.友元素 在类A中将类B声明为友元素,那么类B中就可以访问类A中的私有数据和方法了。 友元关系不能传递,也不能继承。 #include"stdafx.h" #include #include usingnamespacestd; classBird { private: char*color; public: friendclassFish;//设为友元素 Bird();//默认构造函数 }; Bird: : Bird()//默认构造函数实现 { color="red"; } classFish { public: Birdbird;//由类Bird来定义一个对象 char*love; intage; char*move(); Fish(); }; char*Fish: : move() { returnbird.color; } Fish: : Fish() { love="jiejie"; age=18; } intmain(intargc,_TCHAR*argv[]) { Fishcdog; cout< getchar(); } 定义友元函数: friendchar*Fish: : move(); 在类的外面定义了一个函数(这个函数不属于类),然后在类里面用firend对该函数进行声明后,这个函数就可以访问类中的所有成员(主要是私有变量)。 #include"stdafx.h" #include usingnamespacestd; classPen { public: intage; friendvoidshow(Pen&pen); private: intcolor; }; voidshow(Pen&pen) { pen.color=20; pen.age=pen.color; } int_tmain(intargc,_TCHAR*argv[]) { Penpen; show(pen); cout< getchar(); } 友元函数还可以使把其他类中的一个函数,而不是整个类,作为友元函数。 15.如果我们在类中定义了一个常量high,那么我们不能通过构造函数给这个常量赋值,但可以通过参数初始化表: 类名: : 类名(常量的数据类型形参): 常量名(形参){}; 来给它赋值,这只是另外一种初始化赋值的形式,可以通过这种方式,对成员变量进行初始化。 constintage;//声明常量 voidshow()const;//声明常函数 常函数只能调用变量而不能改变变量。 16.运算符重载 就是用普通的运
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 学习 笔记 面向 对象