C語言重寫類
1. 新手關於c語言中類(Classes)的問題,求高手!
#include<iostream>
using namespace std;
class X
{
int x; //定義類X的私有實例成員變數x
public:
X() {x=0;} //默認構造函數(無參數),將x初始化為0
X(int xx) {x=xx;} //重載的構造函數,將x初始化為xx
//虛函數,輸出x的值,子類可以覆蓋(重寫)虛函數,從而實現多態
virtual void prt() {cout<<x;}
};
//類Y公共繼承自類X,即Y是X的子類
class Y:public X
{
int y; //定義類Y的私有實例成員變數y
public:
//以下兩行都是類Y的構造函數,它們都隱式調用了父類X
//的默認構造函數,以初始化父類的實例成員變數x(都初始化成0了)
Y() {y=0;}
Y(int yy) {y=yy;}
//這是覆蓋(重寫)父類的虛函數prt
void prt() {cout<<y;}
};
int main()
{
//x(10)會調用帶一個參數的構造函數X(int xx),創建一個類X的對象x,
//x的成員變數x初始化為10
//z會調用默認構造函數X(),創建一個類X的對象z,
//z的成員變數x初始化為0
//y(11)會調用帶一個參數的構造函數Y(int yy)(Y的),創建一個類Y的對象y,
//y的成員變數y初始化為11,同時通過調用父類X的默認構造函數,
//將父類的成員變數x初始化為0
X x(10),z;Y y(11);
//將x賦給z,調用z的成員函數prt,輸出顯示10
z=x;z.prt();
//將y賦給z,調用z的成員函數prt,輸出顯示0,
//因為調用的是父類X的prt,顯示的是對象z的成員變數x的值
z=y;z.prt();
//以下新加的會輸出顯示11,
//因為調用的是子類Y的prt,顯示的是對象y的成員變數y的值
y.prt();
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
2. C語言重寫隱藏文件
試試把文件屬改成可見,再改內容,搞完後再設置成隱藏屬性,用函數system(char *)加DOS命令attrib設置文件屬性
3. 哪位大神能用c語言 重寫opencv 的下面6個函數或者從源碼中整理出來,可以編譯,運行
去git上面看看源碼
//先說一下這個函數吧
//cvNamedWindow
CV_IMPLintcvNamedWindow(constchar*name,intflags){
CV_FUNCNAME("cvNamedWindow");
if(!name)CV_ERROR(CV_StsNullPtr,"NULLname");
HighguiBridge::getInstance().namedWindow(name);
returnCV_OK;
}
//而它又需要HighhuiBridge這個類,它有個單例工廠方法
HighguiBridge&HighguiBridge::getInstance(){
staticHighguiBridgeinstance;
returninstance;
}
//上面2個函數實際調用這2個成員函數
CvWindow*HighguiBridge::namedWindow(cv::Stringname){
CvWindow*window=HighguiBridge::getInstance().findWindowByName(name.c_str());
if(!window)window=createWindow(name);
returnwindow;
}
//創建窗口先是查找有沒有已有窗口
CvWindow*HighguiBridge::findWindowByName(cv::Stringname){
autosearch=windowsMap->find(name);
if(search!=windowsMap->end())returnsearch->second;
returnnullptr;
}
//如果沒有會用這個函數創建
CvWindow*HighguiBridge::createWindow(cv::Stringname){
CvWindow*window=newCvWindow(name);
windowsMap->insert(std::pair<cv::String,CvWindow*>(name,window));
returnwindow;
}
//創建窗口是CvWindow類
classCvWindow{
public:
CvWindow(cv::Stringname,intflag=CV_WINDOW_NORMAL);
~CvWindow();
/**@briefNOTE:prototype.
.
*/
voidcreateButton(cv::Stringname);
/**@.
.
*/
voidcreateSlider(cv::Stringname,int*val,intcount,CvTrackbarCallback2on_notify,void*userdata);
/**@briefUpdateswindowimage.
@.
Thefunctionupdateswindowimage.-doesnothing.
*/
voipdateImage(CvMat*arr);
/**@(slider).
@paramnameNameofthewindow.
(slider).
nullptr.
*/
CvTrackbar*findTrackbarByName(cv::Stringname);
Page^getPage();
private:
cv::Stringname;
//HoldsimagedatainCVformat
CvMat*imageData;
//
std::map<cv::String,CvTrackbar*>*sliderMap;
//Windowcontentsholder
Page^page;
//
Image^imageControl;
//Containerforsliders
Panel^sliderPanel;
//Containerforbuttons
//TODO:prototype,notavailableviaAPI
Panel^buttonPanel;
//.
//RequiredsinceimageData->
intimageWidth;
//t
staticconstPlatform::String^markupContent;
//DefaultSlidersize,
;
};
//CvWindwo構造函數為
CvWindow::CvWindow(cv::Stringname,intflags):name(name){
this->page=(Page^)Windows::UI::Xaml::Markup::XamlReader::Load(const_cast<Platform::String^>(markupContent));
this->sliderMap=newstd::map<cv::String,CvTrackbar*>();
sliderPanel=(Panel^)page->FindName("cvTrackbar");
imageControl=(Image^)page->FindName("cvImage");
buttonPanel=(Panel^)page->FindName("cvButton");
//.
//,afterthatwecan
//updateothercontrols
imageControl->Loaded+=refnewWindows::UI::Xaml::RoutedEventHandler(
[=](Platform::Object^sender,
Windows::UI::Xaml::RoutedEventArgs^e){
//
for(autoiter=sliderMap->begin();iter!=sliderMap->end();++iter){
iter->second->getSlider()->Width=imageControl->ActualWidth;
}
//
//TODO:implementwhenaddingbuttons
});
}
4. c語言~~有幾個常用的自己寫的函數,但每次也要重寫,應如何處理
把你的函數保存成a.h
每次要用到a{}時,就把a.h放到源文件同目錄下,源文件加"include"a.h""即可
5. C語言內存重寫和內存遺漏是什麼意思什麼情況下會發生呢
沒怎麼聽過這個概念,但是我覺得你說的應該是內存溢出和內存泄露這兩個問題
內存溢出也就是定義的變數長度不足,內存不夠儲存數據導致數據超出界限,這通常是由於數據長度判斷不嚴格造成的。好比只定義了一個能裝5個蘋果的盒子卻要裝8個蘋果,剩下的3個只能放到其他蘋果的位置了,其他的蘋果就等於是被「重寫」了
例子,定義了int a[2]變數,再定義int *p = a,當用p[2] = 0寫入數據時,就發生了內存溢出。由於c語言只檢查指針是否有效(能讀寫),這就可能導致指針被賦予一個特殊的值,比如指向程序代碼部分,這時候往指針中寫入的數據就有可能覆蓋原本的命令,而且有可能被程序或者系統運行。還有一種情況就是錯誤的指針可能意外的修改了其他變數的值,這個通常在結構體變數中發生。
一句話就是溢出的內存
內存泄露就是給指針分配了內存卻並未做回收,導致系統一直認為你正在使用這塊內存,當不再有指針指向這塊內存,也就是無法正常手動回收時,就造成了內存泄露。內存泄露會導致系統可用內存越來越少,直到再無內存可供分配或者程序被終止。由於系統自身代碼缺陷而存在的內存泄露,由於除非關機重啟,系統一直在運行,會導致泄露的內存一直得不到回收,最終內存耗盡系統崩潰死機
6. C語言,重寫strcpy和strcmp
strcpy:
char* strcpy (char* dest, const char* src)
{
char* p = dest; // 復制dest 的副本使用,dest本身要用作返回值
while ((*p++ = *src++) != '\0'); // 逐個復制src串的字元到p串,直到0結束
return dest; // 返回 dest
}
strcmp:
int strcmp (const char* str1, const char* str2)
{
int result;
char ch;
do {
ch = *str1++; // 逐個取 str1 串的字元
result = ch - *str2++; // 逐個與 str1 串的字元比較,結果在result 中
} while (ch != '\0' && result == 0); // 串未結束且結果相等則繼續
return result; // 返回結果
}
7. 把C語言用匯編語言重寫,用跳轉指令和不用跳轉指令2種方法,謝謝
不用跳轉寫這個if有點意思,算數右移+邏輯右移+異或求絕對值,根據結果符號位偏移取地址賦值,用LOOP循環cx賦值為CMP a,b後ZF取反結果得到循環結束條件
8. C語言為什麼可以重寫標准庫函數
這個問題是一個好問題,我之前也沒思索過或者嘗試過,
首先我們弄清楚一件事,函數聲明可以放在任何頭文件,實現可以放在任何實現該函數的源文件中,那麼就存在一個問題:
編譯時,到底優先去使用哪一個,為什麼沒有把標准庫中的函數擴展過來;在windows下標准庫被編譯成了msvcr120.dll(msvcr100.dll,這里指release版),所以並不是擴展到代碼中,而是在調用時動態鏈接;
而題主在其中自定義文件中實現了該函數,所以編譯時找到了該函數的實現,並不會去鏈接dll(這應該是編譯器做的一些工作,確定系統的dll需要載入哪些),所以題主的程序執行時就只有一份fputc了,並不沖突。
題主可以通過快捷鍵跳轉聲明就知道了,VS下,點選fputc實現函數按F12跳轉到聲明,指向的是stdio.h,再按一次跳轉到你自己的定義了。Qt的話使用F2。
大概就是這樣子了,可追問。
9. 方法重載和重寫的區別
Overload是重載的意思,表示在同一個類中,允許存在一個以上的同名函數,只要他們的參數個數或者參數類型不同即可,Override是覆蓋的意思,也就是重寫,它與返回值類型無關,只看參數列表,兩者不同主要體現在:目的不同、范圍不同、參數不同、多態性不同、返回類型不同。
1、目的不同
overload用於增加程序的可讀性(做法不同,但是做的同一事情)。 override用於提供其超級類已經提供的方法的特定實現。
2、范圍不同
overload 在相同的類范圍內內執行。 override發生在兩類具有繼承(繼承)的關系。
3、參數不同
overload參數必須不同。 override參數必須相同。
4、多態性不同
overload 靜態多態,調用的函數在編譯時被選中。 override 是運行時多態性的。
5、返回類型不同
overload中可以相同或不同。但你必須改變參數。 override必須是相同的或協變的。