第二次课

安全函数

strcpy/strcat/strlen有安全隐患, 都以''结尾, 有安全隐患

char * strcpy ( char * destination, const char * source );

windows下的安全函数
errno_t strcpy_s( char *dest, rsize_t dest_size, const char *src);字节数

errno_t __cdecl strcpy_s(_Out_writes_z_(_SizeInBytes) char * _Dst, _In_ rsize_t _SizeInBytes, _In_z_ const char * _Src);
errno_t __cdecl wcscpy_s(_Out_writes_z_(_SizeInWords) wchar_t * _Dst, _In_ rsize_t _SizeInWords, _In_z_ const wchar_t * _Src);

只会拷取指定长度字符, debug版和release版有区别

linux下的安全函数
char *strncpy(char *dest, const char *src, size_t n);

字符编码

ASCII, Unicode, utf-8, gbk, big5

gbk: VS下的中文编码方式

Unicode: 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以, VS中的编码

utf-8: 可变长度, 根据前导来判断字节长度, 网络通信倾向于utf-8

网络传输中要把其他字符转换成utf-8发送来接收

wchar_t* ps = L"中国人";
char* p = "xxx";

int WSAAPI send(	// WSAAPI表示windows socket api
  SOCKET     s,
  const char *buf,
  int        len,
  int        flags
);

int n = send(s, (const char*)ps, 6, 0);	// 发送''字符应该是8

VS中预编译头文件必须写在第一行

匈牙利命名法

//sz/psz

char buf[64];

char szBuf[64];  // string terminated with zero

char* psz = "helloworld";	// point to size terminated with zero?

int nName;

float fName;

DWORD dwName;

WORD wName;

int g_Name;	// 全局变量

class A {
private:
​	int m_iName;	// 私有成员
};

HWND hwndName;

HINSTANCE hName;

HDC hdcName;

对于 for-each 循环,尽量使用 const &,其次是 &,最后才是拷贝

for (const Json::Value& jMarketBookLevel : jData)
{
       //循环中不会修改 jData 的值                        
}

for (Json::Value& jMarketBookLevel : jData)
{
       //循环中会修改 jData 的值                        
}

for (Json::Value jMarketBookLevel : jData)
{
       //循环中需要拷贝 jData 的值做修改                      
}

在 Visual Studio 菜单【Tools】->【Options】-> 【Text Editor】-> 【C/C++】-> 【Tabs】将 Tab size 设置成插入四个空格,而不是插入 。

申请内存或者栈变量大数组(长度超过 4)尽量使用 4 的倍数

//错误的做法
char sz[99];

//正确的做法
char sz[100];

成员变量名称对齐

正确的做法

class CKafkaMDClient :public CMarketBase
{
private:
	KafkaMDHandler	                     *m_pMDhandler;
	KConsumer		                     *m_pSnapConsumer;
	KConsumer		                     *m_pIncConsumer;
	std::vector<RdKafka::TopicPartition*> m_vecIncTopicpartitionList;
	std::string		                      m_strSnapTopic;
	std::string		                      m_strIncTopic;

	using SnapInstrumentMap = CHashMap<char *, SnapInstrument *, HashString>;
	SnapInstrumentMap                     m_snapInstrumentMap;
};

错误的做法

class A
{
private:
	// 指向CFtdcMduserApi实例的指针
	CQdFtdcMduserApi *m_pUserApi;
	CQdFtdcReqUserLoginField m_reqUserLogin;
	CMDFlowManager *m_pFlowManager;

	CFTDCPackage m_mdMessage;
	//收报每个报文之前确定主题号
	int m_nTopicID;
	int m_nTopicType;
	//收到每个报文之前确定序号
	int m_nSequenceNo;
	//每个api的号
	int m_nNumber;
    bool m_wsSend;

    QuWSFront *m_qwsfront;
	CMarketDataHandler *m_pMarketDataHandle;
	CTradingDayType m_tradingDay;   
};

子类重写父类的函数需要加上override关键字, 不用加 virtual

class A : B
{
public:
    void OnRtnMBLMarketData(CQdFtdcMBLMarketDataField *pMBLMarketData) override;
};

尽量将类的基元数据类型(bool, char, short, int, long, 指针类型)放在一起

正确做法

class A
{
private:
	bool c;
	int  a;
    int  b;
    bool d
    bool c;
    st   s;
    CXX  xx;
};

错误做法

class A
{
private:
	int  a;
	st   s;
    int  b;
    CXX  xx;
    bool c;  
};
原文地址:https://www.cnblogs.com/hesper/p/10642483.html