一、C++特性基础知识
1、结构体与类的区别
- 结构体默认情况下,其成员是public的(可以在外部调用)
- 类默认其成员是private的(只在类内部调用)
- 例子:客厅(public,对外开放)和卧室(private,只对家人开放)
结构体程序:
#include <iostream.h>
struct point
{
int x;
int y;
void output()
{
cout<<x<<endl<<y<<endl;
}
};
void main()
{
point pt;
pt.x=0;
pt.y=0;
pt.output();
}
类程序:
#include <iostream.h>
struct point
{
int x;
int y;
void output()
{
cout<<x<<endl<<y<<endl;
}
};
void main()
{
point pt;
pt.x=0;
pt.y=0;
pt.output();
}
2、类与对象的关系
- 我们定义了类point和对象pt,对象可以看做是一个类的具体实例
- 如电脑是一个抽象词时(包含显示器、主板等),这时候可以看做是一个类;但如果是具体型号的电脑(有具体的显示器和主板的参数),这时的电脑就是一个对象;
3、构造函数与析构函数
- 上述程序中的point()//point类的构造函数
- C++允许有两个构造函数存在,具体用哪个由main()函数确定
- 析构函数~point(),与构造函数作用相反,清除类的对象,
4、函数的重载
- 条件:函数的参数类型、参数个数不同,才能构成函数的重载
- 举例:void output() 和 int output() 不能构成函数的重载,虽然其函数类型不同,但是其参数个数相同
5、this指针
- 指向对象本身,要记得区分开形参与类的成员本身
- 对所有数据成员的访问,都隐含的加上了前缀this->,如x=0等价于this->x=0
6、类的继承
- 子类继承父类的特性(如父类为动物animal,具有吃、睡觉和呼吸的方法,子类为鱼fish,继承了动物的方法)
- 类的继承三种访问特性
- public:外部访问
- protected:只在子类内访问
- private:只能在类本身访问
- 构造子类fish的对象时,父类和子类的构造函数和析构函数调用顺序
- 构造函数先父后子,析构函数先子后父
- 父类的构造函数是带参数的:只需要在子类中显式调用父类的带参数的构造函数
#include <iostream.h>
class animal
{
public:
animal(int weight, int height)
{
cout<<"animal construct"<<endl;
}
...
};
class fish:public animal
{
public:
fish():animal(400,300)
{
cout<<"fish construct"<<endl;
}
...
};
void main()
{
fish fh;
}
7、C++的多态性
- 在基类的函数前面加上virtual关键字,在派生类中重写该函数
- 运行时根据对象的实际类型判断,如果是派生类,就调用派生类的函数,如果是基类,就调用基类的函数
- 区分开子函数覆盖,C++的多态性是由虚函数实现的
8、函数的覆盖、隐藏与重载的区别
- 函数的覆盖发生在基类和派生类中,两个函数完全相同,都为虚函数(前面加virtual)
- 函数的隐藏是指没有加virtual,派生类中隐藏了基类的同名函数,如果想要调用,则需要“基类名::函数名(参数)”的形式
- 函数的重载是发生在一个类中的
9、引用与指针的区别
- 引用和用来初始化的变量指向同一个内存,其本身是不占用内存的
- 指针是地址,需要占用存储空间
- 如int a=5; int&b=a;//表示一个引用,必须在申明时初始化
10、条件预处理指令
- 为了防止有些头文件重复定义,需要采用下述格式进行预处理,以animal.h为例
- #ifdef ANIMAL_H_H
- #define ANIMAL_H_H
- 头文件结尾加#endif