C++学习笔记(2)

原著:www.geocities.jp/ky_webid/cpp


第13章 包含和连锁

// sample.h
#include 

// スーパークラス
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 

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<
使用场景: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&); // 代入演算子オーバーロード


你可能感兴趣的:(C++学习笔记(2))