面向对象的特性
Abstraction(抽象)
Polymorphism(多态)
Inheritance(继承)
Encapsulation(封装)
类的定义
class Circle{
public:
double radius;
Circle(){
radius = 1;
}
Circle(double r){
radius = r;
}
double getArea(){
return radius*radius*3.14159;
}
};
类是一种数据类型
对象指针:用指针访问对象成员
Circle circle1;
Circle *pCircle = &circle1;
两者效果相同:
(*pCircle).radius
pCircle->radius
在堆上创建对象
在函数中声明的对象都一般在栈上创建,函数返回后对象就被销毁。为了保留对象,可以用new运算符在堆上创建它。
ClassName *pObject = new ClassName();
delect pObject; //当程序结束时动态对象会被系统销毁,程序员也可以手动显示销毁
创建string对象
用无参构造函数创造一个空字符串
string newString;
用一个字符串常量创建string对象
string message("Aloha World");
用字符串数组创建string对象
char charArray[] = {'H','e','l','l','o',' '};
string message1(charArray)
内建指针this:指向当前函数的调用对象
构造函数的初始化
当类的数据域是一个对象类型,而且当这个对象的类本身没有无参构造函数时,须通过初始化列表来初始化对象。
静态成员
可以通过类或者对象调用静态函数,只能通过对象调用非静态函数。
当变量或者函数不依赖于类的实例时,可以将此变量/函数定义为静态。
析构函数
友元:通过friend声明友元函数或者友元类,从而可以通过友元访问private成员
拷贝构造函数(copy constructor)
ClassName(ClassName&)
唤起拷贝构造函数:
ClassName obj1(obj2);
或 ClassName obj1 = obj2; //只能在初始化时拷贝
浅拷贝:拷贝指针,而非指针所指向的内容
深拷贝:获取原指针的内容,创建新指针,拷贝原指针指向的内容到新指针里
定制深拷贝构造函数:
Person::Person(Person& person){
id = person.id;
Date* p = person.getBirthDate();
birthDate = new Date(*p);
}
Vector类
继承
DerivedClass(parameterList) : BaseClass() { }
DerivedClass(parameterList) : BaseClass(argumentList) { }
多态:不同的对象对相同的消息有不同的相应
联编:确定具有多态的语句调用哪个函数的过程
-> 静态联编:在程序编译时确定调用哪个函数(函数重载)
-> 动态联编:在程序运行时才确定调用哪个函数(运行时多态)
虚函数(virtual)
如何实现函数的动态联编:
1)基类定义同名虚函数
2)访问对象的成员函数时,要用指向对象的指针或者对象引用
基类与派生类中有同名函数时:
1,通过派生类对象访问同名函数 -> 静态联编
2,通过基类对象的指针访问同名函数 -> 静态联编
3,通过基类对象的指针访问同名虚函数 ->动态联编
抽象类:完全无法实例化的类
纯虚函数:
在抽象类GemoetricObject里定义函数virtual double getArea() = 0;
动态类型转换