C++:随笔1
面向對象(oo):對象最終分為兩個要素:屬性(是表明了你這個類的特征,類中的變量)和行為(是你生成的這個對象他的一個動作,類中的方法)。
1封裝:意味著把對象的屬性和方法結合成一個獨立的系統單位,并盡可能隱藏對象的內部細節。
2抽象:抽象的過程是對具體問題概括的過程,是對一類公共問題進行統一描述的過程
3繼承:子類對象擁有與其基類相同的全部屬性和方法。
4多態:是指在基類中定義的屬性和行為被子類繼承后,可以具有不同的數據類型或者表現行為等特性。(在相同的同時可以發展你的特性)
動物這個基類,它的子類就會有老虎,兔子等。作為動物有一個行為定義為Move(),那么這些子類繼承下來后會根據自己的特性采取不同個性的Move()方式(走跑飛等不同的Move)。
數組求和C語言方案:
由于數組名是他的第一個元素的地址,所以數組和指針他們有一些相關性,但他們又不是完全等同,
#include<stdio.h>
#include<iostream>
int addArray(int arr[],int n);using namespace std;
int main()
{int data[] = { 0,1,2,3,4,5,6,7,8,9 };int size = sizeof(data) / sizeof(data[0]);printf("實參數組data大小:%d\n", sizeof(data));//1輸出40(是整個數組的長度)printf("和為:%d\n", addArray(data,size));//4為什么沒有當作一個數組?//因為這里傳過來他是把它當作一個地址,她不可能說把整個數組元素都傳過來,這樣效率太慢了。//(因為數組是連續存放的,他不如把第一個元素的地址當作指針傳過去,接著你要索引依次遞推索引到你需要的元素)//所以在3處實參傳遞的時候它是當指針傳過來的return 0;
}
int addArray(int arr[], int n)//3所以在整個整個函數里面所有的srr其實被當成一個指針
{int i , sum = 0;printf("形參數組arr大小:%d\n", sizeof(arr));//2輸出8(8個字節)(是一個指針變量的長度)(是一個地址長度)(因為在64為系統里面就是8個字節存放一個地址)for (i = 0; i < n; i++){sum += arr[i];cout << sum << endl;} return sum;
}
更改一下:
#include<stdio.h>
#include<iostream>
int addArray(int *arr,int n);//不定義為一個數組了直接定義為一個指針using namespace std;//名稱空間。C++標準庫所使用的所有標識符(類,函數,對象等的名稱都是在一個同一個特殊的名稱空間(std中來定義))
int main()
{int data[] = { 0,1,2,3,4,5,6,7,8,9 };int size = sizeof(data) / sizeof(data[0]);printf("和為:%d\n", addArray(data,size));//傳過來傳一個地址過來(因為數組名就相當于數組的首地址)//cout<<"結果是:"<<addArray(data,size)<<endl;//endl是回車加清空緩沖區的意思return 0;
}
int addArray(int *arr, int n)//地址傳過來用一個指針接收
{int i , sum = 0;for (i = 0; i < n; i++){sum += *arr++;//用指針來索引(arr++是地址遞增,前邊加*號是取值)} return sum;
}
得出結論:將函數的參數聲明為數組和聲明為指針是一樣的。
C語言中使用printf實現輸出,但是printf是一個函數,
而上述C++中使用的是cout輸出,而cout是一個對象。cout是一個輸出流對象,他是console out(控制臺輸出)的縮寫,是屬于basic_ostream類的對象,ostream類在iostream頭文件中定義。(類就是一類事物的抽象集合在一起就是一個類,比如人是一個類,亞洲人是一個類的繼承,中國人是一個小類。)
流對象cin,這個對象的類型是istream,他知道如何從用戶終端讀取數據。
cin>>i;//cin,操作符又稱為提取操作符,它依次從輸入流對象cin提取一個整數。(遇見空格或者Enter鍵就說是一個整數。)
當用戶進行鍵盤輸入時,對應的字符將輸入到操作系統的鍵盤緩沖區中,這樣當用戶點擊鍵盤上的Enter鍵時,操作系統把鍵盤緩沖區的內容傳輸到cin流的內部緩沖區(就是stdin這個流緩沖區),“>>”操作符隨后從這緩沖區提取需要的信息。
using namespace std;//名稱空間。C++標準庫所使用的所有標識符(類,函數,對象等的名稱都是在一個同一個特殊的名稱空間(std中來定義))(一切變量都包含在這個名稱空間里面,要引用這個空間里的變量,必須要把這個空間給套出來)(如果沒有這條指令,我們可以使用std::cout這樣的語法來調用輸出流對象)
PS:重載就是賦予一個舊事物新的意義。“>>”最初定義為右移操作符,它在C++中進行了重載,當它按照這里所示的方式使用時,他就用于從輸入流對象提取信息。
C語言和C++一樣,字符串是以0結尾的。
cin.ignore(n);//忽略前n個字符;
cin.getline(buf,n);//獲取輸入的n個字符(字符串要包含自動后邊添加的0所以是一共獲取了實際的n-1個),放在buf緩沖區中。
cin.peek();//從字符里面挑取字符
cin.get();//獲取字符
cin,gcount();
cin.read();
cout.write();
cout.precision();
cout.width();
--------文件的I/O:
編寫一個文件復制程序,將一個文件復制到另外一個文件。*(例如:fileCopy,sourceFile,destFile)(意思就是有一個fileCopy.exe程序,將source.c拷貝到destFile.c)
int main(int argc,char*argv[]);
//在程序中,main有兩個參數,整型變量argc和字符指針數組argv[];
//argc的含義是程序的參數數量,包含本身(就是程序自身生成的exe)。
//argv[]的每一個指針指向命令行的一個字符串,所以argv[0]指向字符串“copyFile.exe”,argv[1]指向字符串...,argv[2]指向字符串...。
//C語言版本
...
int main(int argc,char* argv)
{FILE *in,*out;//in和out是我們聲明的兩個文件指針,它們的類型都是FILE*,分別u走位兩個I/O流對象使用(如何理解文件指針,好端端的文件他是存放在磁盤上的,當我們要用到她的時候,必須要暫時把他們拿到內存中,拿到內存中地址是隨機分配的,我們不知道地址怎么訪問它,我們就必須定義兩個指針(因為指針變量里邊存放的就是地址),那知道了他的地址才能對他進行操作,所以我們打開之后,就是把地址傳給我們定義好的文件指針in和out通過in和out這兩個我們就能知道文件的地址,間接能夠對文件進行操作)int ch;if(argc!=3)//為了確保程序參數個數的正確性{fprintf(stderr,"輸入形式:copyFile 源文件名 目標文件名\n")//意思就是輸入的參數不是三個的話,就要提示輸入參數形式為....}if((in=fopen(argv[1],"rb"))==NULL)//以二進制可讀的方式打開文件并返回文件指針給in{fprintf(stderr,"打不開文件:%s\n",argv[1]);//后邊兩個參數分別是即將被復制的文件和復制后生成的新文件名,先判斷這兩個文件是否可以打開或者寫入exit(EXIT_FAILURE);//終止}if((out=fopen(argv[2],"wb"))=NULL)//以二進制可寫的方式打開文件并返回文件指針給out{fprintf(stderr,"打不開文件:%s\n",argv[2]);//第三個元素打不開,把這提示信息寫入了錯誤輸出流stderr,然后他會自動顯示在我們的顯示器上,(意思就是未能成功打開我們會像標準錯誤流stderr發送一條信息)fclose(in);//因為只有上邊打開了你才能執行到這一步,所以打開后要關閉exit(EXIT_FILURE);}
//getc()函數從一個輸入流(stdin)讀取一個字符,putc()函數把這個字符寫入到輸出流(stdout)while((ch=getc(in))!=EOF)//EOF其實是個宏定義等于-1(文件的結尾一般都是EOF以-1標志結束)//在這里輸入流是這個文件流in,獲取一個字符,然后給了字符ch(上邊定義的是int型為什么沒有定義char呢?因為getc()函數返回值是int類型){//到結尾的話就不應進行循環了,因為循環體內的內容就是把這個ch寫進out這個文件里面去if(putc(ch,out)==EOF)//同時進行檢查如果他是一個寫入文件結尾標志的話他就進行下面語句內容break跳出循環{ break;}}//(因為上邊EOF有兩個意思:第一讀取錯誤,第二是文件結束)所以下邊兩個語句是對文件進行檢查,是哪個意思if(ferror(in)){printf("讀取文件 %s 失敗!\n",argv[1]);}if(ferror(in)){printf("寫入文件 %s 失敗!\n",argv[2]);}printf("成功復制一個文件!\n");fclose(in);fclose(out);//把兩個關掉return 0;}
C++版本
#include<Fstream>//是文件流File stream
#include<iostream>//事實Fstream已經包含了iostream
using namespace std;
int main(int agc,char* argv[])
{ifstream in("test1.txt",ios::in);if (!in)//如果他返回0的話(就是文件打開失敗),再非0就為真{cerr << "打開文件1失敗" << endl;return 0;}ifstream out("test2.txt",ios::out);if (!out)//如果他返回0的話(就是文件打開失敗),再非0就為真{cerr << "打開文件2失敗" << endl;return 0;}char x;while (in >> x)//1">>"這里這個操作符被重載過了,它又變成流了,這種文件里面in流到了這個字符x里邊去,每次流一個過去{out>> x;//2然后再從x流到cout這個輸出終端,最后循環嘛}cout << endl;in.close();//關閉out.close();
}
#include<Fstream>//是文件流File stream
#incluede<iostream>//事實Fstream已經包含了iostream
using namespace std;
int main()
{ifstream in;//輸入文件流ifstream(input file stream)是Fstream這個頭文件報刊的一個類,一個文件輸入流的一個類,這個類定義了一個對象in(那么這個in就擁有了這個類的所有功能(屬性和函數))。in.open("test.txt");//in有一個函數就是open
//上邊可以將兩句合成一句寫為:ifstream in("test.txt");//不用open直接帶參數的對象if(!in)//如果他返回0的話(就是文件打開失敗),再非0就為真{cerr<<"打開文件失敗"<<endl;return0;}char x;while(in>>x)//1">>"這里這個操作符被重載過了,它又變成流了,這種文件里面in流到了這個字符x里邊去,每次流一個過去{cout<<x;//2然后再從x流到cout這個輸出終端,最后循環嘛}cout<<endl;in.close();//關閉return 0;
}
C語言是用了一個指針FILF*類型指針就可以直接指向我們這個內存中的文件的一個地址,C++中通過一個類通過一個對象,這個對象還是專門拿來輸入的,再來通過這個對象的訪問它的成員函數訪問來對這個文件進行操作。
文件的讀取類:ifstream。
文件的寫入類:ofstream。
#include<Fstream>//是文件流File stream
#incluede<iostream>//事實Fstream已經包含了iostream
using namespace std;
int main()
{ofstream out;//類的對象和聲明變量是一樣的,把out改成其他也行的out.open("test.txt");//out是指向了test.txt這個文件//打開就是把他從磁盤加載到內存
//上邊可以將兩句合成一句寫為:ofstream out("test.txt");if(!out){cerr<<"打開文件失敗"<<endl;return0;}for(int i=0;i<10;i++){out<<i;//利用循環把0到9,從變量i流到了out指針里面去,流到了out文件里面去(因為上邊out是指向了test.txt這個文件)(怎么流呢,看他往哪指就流到哪)(如果源文件里邊有東西就會被覆蓋掉)}cout<<endl;//endl就是回車out.close();//關閉return 0;
}
以上代碼在創建一個ifstream和ofstream類的對象時,將文件的名字傳遞給他們的構造函數(暫時理解為對象默認使用的函數(方法))。
上述還可以接受兩個參數:
ifstream in(char* filename,int open_mode);
//第一個是指針指向了文件名(他是一個字符串)
//open_mode表示打開模式,氣質用來定義怎么的反射光hi打開文件(跟open的參數一樣)
模式見下圖
(什么是文本形式,什么是二進制形式?沒有翻譯為一堆數據那他就是文本形式)
圖:
例子:
#include<Fstream>
#incluede<iostream>
using namespace std;
int main()
{ofstream out("test.txt",ios:app);//就是以添加的形式打開if(!out){cerr<<"打開文件失敗"<<endl;return0;}for(int i=0;i<10;i++){out<<i;}cout<<endl;//endl就是回車out.close();//關閉return 0;
}
以多種模式并存的方式打開:(使用OR操作符:“|”)
#include<fstream>
#include<iostream>
using namespace std;
int main()
{ fatream fp("test.txt",ios::in|ios::out);//對象命名為fp//同時以可讀和可寫入形式打開if(!fp){cerr<<"打開文件失敗!"<<endl;}fp<<"I LOVE";//將這些字符"I LOVE"流進去fp
//上邊的內容是把字符串流入了我們的文件中
//下邊是通過str顯示static char str[10];//靜態的數組,為了定義他不能夠被改變。fp.seekg(ios::beg);//ios::beg使得文件指針指向文件頭;ios::end就是文件尾。fp>>str;//把fp的內容給了數組cout<<str<<endl;//把數組顯示fp.close();return 0;
}
0x1 |0x2=11主要看這個位有沒有數字,如果有他就實現該為對應的模式。
?
總結
- 上一篇: ladar:16线激光雷达(雷神)
- 下一篇: C++:随笔2--I/O实践