?? 《c++編程思想》-- 第5章 筆記.txt
字號:
作者:rick1126
email: rickzhang@sina.com
日期:7/31/2001 10:11:18 PM
第5章 函數重載和缺省參數
5.0 基本概念
【名字】
. 能使名字方便地使用是任何程序設計語言的一個重要特征
. 依靠系統描述的名字, 才可以寫出人們易于理解和修改的程序
. 問題在于如何將語言的細微差別的概念映射到編程語言 -- 例如一詞多意的情況
【函數重載】
. 使用相同的函數名稱不同的參數列表和返回值類型作為重載的區分依據
. 重載構造函數可以使用多種不同的方式初始化類對象實例
【缺省參數】
. 針對冗長或者重復的函數調用參數, 使用缺省值的方式減少輸入的煩瑣和可能的錯誤
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5.1 范圍分解
【編譯器對于重載函數名稱的處理】
. 函數名不僅與類名關系密切, 而且還跟其他因素相關
. 重載函數要求參數不同, 而且不能利用返回值進行重載
. 同名函數要么是范圍不同, 要么是重載函數, 編譯器總是生成不同的內部名稱
【安全類型連接】
. 在C下允許函數沒有聲明直接調用,為此可能導致編譯器按照調用方式推斷函數聲明, 造成難以發現的錯誤
. 在C++中不允許函數沒有聲明就被使用, 名詞分解提供了一個安全連接
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5.3 缺省參數
【缺省參數】
. 在函數聲明的時候給定出初始值, 調用的時候如果沒有給出指定值, 編譯器就使用初始值代替.
. 相關使用規則:
- 參數列表的后部參數才可以是缺省的, 否則編譯器無法根據位置判斷, 缺省值后面必須全部是缺省參數
- 而且如果有多個缺省參數存在, 而相對后面一個值需要指定, 則前面的都需要給出, 即使就是缺省的
. 這樣如果發現缺省參數不在需要可以簡單的去掉而不影響以前的版本使用.
【位向量類】
標志位位串是一個在接收序列的時候特別是類似UDP數據包的時候經常用到的, 表示第幾個數據包已經接收, 未接收等. 如果使用一個int, unsigned char...的數組有時候顯然效率不高, 資源浪費. 所以使用位串最好, 因為使用位操作效率較高, 而位串占用內存也較少.
// Flags.h: interface for the CFlags class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_FLAGS_H__0FCB90C7_E5D7_4764_A16A_82B84BA310D9__INCLUDED_)
#define AFX_FLAGS_H__0FCB90C7_E5D7_4764_A16A_82B84BA310D9__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "stdio.h"
#include "string.h"
#include "assert.h"
#define FALSE 0
#define TRUE 1
#define FSIZE 100
class CFlags
{
private:
unsigned char f[FSIZE];
public:
CFlags();
virtual ~CFlags();
void set( int i);
void clear( int i);
int read( int i );
int size();
};
#endif // !defined(AFX_FLAGS_H__0FCB90C7_E5D7_4764_A16A_82B84BA310D9__INCLUDED_)
// Flags.cpp: implementation of the CFlags class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Flags.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFlags::CFlags()
{
memset( f, FALSE, FSIZE );
}
CFlags::~CFlags()
{
}
void CFlags::set( int i )
{
assert( i>=0 && i<FSIZE );
f[i] = TRUE;
}
void CFlags::clear( int i )
{
assert( i>=0 && i<FSIZE );
f[i] = FALSE;
}
int CFlags::read( int i )
{
assert( i>=0 && i<FSIZE );
return f[i];
}
int CFlags::size()
{
return FSIZE;
}
//BitVector.h
#ifndef BITVECT_H
#define BITVECT_H
class CBitVector{
unsigned char* bytes;
int Bits, numBytes;
public:
CBitVector();
CBitVector( unsigned char* init, int size=8 );
CBitVector( char* binary );
~CBitVector();
void set( int bit );
void clear( int bit );
int read( int bit );
int bits();
void bits( int sz );
void print( const char* msg="" );
};
#endif//BITVECT_H
//BitVector.cpp
#include "stdafx.h"
#include "bitvector.h"
#include "stdio.h"
#include "assert.h"
#include "stdlib.h"
#include "string.h"
#include "limits.h"
//描述: 獲得一個只有字節長度最高位1的一個無符號字節的掩碼
const unsigned char highbit = 1 << (CHAR_BIT - 1);
//將所有變量賦值0
CBitVector::CBitVector()
{
numBytes = 0;
}
//描述: 分配內存并初始化位數
CBitVector::CBitVector( unsigned char* init, int size )
{
//設置字節數
numBytes = size;
//設置比特位數
Bits = numBytes * CHAR_BIT;
//根據字節數分配一個元素長度為1字節, 個數為字節數的數組
bytes = ( unsigned char* )calloc( numBytes, 1 );
assert( bytes );
//如果指針空直接返回
if ( init==0 ) return;
//按比特位賦值
for( int index=0; index<numBytes; index++ ){
for( int offset=0; offset<CHAR_BIT; offset++ ){
set( index * CHAR_BIT + offset );
}
}
}
//描述: 將一個2進制0,1序列轉換成為BitVector
CBitVector::CBitVector( char* binary )
{
//獲得比特位數和對應字節數, 這里輸入的binary使用整整一個字節代表一個比特位
Bits = strlen( binary );
numBytes = Bits/CHAR_BIT;
if ( Bits%CHAR_BIT )
numBytes++;
//分配內存并且按位賦值
bytes = ( unsigned char* )calloc( numBytes,1 );
assert( bytes );
for( int i=0; i<Bits; i++ ){
if ( binary[i] == '1' )
set(i);
}
}
//描述: 釋放內存
CBitVector::~CBitVector()
{
free( bytes );
}
//描述: 按位賦值
void CBitVector::set( int bit )
{
assert( bit>=0 && bit<Bits );
int index=bit/CHAR_BIT;
int offset = bit%CHAR_BIT;
unsigned char mask = ( 1<<offset );
bytes[index]|=mask;
}
//描述: 獲得指定比特位的賦值
int CBitVector::read( int bit )
{
assert( bit>=0 && bit<Bits );
int index=bit/CHAR_BIT;
int offset = bit%CHAR_BIT;
unsigned char mask = ( 1<<offset );
return bytes[index]&mask;
}
//描述: 清除指定位的值
void CBitVector::clear( int bit )
{
assert( bit >= 0 && bit < Bits );
int index=bit/CHAR_BIT;
int offset = bit%CHAR_BIT;
unsigned char mask = ( 1<<offset );
bytes[index]&=mask;
}
//描述: 得到比特位數
int CBitVector::bits()
{
return Bits;
}
void CBitVector::bits( int sz )
{
int oldsize = Bits;
Bits = sz;
numBytes = Bits/CHAR_BIT;
if ( Bits%CHAR_BIT )
numBytes ++;
void* v = realloc( bytes, numBytes );
assert(v);
bytes = (unsigned char*) v;
for ( int i=oldsize; i<Bits; i++ )
clear( i );
}
//描述: 打印信息
void CBitVector::print( const char *msg )
{
puts( msg );
for ( int i=0; i<Bits; i++ )
{
if ( read(1) )
putchar( '1' );
else
putchar( '0' );
if ( ( i + 1 ) % CHAR_BIT == 0 )
putchar( ' ' );
}
putchar( '\n' );
}
// ch5_flags.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "flags.h"
#include "bitvector.h"
int main(int argc, char* argv[])
{
CFlags fl;
printf("%s\n", "演示一個使用字節數組的位串");
for( int i=0; i<fl.size(); i++ ){
if ( i%3==0 )
fl.set(i);
}
for( int j=0; j<fl.size(); j++ ){
printf( "fl.read(%d)=%d\n", j, fl.read(j) );
}
printf("%s\n", "演示一個使用位串向量的位串");
unsigned char b[] = { 0x0f, 0xff, 0xf0, 0xAA, 0x78, 0x11 };
CBitVector bv1( b, sizeof(b)/sizeof(*b) ),
bv2( "10010100111100101010001010010010101" );
bv1.print( "bv1 after modification" );
bv2.print( "bv2 before modification" );
for( j=bv2.bits() - 10; j<bv2.bits(); j++ )
bv2.clear( j );
bv2.set(30);
bv2.print( "bv2 after modification" );
bv2.bits( bv2.bits()/2 );
bv2.print( "bv2 cut in half" );
bv2.bits( bv2.bits() + 10 );
bv2.print( "bv2 grown by 10" );
CBitVector bv3( (unsigned char*)0 );
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -