Posted on 2008-07-17 17:56
softgamer 閱讀(253)
評論(0) 編輯 收藏 引用 所屬分類:
學習日志
在這里不說類的概念了,大家都清楚,只是說說關于類的注意事項
1.類的數據成員不能在類體中聲明時初始化,而還是要用類的構造函數初始化,或者用set 函數賦值
2.析構函數能不能被重載?不能,因為析構函數不能帶參數,所以不能重載
3.外部訪問private類成員只能用public類接口通過public成員函數訪問。盡量使所有類的成員保持private
實現規范是 1.提供public函數,2.設置private數據成員的值,3.獲得private數據成員的值
4.提供public成員set,get函數是重要的,它可以讓用戶讀寫private成員
5.重點來了
返回對private數據成員的引用,是非常危險的!!!!
如
#pragma once
class CDay
{
public:
CDay( int );
virtual ~CDay(void);
void setDay( int day );
int getDay();
int &badsetDay( int day ); // DANGEROUS
private:
int Day;
};
#include "StdAfx.h"
#include "Day.h"
CDay::CDay( int day )
{
setDay( day );
}
CDay::~CDay(void)
{
}
void CDay::setDay( int day )
{
Day = day;
}
int CDay::getDay()
{
return Day;
}
//Returning a ref to private data member
int &CDay::badsetDay( int day )
{
Day = ( day >= 0 && day < 31 )?day:0;
return Day;
}
// test1.cpp : 定義控制臺應用程序的入口點。
//
#include "iostream"
using namespace std;
using namespace std;
#include "Day.h"
int _tmain(int argc, _TCHAR* argv[])
{
CDay c( 11 );
int &Dayref = c.badsetDay( 21 );
cout << "\n Day before mod: " << Dayref;
Dayref = 41; // modied //Dangerous Function call
cout << "\n Day after mod: " << c.getDay();
//Dangerous Function call
//a ref can be used as an lvalue
c.badsetDay( 12 ) = 74;
cout << "\n\n***************************\n"
<< "badsetDay as an lvalue Day:"
<< c.getDay()
<< "\n*******************************\n" << endl;
return 0;
}
結果是:
Day before mod: 21
Day after mod: 41 //wrong Day above 31
***************************
badsetDay as an lvalue Day:74 //wrong Day above 31
*******************************