基于对象的设计OOD--------->面向对象的编程OOP(类之间的关系)
复合Composition:设计模式Adapter,选择功能已经很强大的类中的一些函数开放,更改名字或接口
template
...
protected: Sequence c;//底层容器,即deque
queue先进先出,deque两端都可以进出。
构造由内而外,析构由外而内。
Container::Container():Component(){...};//Component内可能有多个构造函数,当不想使用默认的构造函数时,斜体加粗部分需指明哪些参数。
委托Delegation:
也是“拥有”的关系,但是通过指针,也叫Composition by reference。生命周期与Composition不同,指针指向的class被需要时才会被创建。
pimpl( pointer to implementation) 别名 Handle/Body,编译防火墙:
指针指向不同的实现类,服务器端如何实现都不影响客户端
引用计数:
三个字符串共享“Hello”的内容,节省内存。如果想通过指针a更改"Hello"的内容,则copy一份给a改,copy on write.
继承inheritance:
形式:classname1 public: classname2:{}
三种继承:private、protected、public.
父类base的数据被完整继承到子类derived(通过内存),函数的继承是通过继承调用权。子类包含父类的一部分,和复合相同,构造由内(父类的构造函数)而外(子类的),析构由外而内。
虚函数virtual function
形式:在任何成员函数前都可加上virtual。
父类可以有多个子类,当成员函数被声明为纯虚函数时,所有子类都必须去定义它
设计模式Template Method:application framework与application分开,关键部分延缓放到子类里设计。通过子类对象调用父类函数。例如:MFC
mydoc.onfileopen(); 等同于 cdocument::onfileopen(&mydoc) mydoc作为this pointer
而在执行父类的函数时,遇到serialize();时,对编译器来说是this->serialize();
Composite:
在容器中存放的必须是相同大小的东西,如指针
包含自身和其他东西时,可设计两者的父类,使指针指向父类。
Prototype:
创建未来的子类,子类创建自己,而父类能够看到并复制子类,创建静态的自己---->调用私有构造函数,add prototype(this),将原型加到父类的原型容器中(自己允许调用自己的私有函数)----->clone函数(new一个自己),通过原型这个对象调用findandclone()来找到需要的原型指针来调用clone函数,再次调用clone函数new的自己需调用一个新的构造函数(protected或private都可以,可通过加一个用不到的参数和之前的构造函数区分开),静态函数虽然不需要对象就能调用,但需要class nameclass内的静态变量必须在class本体外做一次定义(给内存)
参考延伸资料
做作业时查的和QQ群里交流学到的
基类即父类,派生类即子类
有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
1.public继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:public, protected, private
2.protected继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:protected, protected, private
3.private继承:基类public成员,protected成员,private成员的访问属性在派生类中分别变成:private, private, private
但无论哪种继承方式,上面两点都没有改变:
1.private成员只能被本类成员(类内)和友元访问,不能被派生类访问;
2.protected成员可以被派生类访问
using namespace std;//要写分号!!这也是我为什么总在int main()函数的int上看见提示 应输入; 。。。。。。
在VS2017里,项目里的文件改过名字后会提示错误“必须定义入口点”
这周作业还粗心大意地把前面声明的变量名字在后面引用时抄错了,时间紧迫也没来得及发现并改正了。。。。。。
在不作为右值赋给变量时,意思相同,但++i、--i比i++、i--更快速,效率更高