原著:www.geocities.jp/ky_webid/cpp
第13章 包含和连锁
// sample.h
#include <iostream>
// スーパークラス
class CSuper
{
public:
CSuper();
virtual ~CSuper();
void Func();
};
// 包含されるクラス
class CInner
{
public:
CInner();
virtual ~CInner();
void Func();
};
// サブクラス
class CSub : public CSuper
{
public:
CSub();
virtual ~CSub();
void Func();
private:
CInner m_inner; // クラスを包含する
};
// sample.cpp
#include "sample.h"
// スーパークラスのコンストラクタ
CSuper::CSuper()
{
std::cout << "CSuper::CSuper()" << std::endl;
}
// スーパークラスのデストラクタ
CSuper::~CSuper()
{
std::cout << "CSuper::~CSuper()" << std::endl;
}
// スーパークラスのメンバ関数
void CSuper::Func()
{
std::cout << "CSuper::Func()" << std::endl;
}
// 包含されるクラスのコンストラクタ
CInner::CInner()
{
std::cout << "CInner::CInner()" << std::endl;
}
// 包含されるクラスのデストラクタ
CInner::~CInner()
{
std::cout << "CInner::~CInner()" << std::endl;
}
// 包含されるクラスのメンバ関数
void CInner::Func()
{
std::cout << "CInner::Func()" << std::endl;
}
// サブクラスのコンストラクタ
CSub::CSub()
{
std::cout << "CSub::CSub()" << std::endl;
}
// サブクラスのデストラクタ
CSub::~CSub()
{
std::cout << "CSub::~CSub()" << std::endl;
}
// サブクラスのメンバ関数
void CSub::Func()
{
std::cout << "CSub::Func()" << std::endl;
CSuper::Func(); // スーパークラスのメンバ関数を呼び出す
m_inner.Func(); // 包含しているクラスのメンバ関数を呼び出す
}
// main.cpp
#include "sample.h"
int main()
{
CSub obj;
obj.Func();
return 0;
}
执行的顺序为:
CSuper::CSuper()
CInner::CInner()
CSub::CSub()
CSub::Func()
CSuper::Func()
CInner::Func()
CSub::~CSub()
CInner::~CInner()
CSuper::~CSuper()
第14章 Protect
super.m_public = 100; super.m_protected = 100; // 不可! super.m_private = 100; // 不可!
可以通过父类public的函数访问
第15章 Reference
include <iostream>
class CSample{
public:
CSample(){ m_num = 123; } // コンストラクタ
CSample(const CSample& obj); // 引用构造函数
int& get(){ return m_num; } // 返回的是类成员的引用值
private:
int m_num;
};
void main(){
CSample beta();
CSample sample = beta; //引用复制构造函数
int& val =sample.get(); //接受类型为引用
val *=2;
cout<<sample.get()<<endl;
}
使用场景:1.函数参数 2.构造函数初始化 3.返回值
第16章 指向函数的指针
int max(int,int);
int main() {
int (*p)(int,int);
int a,b,c;
p = max;
scanf("%d,%d",&a,&b);
c = (*p)(a,b);
}
//作为参数
int StackTraverse(int S,int (*visit)(int,int));
第17章 运算符重载
// +演算子オーバーロード
CPoint CPoint::operator+(const CPoint& obj) {
CPoint tmp;
tmp.m_x = m_x + obj.m_x;
tmp.m_y = m_y + obj.m_y;
return tmp;
}
// +=演算子オーバーロード
CPoint& CPoint::operator+=(const CPoint& obj){
m_x += obj.m_x;
m_y += obj.m_y;
return *this;
}
class CData{
public:CData& operator++(); // 前置
CData operator++(int); // 后置(引数の int は后置式であることを示すダミー)
private:int m_data;
};
CData& CData::operator++(){// 前置式なので、インクリメントを行ってから return
m_data += 1;
return *this;
}
CData CData::operator++(int){// 后置式なので、古い状态をローカル変数にコピーしておき、インクリメントする。 // その后で、古い方を返す。
CData tmp = *this;
m_data += 1;
return tmp;
}
禁制copy技术
private:
CTest(const CTest&); // コピーコンストラクタ
CTest operator=(const CTest&); // 代入演算子オーバーロード