最近在恶补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