最近在恶补OOP相关知识,很遗憾学校的课没选上,于是只能上网购进C++Primer一本,开始重学C++之旅。。。

(壮哉我大ZJU,网购半天到货XDD)

学习路线

7.类->13.类设计者的工具->15.面向对象程序设计

总的来说,C++Primer的章节编排顺序是很合理的。有些教材习惯上来就讲虚函数,继承,恰恰缺乏对有关问题的引导,造成学完后半懂不懂的情况。

7.类

类的特性,成员函数,友元函数,构造函数简介

13.类设计者的工具

拷贝构造函数,拷贝赋值运算符,析构函数,内存管理类,合成拷贝控制的时机,三/五法则,使用默认/删除函数,移动构造函数,移动赋值运算符,右值引用,智能指针shared_ptr<>

[以上两章均未涉及继承]

15.面向对象程序设计

#include <iostream>
#include <vector>
#define DEBUG stdio
#include "debug/debug.h"
using namespace debug;
using namespace std;
class A
{
public:
A(): tag(count++) { println("A%d()", tag); }
A(const A& a): tag(count++) { println("A%d(const A%d&)", tag, a.tag); }
A(A&& a): tag(count++) { println("A%d(A%d&&)", tag, a.tag); }
A& operator = (const A& a) { println("A%d& operator = (const A%d&)", tag, a.tag); }
A& operator = (A&& a) { println("A%d& operator = (A%d&&)", tag, a.tag); }
~A() { println("~A%d()", tag); }
public:
void func() { println("A::func()"); }
void func(int) { println("A::func(int)"); } virtual void f() { println("A::f()"); }
virtual void g() { println("A::g()"); }
virtual void h() { println("A::h()"); }
private:
static int count;
const int tag;
}; int A::count = 0; class B: public A
{
public:
B() = default;
B(const B&) = default;
public:
void func() { println("B::func()"); } void f() override { println("B::f()"); }
virtual void h() { println("B::h()"); }
}; int main()
{
A a;
B b;
A *p = &b;
p->f(); // virtual
p->g(); // virtual
p->h(); // virtual
p->func(1);
p->func();
}
A0()
A1()
B::f()
A::g()
B::h()
A::func(int)
A::func()
~A1()
~A0()
#include <iostream>
#include <vector>
#define DEBUG stdio
#include "debug/debug.h"
using namespace std;
using namespace debug; struct A
{
A() { cout << "A" << endl;}
A(const A&) { cout << "const A&" << endl;}
A(A&&) { cout << "A&&" << endl; }
A& operator = (const A&) { cout << "=const A&" << endl;}
A& operator = (A&&) { cout << "=A&&" << endl; }
virtual ~A() { cout << "~A" << endl; }
}; class B : public A
{
public:
B() { cout << "B" << endl; }
B(int) { cout << "B(int)" << endl; }
B(const B& v): A(v) { cout << "const B&" << endl; }
B(B&& v): A(v) { cout << "B&&" << endl; }
B& operator = (const B&) { cout << "=const B&" << endl; }
B& operator = (B&&) { cout << "=B&&" << endl; }
~B() override { cout << "~B" << endl; }
}; int main()
{
vector<B> vec;
vec.push_back(B());
//b.f(1);
}
A
B
const A&
B&&
~B
~A
~B
~A

初探C++Primer(15.面向对象程序设计)的更多相关文章

  1. C++ Primer 5th 第15章 面向对象程序设计

    面向对象程序设计的核心思想是:数据抽象.继承和动态绑定. 数据抽象:将类的接口与实现分离: 继承:定义相似类型并对相似关系建模: 动态绑定:一定程度上上忽略相似类型间的区别,用同一方式使用它们. 1. ...

  2. [C++ Primer] : 第15章: 面向对象程序设计

    OOP: 概述 面向对象程序设计的核心思想是数据抽象, 继承和动态绑定. 通过数据抽象, 我们可以实现类的接口与实现的分离; 使用继承, 可以定义相似的类型并对其相似关系建模; 使用动态绑定, 可以在 ...

  3. [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能

    [.net 面向对象程序设计进阶] (15) 缓存(Cache)(二) 利用缓存提升程序性能 本节导读: 上节说了缓存是以空间来换取时间的技术,介绍了客户端缓存和两种常用服务器缓布,本节主要介绍一种. ...

  4. 2018面向对象程序设计(Java)第15周学习指导及要求

    2018面向对象程序设计(Java)第15周学习指导及要求 (2018.12.6-2018.12.9)   学习目标 (1) 掌握Java应用程序打包操作: (2) 了解应用程序存储配置信息的两种方法 ...

  5. 面向对象程序设计(JAVA) 第15周学习指导及要求

    2019面向对象程序设计(Java) 第15周学习指导及要求(2019.12.6-2019.12.13)   学习目标 (1) 掌握菜单组件用途及常用API: (2) 掌握对话框组件用途及常用API: ...

  6. Java面向对象程序设计第14章3-8和第15章6

    Java面向对象程序设计第14章3-8和第15章6 3.完成下面方法中的代码,要求建立一个缓冲区,将字节输入流中的内容转为字符串. import java.io.*; public class tes ...

  7. 【c++ Prime 学习笔记】第15章 面向对象程序设计

    15.1 OOP:概述 面向对象程序设计(object-oriented programming)的核心思想是:数据抽象.继承.动态绑定 使用数据抽象,可将类的接口与实现分离 使用继承,可定义相似的类 ...

  8. C++ Primer笔记14_面向对象程序设计

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/scottly1/article/details/31371611 OOP概述 面向对象程序设计(ob ...

  9. [.net 面向对象程序设计深入](0) 开篇

    [.net 面向对象程序设计深入](0)开篇        [.net 面向对象编程基础]和 [.net 面向对象程序设计进阶]在15年底写完了,群里也加进来不少热爱学习的小伙伴.让我深切感受到在这个 ...

随机推荐

  1. AX 2012 template table use in Query

    queryRuntmp = new QueryRun(querytmp); queryRuntmp.setRecord(arAgingForLeasingTmp); while(queryRuntmp ...

  2. PHP Warning: PHP Startup: in Unknown on line 0

    Windows平台启动php后,出现PHP Warning:  PHP Startup:  in Unknown on line 0解决方案:这个问题是由于php.ini中没有开启(去掉注释符号)ph ...

  3. C#设计模式——解释器模式(Interpreter Pattern)

    一.概述 在软件开发特别是DSL开发中常常需要使用一些相对较复杂的业务语言,如果业务语言使用频率足够高,且使用普通的编程模式来实现会导致非常复杂的变化,那么就可以考虑使用解释器模式构建一个解释器对复杂 ...

  4. FPGA综合工具--Synplify Pro的常用选项及命令

    最近要用到Synplify,但以前没使用过,无基础,找到一篇帖子,隧保存下来. 本文转自:http://blog.sina.com.cn/s/blog_65fe490d0100v8ax.html Sy ...

  5. cvs update后输出的文件标志 和 update常用的几个参数

    (1)update 和 checkout 在执行中,会为每个文件打印一行提示信息,文件的状态通过前面的单个字符指明:       U file        文件按要求从仓库得到更新.用在那些仓库里面 ...

  6. js 实现动态的图片时钟

    效果如下图 附件有图片   http://files.cnblogs.com/files/biyongyao/时钟.rar 源代码 <!DOCTYPE html> <html> ...

  7. php 正则表达式 将形如 "天," ,"安", "门" 转化为"天、安、门", (仅匹配汉字)

    #!/usr/bin/php<? $rows = file("illwods_deal1.txt"); $goalfile = fopen("illwods_res ...

  8. 28. Red Hat Linux安装Vmware Tools

    在VMware虚拟机中安装好了VMware Tools,才能实现主机与虚拟机之间的文件共享,同时可支持自由拖拽的功能,鼠标也可在虚拟机与主机之前自由移动(而不再用按ctrl+alT释放),而且还可以令 ...

  9. c++程序设计之编程思想

    代码块愈小,代码的功能就愈容易管理,代码的处理和移动就愈轻松. 任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的代码,才是优秀的程序员. 绝大多数情况下,函数应该放在它所使用的数据的所 ...

  10. <读书笔记>软件调试之道 :问题的核心-修复后的反思

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...