Time of Update: 2018-12-04
C++的訪問標號有三種,跟C#一樣.用法也差不多.很容易理解. 比較特色的是:預設的Class的成員都是private的,而C#裡面預設是public的.跟C++裡面的struct一樣. 一般來說,都是把介面放在public那邊,資料或者是一些類特有的隱蔽操作,放在private這邊,--懂黑箱操作的,應該都能理解. 比較特別的是,C++裡面有個friend --
Time of Update: 2018-12-04
先從我最近遇到的一個詭異的現象說起,來看一段代碼:#include <iostream>using namespace std;class test{public: test(){} test(test &t) { data = t.data; } test func(test t) { test m; return m; }public: double data;};int main(
Time of Update: 2018-12-04
昨天編的程式,使用了strcmp這個函數,怎樣都得不到想要的結果.逐步執行,發覺問題出現在strcmp函數這裡.用if(strcmp(a,b))來執行條件,老是不對. 一開始以為是strcmp函數的問題,換了一個strncmp,結果也是這樣. 於是我把strcmp()函數提了出來,賦值給bool,查看它的返回,這才發現了原因. 又是因為C#使用習慣以後的一個理所當然.在C#裡面,返回是true跟false,不允許之外的值.而C/C++,可以接受0為false,1為真. 而這兩個比較函數,都是st
Time of Update: 2018-12-04
一般說來,單目運算子最好被重載為成員;對雙目運算子最好被重載為友元函數,雙目運算子多載為友元函數比重載為成員函數更方便. 運算子多載實際是一個函數,所以運算子的重載實際上是函數的重載。編譯器對運算子多載的選擇,遵循著函數重載的選擇原則。當遇到不很明顯的運算時,編譯器將去尋找參數相匹配的運算子函數。 運算子多載的作用: 運算子多載允許C/C++的運算子在使用者定義型別(類)上擁有一個使用者定義的意義。重載的運算子是函數調用的文法修飾: class Fred Fred
Time of Update: 2018-12-04
在C++中,把記憶體劃分為四種儲存區:1、棧2、堆3、全域/靜態儲存地區4、一個專門用來存放常量的地區棧:C++中用 的最多的儲存結構,函數體中定義的變數通常放在棧上。它的申請和釋放有系統專門管理,效率非常高,和堆比起來,不易產生記憶體片段。堆:用malloc,new等分配的得到的得到的變數在堆上,而且要用free,delete手動釋放動態申請的空間。堆申請的大小比棧大很多,可上兆。堆和棧主要的區別由以下幾點: 1、管理方式不同; 2、空間大小不同; 3、能否產生片段不同;
Time of Update: 2018-12-04
void *memccpy (void *dest, const void *src, int c, size_t n);從src所指向的對象複製n個字元到dest所指向的對象中。如果複製過程中遇到了字元c則停止複製,返回指標指向dest中字元c的下一個位置;否則返回NULL。void *memcpy (void *dest, const void *src, size_t n);從src所指向的對象複製n個字元到dest所指向的對象中。返回指標為dest的值。void *memchr
Time of Update: 2018-12-04
1、cpp檔案中的全域靜態變數全域內的聲明:static int a=0;這樣的靜態全域變數就只能被該cpp檔案所用,不能被其他cpp檔案分享權限設定。若不聲明static:int a=0;這樣的全部變數既不能保證a能被其他cpp檔案分享權限設定,又不能保證不能被其他cpp檔案分享權限設定。不建議這樣使用,最好加extern:extern int a=0;2、靜態局部變數int f(){static int
Time of Update: 2018-12-04
序列化:string r1 = new JavaScriptSerializer().Serialize(obj);還原序列化非常討厭 必須指定資料類型 ClassType obj = new JavaScriptSerializer().Deserialize<ClassType>(str);這邊str和ClassType有任何不匹配就會拋出各種異常 完全沒有靈活性一般語言都可以轉換成弱類型的索引值對下載visualstudio sp1 再下載silverlight
Time of Update: 2018-12-04
可以承載10w個timer通訊運行,說關閉就關閉,裡面用了一個比較巧妙的線程處理,呵呵10W個timer就10多個線程,請大牛不要笑話,供新手學習之用 #pragma once#include <Windows.h> typedef void (CALLBACK* UXTIMERCALLBACK)(DWORD,void*); #include <map> #define G_UXTimerQueue (CUXTimer::GetInstance()) //-------
Time of Update: 2018-12-04
1首先要在視窗類別的cpp檔案手動添加訊息響應機制, //{{AFX_MSG_MAP(CShellDlg) ON_MESSAGE(WM_SENDOFFLINE, OnSendOffline) //自訂訊息 ON_MESSAGE(WM_SWIPECARD, OnSwipeCard) //自訂訊息 ON_MESSAGE(WM_MODEM, OnModem) ON_MESSAGE(WM_PINPAD, OnPinPad)
Time of Update: 2018-12-04
但凡人都是急功近利和有惰性的,我就是個例子。不想每篇部落格都寫一個摘要和那些大段的文字描述,但是為了讓一些新的讀者朋友瞭解我的部落格內容,我還是像前面說的那樣,把第一篇關於指標的摘要搬過來,因為我寫的這幾篇都是關於指標的,所以沒有必要每篇一個摘要,在此就偷偷懶了,如果讀過我前面兩篇C指標部落格的朋友可以跳過這篇部落格前面的摘要不讀,直接進入主題部分。懂得C語言的人都知道,C語言之所以強大,以及其自由性,絕大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。所以從我的標題加了
Time of Update: 2018-12-04
大多數的讀者在學習程式設計語言的時候都不喜歡那些枯燥的文字描述,包括我自己在開始學習編程的時候也是這樣,對於代碼的熱情遠遠高於文字,所以我在我寫東西的時候也不喜歡用枯燥的文字描述來向讀者講解,更喜歡用代碼加上適當的文字描述的方式進行講解,因為有些東西可能用枯燥的文字描述半天還不如實實在在的給讀者呈現出一段簡單的代碼,讓讀者理解得更加的透徹些。但是並不是說文字描述就沒用,文字描述也很重要,只是絕大部分讀者都更加的希望直接達到最終的效果,都想跳過那些中間的步驟。接下來我們接著上一篇部落格《C語言的那
Time of Update: 2018-12-04
懂得C語言的人都知道,C語言之所以強大,以及其自由性,絕大部分體現在其靈活的指標運用上。因此,說指標是c語言的靈魂,一點都不為過。所以從我的標題加了個(一)也可以看出指標的重要性,我儘可能的向大家交代清楚我對於指標的理解。所以在講解的過程中我儘可能的用代碼加文字的描述方式,通過代碼的分析來加深我們對於指標的理解,我給出的都是完整的代碼,所以讀者可以在看的過程中直接copy下去即可運行,希望下面的講解能夠對你有所協助。首先讓我們來看看定義一個指標的一般形式為:基底類型
Time of Update: 2018-12-04
在講解堆棧之前,我們先要來說說其實我們常說的堆棧是兩種資料結構。那麼什麼是堆什麼又是棧呢? 棧,是硬體。主要作用表現為一種資料結構,是只能在某一端插入和刪除的特殊線性表。它按照後進先出的原則儲存資料,先進入的資料被壓入棧底,最後的資料在棧頂,需要讀資料的時候從棧頂開始彈出資料(最後一個資料被第一個讀出來)。棧是允許在同一端進行插入和刪除操作的特殊線性表。允許進行插入和刪除操作的一端稱為棧頂(top),另一端為棧底(bottom);棧底固定,而棧頂浮動;棧中元素個數為零時稱為空白棧。插
Time of Update: 2018-12-04
volatile的重要性對於搞嵌入式的程式員來說是不言而喻的,對於volatile的瞭解程度常常被不少公司在招聘嵌入式編程人員面試的時候作為衡量一個應聘者是否合格的參考標準之一,為什麼volatile如此的重要呢?這是因為嵌入式的編程人員要經常同中斷、底層硬體等打交道,而這些都用到volatile,所以說嵌入式程式員必須要掌握好volatile的使用。其實就象讀者所熟悉的const一樣,volatile是一個類型修飾符。在開始講解volatile之前我們先來講解下接下來要用到的一個函數,知道如何
Time of Update: 2018-12-04
大學期間剛開始學習C語言時,我對於編程的要求不屑一顧,所以別人在參考My Code的時候總是會說我寫的“太亂”,當初我自己對於代碼的要求就是自己能懂就行了。當我要踏入社會的時候我發現我必須要改掉這個不好的習慣,因為工作後不是簡簡單單的只要自己看懂就行了!下面就來簡單的介紹我在linux下編程所學的一些規範的寫法吧。1.宏定義的名稱每個字母都用大寫,名字要體現它在代碼中的含義,例如:#difine PI
Time of Update: 2018-12-04
預先處理是C語言的一個重要知識點,它能改善程式設計的環境,有助於編寫易移植、易調試的程式。因此,我們有必要掌握好預先處理命令,在自己編程的時候靈活的使用它,使得編寫的程式結構優良,更加易於調試和閱讀。接下來我儘可能的把預先處理中重要知識點向讀者講解清楚,使讀者能夠在自己以後編程的過程中熟練的使用預先處理命令。C語言的預先處理主要有三個方面:1、檔案的包含2、宏定義3、條件編譯一、檔案包含的形式有下面兩種1、#include "檔案名稱" 2、#include <檔案名稱>
Time of Update: 2018-12-04
1、#error文法格式:#error token-sequence主要作用:在編譯的時候輸出編譯錯誤資訊token-sequence,方便程式員檢查程式中出現的錯誤。實 例:#include "stdio.h"int main(int argc, char* argv[]){#define CONST_NAME1 "CONST_NAME1"printf("%s\n",CONST_NAME1);#undef CONST_NAME1#ifndef CONST_NAME1#error
Time of Update: 2018-12-04
前幾天被問到,在C++裡建立一個空類什麼都成員沒有,它佔多大記憶體?我一下子懵掉了,還真沒想過這個問題。後來查了下資料終於明白了,且聽我慢慢道來。首先我們看一下這個測試程式:#include <iostream>using namespace std; class Test{};main(){Test t;cout<<"size :"<<sizeof(t)<<endl;}輸出結果是:size :
Time of Update: 2018-12-04
在開始寫linux核心雙向迴圈鏈表之前,我一直在想我要不要用長篇大論的文字來描述linux核心雙向迴圈鏈表呢?經過認真的思考之後,我否決了用枯燥的文字向讀者描述linux核心雙向迴圈鏈表的想法,因為對於程式設計語言來說我相信大多數的讀者都應該不喜歡面對枯燥的文字,更喜歡看到代碼,同時那也是讀者閱讀文字後想要實現的東西,所以我決定在這裡採用代碼加上適當的文字描述的方法來進行講解,這就使得我不可能用一篇的篇幅來講解完,所以會寫兩篇文章來講解這個知識點。希望讀者能夠堅持看完,學會以後在應用程式中寫雙向