1. c++中類的相互引用
原則是:相互引用的class要分別寫.h和.cpp文件(分別合用一個.h,.cpp也可)
在.h文件中只需申明class類型即可,一定不要包含其他類的頭文件
在.cpp文件中必須要包含其他要引用的頭件
不要將函數申明跟寒暑提在同一文件中實現,否則會出意想不到的錯誤!!!
a.h b.h 合成一個.h文件
a.cpp b.cpp 合成一個.cpp文件也可
a.h
#ifndef _A_
#define _A_
class b;
class a;
class a {
friend class b;
private:
int aa;
void a1( b m );
};
#endif
a.cpp
#include "stdafx.h"
#include "a.h"
#include "b.h"
void a::a1(b m )
{
m.bb = 0 ;
}
b.h
#ifndef _B_
#define _B_
class b;
class a;
class b
{
friend class a;
private:
int bb;
void zzz(a n);
};
#endif
b.cpp
#include "stdafx.h"
#include "b.h"
#include "a.h"
void b::zzz(a m )
{
m.aa = 0 ;
}
main.cpp
#include "stdafx.h"
#include "a.h"
#include "b.h"
int main(int argc, char* argv[])
{
a aa;
b bb;
return 0;
}
2. 鏈表的好用法
struct a {
static a *mLinkedList; // 申明為一個靜態變量
a *mNext;
bool mCanRemoteCreate;
a(bool canRemoteCreate)
{
mNext = mLinkedList;
mLinkedList = this;
mCanRemoteCreate = canRemoteCreate;
}
static int *create(const char *name);
};
a *a::mLinkedList = NULL; // 初始化
3. 靈活的應用# ##
Token-Pasting Operator (##)
#define paster( n ) printf( "token" #n " = %d", token##n )
int token9 = 9;
If a macro is called with a numeric argument like
paster( 9 );the macro yields
printf( "token" "9" " = %d", token9 );which becomes
printf( "token9 = %d", token9 );
Stringizing Operator (#)
#define stringer( x ) printf( #x "\n" )
void main()
{
stringer( In quotes in the printf function call\n );
stringer( "In quotes when printed to the screen"\n );
stringer( "This: \" prints an escaped double quote" );
}
Such invocations would be expanded during preprocessing, producing the following code:
void main()
{
printf( "In quotes in the printf function call\n" "\n" );
printf( "\"In quotes when printed to the screen\"\n" "\n" );
printf( "\"This: \\\" prints an escaped double quote\"" "\n" );
}
When the program is run, screen output for each line is as follows:In quotes in the printf function call
"In quotes when printed to the screen"
"This: \" prints an escaped double quotation mark"
#define IMPLEMENT_NETCONNECTION(className, classGroup, canRemoteCreate) \
NetClassRep* className::getClassRep() const { return &className::dynClassRep; } \
NetClassRepInstance<className> className::dynClassRep(#className, 0, NetClassTypeNone, 0); \
NetClassGroup className::getNetClassGroup() const { return classGroup; } \
static NetConnectionRep g##className##Rep(&className::dynClassRep, canRemoteCreate)
4. 枚舉:初始化為0值開始,后者比前者大1,除非顯式指定.
By default, the first enumerator has a value of 0, and each successive enumerator is one larger
than the value of the previous one, unless you explicitly specify a value for a particular
enumerator. Enumerators needn’t have unique values. The name of each enumerator is treated
as a constant and must be unique within the scope where the enum is defined. An enumerator
can be promoted to an integer value. However, converting an integer to an enumerator requires
an explicit cast, and the results are not defined.
=========================
一些優秀的數學算法
5.1 /// Determines if number is a power of two.
inline bool isPow2(const U32 number)
{
return (number & (number - 1)) == 0;
}
5.2 浮點數的計算機中的儲存方法
單精度 1| 8 | 23 |
符號 指數 尾數
雙精度 1| 11 | 52 |
符號 指數 尾數
10110.100011 -> 1.0110100011* 2(4) 2的4之方
符號位 0
尾數 0110100011
指數 4 以過剩127儲存 +127= 131 -> 10000011
所以 IEEE 754 : 0100000110110100011
-0.0010011 -> -1.0011 * 2(-3) 2的-3之方
符號位:-1
尾數 : 0011
指數為:-3 +127 的124 -〉01111100
所以: 1 01111100 0011000000000000000000
/// Determines the binary logarithm of the input value rounded down to the nearest power of 2.
inline U32 getBinLog2(U32 value)
{
F32 floatValue = F32(value);
return (*((U32 *) &floatValue) >> 23) - 127;
}