-
#include <iosteam>
#include "Data.h"
void test1(Data data)
{
}
void test2(Data * data)
{
????//若傳入空指針,加判斷
????if (data == nullprt)
????{
????????return;
????}
}
void test3(Data & data)//傳引用不用做空指針判斷
{
? ? //存在通過引用操作data對象的漏洞
}
void test3(const Data & data)//加上const 函數(shù)內(nèi)部無法操作data對象,規(guī)避漏洞。
{
? ??
}
Data getData()
{
????Data data;//新建一個對象 == 新開一片內(nèi)存
????return data;
}
int main()
{
????Data data;//創(chuàng)建副本
????test 1(data);//操作副本
????test 2(&data);//指針操作
????test2(nullprt);//傳入空指針
????test3(data);//直接傳入對象,更便捷。
????Data data = getData();//調(diào)用結(jié)束,getData 返回的data內(nèi)存釋放,將之拷貝至新的內(nèi)存對象“=”左邊的那個data。(無形之中,資源浪費)
????const Data & data = getData();
????test3(data);//調(diào)用test3() 若data為const 修飾變量,test 函數(shù)內(nèi)部賦值也必須為const修飾。
????test3(getData());//簡寫。
????return 0;
}
查看全部 -
引用
聲明方法:
int main()
{
? ? int A = 200;
????int & newA = A; //引用初始化
????newA = 90;
????printf("A:%d\n",A);//A被賦值為90,操作newA 相當(dāng)于操作A。
????return 0;
}
本質(zhì)相同:
????int * newA = &A;//指針newA指向變量A的地址;
????int & newA = A;//引用變量newA為A的地址。
區(qū)別:
指針:A *pa = &a;
??????????pa->data =20;
??????????pa->func();
引用:A &ra = a;
????????? ra.data = 20;
????????? ra.func();
1、指針可以不初始化,或初始化為空,引用不行。
2、引用不允許二次指向。
3、非大量內(nèi)存操作時(例如數(shù)組),建議使用引用。
查看全部 -
純虛函數(shù)的寫法
class ClassA
{
????//定義
????public:
????????virtual int doWork() = 0;//純虛函數(shù)(父類不實現(xiàn),由子類實現(xiàn))
????????virtual int doWork();//虛函數(shù)
};
class ClassB
{
????public:
? ? ? ? int doWork()?
????????{
????????????printf("ClassB::doWork() is called");
????????}?
};
調(diào)用方法:
?int main()
{
????ClassA *ca = new classB();
?????ca->doWork();//調(diào)用了ClassB的doWork方法;
???? return0;
}
注意點:
1、虛函數(shù)在實現(xiàn)時,若子類需調(diào)用析構(gòu)函數(shù),父類的析構(gòu)函數(shù)在定義時需加上virtual 前綴,否則默認(rèn)調(diào)用父類的析構(gòu),子類的析構(gòu)無法被調(diào)用。
2、1中若構(gòu)造函數(shù)中開辟了新的堆內(nèi)存,有內(nèi)存溢出的風(fēng)險。?
查看全部 -
malloc函數(shù)是C語言中用于動態(tài)內(nèi)存分配的標(biāo)準(zhǔn)庫函數(shù).
在使用malloc函數(shù)之前,需要包含stdlib.h頭文件,以獲得該函數(shù)的聲明
調(diào)用malloc函數(shù)時,需要指定要分配的內(nèi)存大小,參數(shù)為size_t類型,表示要分配的字節(jié)數(shù)。例如 malloc(2*sizeof(int))
查看全部 -
0x0102轉(zhuǎn)化成0x0110
0001 0010
小端字節(jié)序 little endian (低地址)0010 0001 (高地址)? 大部分機器(電腦)
大端字節(jié)序 big endian (低地址)0001 0010 (高地址) IO方面(網(wǎng)絡(luò)細(xì)節(jié)序)
查看全部 -
&(與運算)參加運算的兩個數(shù)據(jù),按二進(jìn)制位進(jìn)行與運算。如果兩個相應(yīng)的二進(jìn)制位都為1,則該位的結(jié)果值為1,否則為0。
|(或運算)兩個相應(yīng)的二進(jìn)制位中只要有一個為1,該位的結(jié)果值為1。
^(異或)若參加運算的兩個二進(jìn)制位值相同則為0,否則為1。
~(取反)這是一元運算符,用于求整數(shù)的二進(jìn)制反碼,即分別將操作數(shù)各二進(jìn)制位上的 1 變?yōu)?0,0 變?yōu)?1。
<<(左移)各位全部左移若干位,高位丟棄,低位補 0 。
>>(右移)各二進(jìn)位全部右移若干位,對無符號數(shù),高位補 0 ,有符號數(shù),各編譯器處理方法不一樣,有的補符號位,有的補 0 。
查看全部 -
通常第一位為符號位,0代表正,1代表負(fù)
7
0111
1111 原碼 (帶符號位)
1000 反碼(除符號位取反)
1001 補碼 (反碼+1,為負(fù)數(shù)(-7))
查看全部 -
防止內(nèi)存泄露,用父類引用的時候,銷毀對象防止無法調(diào)用到子類析構(gòu)函數(shù)查看全部
-
所以,只要你的編譯器兼容 C++11 標(biāo)準(zhǔn),那么你應(yīng)該使用 nullptr。
查看全部 -
將父類的析構(gòu)函數(shù)聲明為虛函數(shù),作用是用父類的指針刪除一個派生類對象時,派生類對象的析構(gòu)函數(shù)會被調(diào)用。
此時如果析構(gòu)函數(shù)不加 virtual,那么 delete 父類指針的時候,子類的析構(gòu)就不會被調(diào)用,某些情況下會導(dǎo)致內(nèi)存泄漏。
查看全部 -
我們之前講述了什么是多態(tài),還用了一個例子,將一個指針的類型做成強轉(zhuǎn),然后調(diào)用 func 函數(shù),就會發(fā)現(xiàn), func 函數(shù)會隨著被強轉(zhuǎn)的類型的變換而變換,這種函數(shù)的關(guān)聯(lián)過程稱為編聯(lián)。按照聯(lián)編所進(jìn)行的階段不同,可分為兩種不同的聯(lián)編方法:靜態(tài)聯(lián)編和動態(tài)聯(lián)編。
查看全部 -
我們其
實可以把一個員工強行轉(zhuǎn)化成程序員,但是這就有可能出問題,就如同我們把 long long 轉(zhuǎn)成 int 就有可能出現(xiàn)問題。
int main(int argc,char **argv)
{
? ?Coder * coder = new Coder();
? ?Staff * staff = coder; // 隱式轉(zhuǎn)換就可以
? ?Coder * coder = (Coder *)staff; // 必須顯式轉(zhuǎn)換
? ?return 0;
}查看全部 -
我們之前已經(jīng)講過,可以為成員變量和成員函數(shù)設(shè)置權(quán)限修飾符來設(shè)置權(quán)限。但是這在繼承的時候就會產(chǎn)生一個問題:子類中是否要保持對父類成員的權(quán)限,而 C++ 將這個選擇權(quán)交給了程序員。
在 C++ 中,對父類成員的權(quán)限,子類中可以進(jìn)行重新的定義,這個定義就是通過繼承時候?qū)懙膒ublic 來實現(xiàn)的。
可以看到,我們在上述程序中使用了 public 修飾符,那么父類中的成員函數(shù)和成員變量將會保持父類的權(quán)限。這種是使用最廣泛的繼承方式,我們把它叫做公有繼承。
查看全部 -
private
用來指定私有成員。一個類的私有成員,不論是成員變量還是成員函數(shù),都只能在該類的內(nèi)部才能被訪問
int main(int argc,char **argv)
{
? ?A a;
? ?a.a = 15; // 會報錯,因為成員變量是 private 的
? ?return 0;
}public
用來指定公有成員。一個類的公有成員在任何地方都可以被訪問。
int main(int argc,char **argv)
{
? ?A a;
? ?a.a = 15; // 不會報錯,因為成員變量是 public 的
? ?return 0;
}protected
用來指定保護(hù)成員。一般是允許在子類中訪問
查看全部 -
要將對象分配到堆上,需要用到另外兩個關(guān)鍵字,new 和 delete。new 用來分配對象,delete 用來刪除對象。new 會返回一個指針,在使用完畢后,要通過 delete 把這個指針指向的地址釋放掉。
#include "Staff.h"
int main(int argc,char **argv)
{
? ?// 我們就這樣實例化了三個員工
? ?Staff * st1 = new Staff();
? ?Staff * st2 = new Staff();
? ?Staff * st3 = new Staff();
? ?// 記得釋放
? ?delete st1;
? ?delete st2;
? ?delete st3;
? ?return 0;
}查看全部 -
但是我們需要思考的是,什么情況下我們要返回一個指針,返回指針的時候需要我們注意些什么?
通常情況下,我們是希望為函數(shù)外提供一片內(nèi)存,例如,我們可以給函數(shù)外面提供一個數(shù)組。
int * func()
{
? ?int arr[] = {1, 2, 3, 4};
? ?return arr;
}但是這樣寫得話,程序會崩潰掉。原因是,arr 數(shù)組是一個局部變量,在 func 結(jié)束之后,其內(nèi)存就被銷毀掉了。此時在函數(shù)外面對其進(jìn)行操作,自然會出問題。所以,要完成這類操作,我們需要把內(nèi)存分配到堆內(nèi)存上面。
int * func()
{
? ?int * arr = (int *)malloc(4 * sizeof(int));
? ?return arr;
}這樣就沒有問題了,當(dāng)然,既然是分配在了堆內(nèi)存上,就要記得手動銷毀。
int main(int argc,char **argv)
{
? ?int * p = func();
? ?free(p);
? ?return 0;
}查看全部 -
字節(jié)序,就是 大于一個字節(jié)類型的數(shù)據(jù)在內(nèi)存中的存放順序。
計算機硬件有兩種儲存數(shù)據(jù)的方式:大端字節(jié)序(big endian)和小端字節(jié)序(little endian)。
我們現(xiàn)在有一個整數(shù)是258。用16進(jìn)制表示是0x0102,然后我們把這個整數(shù)拆分成兩個字節(jié),第一個字節(jié)為 0000 0001,第二個字節(jié)為 0000 0010。
如果在一個使用大端字節(jié)序的電腦上,這個整數(shù)會被這樣存放:
如果一個使用小端字節(jié)序的電腦上,這個整數(shù)的高字節(jié)就會存放在高地址上:
現(xiàn)在大部分的機器,都采用了小端字節(jié)序。但是在 IO 方面,則大部分使用大端字節(jié)序。例如,你要使用網(wǎng)絡(luò)發(fā)送一個 int 類型的變量,要先把 int 轉(zhuǎn)換成大端字節(jié)序,然后通過網(wǎng)絡(luò)發(fā)送。
大端字節(jié)序又被稱之為網(wǎng)絡(luò)細(xì)節(jié)序。
查看全部 -
<< 左移
各位全部左移若干位,高位丟棄,低位補 0 。
>> 右移
各二進(jìn)位全部右移若干位,對無符號數(shù),高位補 0 ,有符號數(shù),各編譯器處理方法不一樣,有的補符號位,有的補 0 。
查看全部 -
std::string 是 C++ 中用來存放字符串的類型查看全部
-
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
int main(int? argc,char ** argv)
{
? ? char source[20]={'a'};
? ? char* originP= source;
? ? *(originP+15)='c';
? ? *(originP+16)='d';
? ? *(originP+17)='e';
? ? *(originP+18)='f';
? ? *(originP+19)='g';
? ??
? ? char target[5]={'b','b','b','b','b'};
? ??
? ? char* targetP=target;
? ? ?std::cout <<"origin value:"<<? target[1] <<','<<target[1] <<std::endl;
? ??
? ? memcpy(targetP,originP+15,5);
? ? std::cout << "new value:"<<target[0] << ","<< target[1] <<std::endl;
? ? return 0;
}
查看全部 -
#include?<iostream> #include?<stdio.h> using?namespace?std; int?main() { ????int?a; ????cin>>a; ????cout<<a; ????return?0; }
查看全部 -
將指針指向數(shù)組,不需要使用取址符&,并且表示的是指針執(zhí)行數(shù)組第一個元素的地址:
int * p = arr 與 int * p = &arr[0]是相同的操作。
指針的加減法:
1. 想要讓指針p指向第二個元素,只需要p+1就可以了。?
注意:p+1的操作實際上是指針存放的地址+指針類型的大小。如果指針是一個int*的類型,則p+1就是向后移動4個字節(jié)的位置,如果是char*的類型,p+1則是向后移動2個字節(jié)的位置。
2. 指針支持p++、p--的操作
指針除了可以指向數(shù)組外,還可以指向一個結(jié)構(gòu)體。
查看全部 -
計算機中小數(shù)表示方法:
定點數(shù)容易造成空間浪費,
使用浮動的小數(shù)點:
?浮點數(shù)按照 IEEE754標(biāo)準(zhǔn)存放的,符號位1位,指數(shù)8位,尾數(shù)23位:
浮點數(shù)存在精度問題,當(dāng)場景中對精度要求較高,則不能使用浮點數(shù)存儲。
查看全部
舉報