?? ex14.cpp
字號:
//第14章 邁入面向對象編程部分
//[例14.1]用結構實現(xiàn)求兩個數(shù)的和(函數(shù)通過CA*const型的形參操作結構CA中的成員)
#include <stdio.h>
struct CA { int m;long n; };//聲明一個結構CA,它有兩個不同類型的數(shù)據(jù)成員
inline void Initial(CA*const p,int x,int y) { p->m=x;p->n=y;}//全局函數(shù)初始化結構成員
inline int Add(CA*const ths) { return ths->m+ths->n;}//全局函數(shù)Add返回成員之和
void Show(CA*const pthis) { printf("%d,%d,%d\t",pthis->m,pthis->n,Add(pthis));}
void main() //在全局函數(shù)Show中調(diào)用Add(CA*const)全局函數(shù)
{ CA b={10,20}; Show(&b); //定義結構變量b并初始化,然后顯示數(shù)據(jù)
Initial(&b,1,2); //調(diào)用全局函數(shù)void Initial(CA* const,int ,int );
Show(&b); //調(diào)用全局函數(shù)Show(CA* const );
} // 輸出: 10,20,30 1,2,3
// [例14.2]用類的形式(將含CA*const形參的全局函數(shù)變?yōu)槌蓡T函數(shù))實現(xiàn)求兩個數(shù)的和
#include <stdio.h> //this是一個隱含的形參,此時類型屬性為CA* const
class CA //CA是用戶引入的類類型名
{ public:int m;long n; //聲明兩個公共的數(shù)據(jù)成員
public: int Add(){ return this->m+ this->n; } //內(nèi)置定義成員函數(shù)Add
void Initial(int x,int y) { m=x; n=y;}//內(nèi)置定義成員函數(shù)Initial
void CA:: Show() ; //聲明成員函數(shù)Show
}; //在成員函數(shù)Show中調(diào)用Add()成員函數(shù)
void CA:: Show() { printf("%d,%d,%d\t",m,n,Add());}//在類的外面定義成員函數(shù)Show
void main() //初始化[CA b={10,20};]形式對于只有公共成員的類或結構才有效
{ CA b={10,20}; b.Show(); //定義局部對象b并初始化,然后顯示數(shù)據(jù)
b.Initial(1,2); //局部對象b調(diào)用成員函數(shù)void CA::Initial(int ,int );
b.Show(); //局部對象b調(diào)用成員函數(shù)void CA::Show();
} // 輸出: 10,20,30 1,2,3
// [例14.3]內(nèi)部訪問和外部訪問。通過指針p可輕易地間接訪問內(nèi)部的私有成員
#include <stdio.h>
class CType
{ private: int m_n;
public: CType& Set(const CType& r,int n); // const對象引用入口,對象引用返回
int* Initial(int n) //返回int*型的指針的成員函數(shù)
{ this->m_n=n; //在成員函數(shù)中訪問私有成員m_n
return &m_n; //返回私有數(shù)據(jù)成員this->m_n的地址
} //成員函數(shù)或友元函數(shù)可訪問類中所有的成員
};
CType& CType::Set(const CType& r,int n)// const CType&形參r說明r.m_n作為右值
{ static CType a; //定義靜態(tài)局部對象a
a.m_n=n; //靜態(tài)局部對象a訪問私有成員m_n
if(n==1) return a; //n=1返回靜態(tài)局部對象a
m_n=n+r.m_n; //引用形參r訪問私有成員m_n
return *this; // return *this返回調(diào)用該成員函數(shù)的對象
}//this此時是屬性為CType*const型的指針,間接對象*this是CType型左值
CType b; //定義全局對象b。
int *p=b.Initial(20); //對象b在外部訪問公共的成員函數(shù)Initial
void main() //b.Initial(20)完成p=&b.m_n,但b.m_n訪問私有成員是錯誤的。
{ printf("%d\t",*p);// *p是b.m_n的間接變量,指針間接訪問私有成員m_n。
b=b.Set(b,2); printf("%d\t",*p); printf("%d\t",*b.Initial(30));
} // 輸出: 20 22 30
////////// [例14.4]內(nèi)聯(lián)成元函數(shù)破除私有封裝
#include<string.h>
#include<stdio.h>
typedef struct tagPOINT { long x; long y; } POINT;
class CPoint
{public:inline long& X() ; //返回long&型引用的函數(shù)X()
inline long GetY() ; //返回long型數(shù)值的函數(shù)GetY()
private: long x; long y;
}; //內(nèi)聯(lián)成員函數(shù)的定義一般應放置在調(diào)用點之前
inline long& CPoint::X() { return x;}
inline long CPoint::GetY() { return y;}
void main()
{ POINT s={10,20}; //僅存在公共成員才采用集合類型的初始化格式
CPoint r; //存在私有數(shù)據(jù)成員的類不采用結構中的初始化語法
memcpy(&r,&s,sizeof(r)); //通過內(nèi)存拷貝函數(shù)完成對象的初始復制
printf("%d,%d\n",r.GetY(), r.X()+=r.GetY());//輸出: 20,30
} //函數(shù)調(diào)用r.X()構成左值,而r.GetY()是右值表達式。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -