类(类型),从具有共同特征的许多对象中,抽象出某种概念(eg:人、车)
类可以产生一个具体的实例(eg:人->张三)
类包括,名字Name;属性Attributes;功能或行为Behaviors(类里可有成员函数)
用class、struct定义。其中,struct定义时,不需要typedef,直接student stu即可
概念之间可能存在一些关系,包含关系(eg:人与眼睛);继承(派生)关系(eg:人与教师),教师有人的一般特征,也有自身特有的特征
面向对象设计要考虑,多个(用户定义)类型之间的关系,继承(派生类)还是包含(由属性描述-eg:学生包含分数)
考虑访问权限,哪些是外部(类)可以访问的,哪些是仅有内部才能访问的
在类中定义成员函数时,可以在类体内定义(正常定义函数),也可以在类体外定义(如下)
1.在类里声明函数,eg:void print();
2.加类作用域,在类外实现(eg:student::,与类建立联系,不然就是一个普通的外部函数了)
void student::print(){
...
}
this指针,成员函数的参数部分,实际上隐含了一个this指针
stu.print(); //等价于print(&stu)(普通外部函数)
void print(student* this){ //this指针指向调用该成员函数的对象,即this=&stu
cout<<this->name<<this->score<<endl;
}
访问控制,struct和class的区别:
struct里的成员默认是public(:)(公开的),任何一个外部函数都能修改其数据,不安全;对外的接口
class里的成员默认是private(:)(私有的),外部函数无法访问私有成员
想修改私有成员,只能使用公开的接口
构造函数,函数名和类名相同,且无返回值类型的成员函数,eg:默认构造函数student(){}
默认构造函数,不带参数,或参数都有默认值
构造函数可以有多个
如果一个类没有默认构造函数,则无法创建该类型的数组。因为数组有多个对象,无法单个传参数,只能调用默认构造函数
友元函数(友元函数是一个外部函数),通过friend关键字,在类中声明外部函数,使得该外部函数可以访问此类对象的私有属性(eg:friend ostream& operator<<(ostream& o, student s);)
运算符重载,有的运算符只能作为外部函数(输入流、输出流),有的运算符只能作为成员函数(下标运算符),有的运算符两者都可以(p.operator+(q)-成员函数,和operator+(p,q)-外部函数)
throw,抛出异常
函数签名后,加const,表示常函数,就可以重载相同函数签名的函数们了
double operator[](int i) const{...}
double& operator[](int i) {...}