1.C++:封装性,继承性,多态性。
2.struct和class的区别:struct默认为public,class默认为private。
include的区别:<>会直接到系统目录去查找文件,""会现在当前目录去查找。
3.构造函数:用来初始化类内部的数据成员。
(1)在创建一个对象之后,需要分配内存给对象本身,必须需要构造函数。若没有则编译器会提供一个默认的构造函数(没有参数)。
(2)若类里面自己定义了构造函数,则不论他带不带参数,编译器都不提供默认的构造函数了。
4.析构函数:当一个对象生命周期结束时,其所占有的内存空间就要被回收,这个工作由析构函数来完成。
(1)析构函数是反向的构造函数,不允许有返回值也不允许带参数,且一个类只能有一个析构函数。
(2)对象被系统回收或被程序用delete删除时,析构函数被调用。
(3)在构造函数中初始化对象的某些成员变量,给其分配内存空间(堆内存),在析构函数中释放对象运行期间所申请的资源。
5.函数的重载:
(1)条件:函数参数不同,或参数个数不同才能构成函数重载。
只有返回值不同是不行的。
void output();
int output();
有缺省值的定义会发生歧义。
void output(int a,int b=5);
void output(int a);
6.this 指针:每当产生了一个对象,对该对象产生一个隐含的指针,指向该对象本身。
(1)每当调用一个对象的成员时,例如pt.output(10,10),其实成员函数除了接受两个实参,还接受到了一个对象s的地址。这个地址呗一个隐含的形参this指针所获取。等同于this=&pt.
#include <iostream>
using namespace std;
class Point{
public:
int x;
int y;
Point(){
x=0;y=0;
}
Point(int a,int b){
x=a;
y=b;
}
~Point(){}
void output(){
cout<<x<<endl<<y<<endl;
}
void output(int x, int y){
this->x=x;
this->y=y;
}
};
void main(){
Point pt(3,3);
pt.output(5,5);
//pt.x=5;
//pt.y=5;
//cout<<pt.x<<endl<<pt.y<<endl;
pt.output();
system("pause");
}
7.类的继承
(1)继承方式:
PUBLIC 基类public-protected-private, 子类public-protected-no access
PROTECTED 基类public-protected-private, 子类protected-protected-no access
PRIVATE 基类public-protected-private, 子类private-private-no access
(2)构造函数的继承:
创建子类对象时,首先调用的是基类的构造函数。这时,如果Animal构造函数带参数,那么需要Fish构造函数传递该参数。若Fish含有自有的const参数也需要在这时初始化。
(3)函数的覆盖:只发生在父类和子类之间。相同的函数名子类的覆盖父类的。若要用父类的需要指定名字的作用域。
class Animal{
public:
Animal(int height){
cout<<"Animal construct"<<endl;
}
~Animal(){
cout<<"Animal deconstruct"<<endl;
}
void eat(){
cout<<"animal eat"<<endl;
}
protected:
void sleep(){
cout<<"animal sleep"<<endl;
}
void breathe(){
cout<<"animal breathe"<<endl;
}
};
class Fish : public Animal{
public:
Fish():Animal(400),a(1){
cout<<"Fish construct"<<endl;
}
~Fish(){
cout<<"Fish construct"<<endl;
}
void test(){
sleep();
//breathe(); private 在子类中都不能访问
}
void breathe(){
Animal::breathe();
cout<<"fish bubble"<<endl;
}
private:
const int a;
};
(4)多态性(虚函数):
若C++在编译时发现Animal类的breathe()函数时虚函数,C++就采用迟绑定,在运行时依据类型的来确认调用的是哪一个函数。
如果不是虚函数。则在main中即使是Fish对象的指针调用breathe,仍会调用Animal的breathe().
如果是虚函数,则调用时先在子类中找对应的函数名,没有才会调用基类。
virtual void breathe(){
cout<<"animal breathe"<<endl;
}
(5)纯虚函数:在Animal中可以定义纯虚函数,由子类去决定他的操作,基类只给出名字。但是这时,基类不能够实例化对象。而且如果子类没有定义这个函数,则该子类也不能实例化对象。
virtual void breathe()=0;
8.VS程序编译连接过程:
首先所有cpp都分别预处理(处理#),在内存中生成翻译文件。然后COMPILE编译会分别把翻译文件转化成包含机器指令的OBJ目标文件。
最后LINK把所有OBJ连接起来。
#ifndef ANIMAL_H_H
#define ANIMAL_H_H
class Animal{
public:
Animal();
void eat();
protected:
void sleep();
virtual void breathe();
};
#endif
头文件中的预编译#ifndef是为了防止头文件重复包含的问题