常識點滴積累

       一些常識性的東西,用的時候需要查資料,比較麻煩,就在這記錄一下,爲了以後的方便。

4、linux下在當前目錄下根據文件名查找文件:

find | xargs grep tree

這樣可以在當前目錄以及子目錄下尋找文件名中有tree關鍵字的文件

ll | grep tree

只能在當前目錄下尋找,不能遞歸的查找子目錄下的文件。

 

1、linux下解壓gz文件,gzip  -d  filename  把文件解壓到當前文件夾

解壓rar文件,rar e xxx.rar  解壓至當前文件夾 

                      rar x  xxx.rar  解壓至xxx文件夾

2、python執行linux命令,最簡單的方法 os.system(commond)即可。

3、htop的一些解釋

左上角是cpu的使用情況,mem爲內存的使用情況,swap爲交換空間的使用情況。

右上角tasks爲進程總數,以及當前運行的進程數 load average爲最近1分鐘,5分鐘,10分鐘的平均負載情況。

uptime爲系統運行時間

下面從左至右分別爲:

PID:進程的標識號

USER:運行此進程的用戶

PRI:當前進程的優先級

NI:當前進程的優先級別

VIRT:當前進程佔用的虛擬內存

RES:當前進程佔用的屋裏內存

SHR:當前進程佔用的共享內存

S:當前進程的狀態 R表示正在運行  S表示休眠狀態 Z表示僵死狀態

CPU%:當前進程佔用CPU的使用率

MEM%:當前進程佔用的物理內存佔總內存的比例

TIME:該進程啓動後佔用CPU的時間

Commond:進程啓動的命令。

 

c++:

一、c++判斷一個數字是否在vector中,

       要先引入

#include <algorithm> //sort函數、交併補函數
#include <iterator>
find(tmp.begin(), tmp.end(), pHead2->m_Value) != tmp.end() 滿足這個條件就是在tmp中

        判斷字符是否在字符串中:

str2.find(s[i]) != str2.npos

       滿足這個條件就是s[i]在字符串str2中。

        c++刪除vector中指定的元素:

vector<int>::iterator it = nums.begin();
nums.erase(it);

      刪除nums中的第一個元素

   C++字符串str中刪除指定的字符:

str.erase(remove(str.begin(), str.end(), '"'), str.end());

要提前引入#include<algorithm>

 

c++中static關鍵字的作用:

在c語言中,static具有一下幾個特點:

(1)定義全局靜態變量:在全局變量上加上static關鍵字,改全局變量就成了全局靜態變量,具有如下特點:

         在全局數據取分配內存

         如果沒有初始化,默認爲0

        該變量在本文件內從定義開始到文件結束可見

(2)定義局部靜態變量:在局部變量上加上static關鍵字,具有如下特點:

        在全局數據區分配內存

        如果沒有初始化,默認爲0

        它始終駐留在全局數據區,直到程序運行結束

        其作用域爲局部作用域,當定義它的函數或語句塊結束時,其作用域隨之結束。

(3)定義靜態函數

         靜態函數只能在本源文件中使用

        在文件作用域中聲明的inline函數默認爲static

在c++中,具有如下特點:

        內存分配:在程序的全局數據區分配

       初始化和定義:靜態數據成員定義時要分配空間,所以不能在類聲明中初始化(但是static const 可以在類的定義中初始化) 

        靜態成員函數。靜態成員函數與類相聯繫,不與類的對象相聯繫。靜態成員函數不能訪問非靜態數據成員。原因很簡單,非靜態數據成員屬於特定的類實例,靜態成員函數主要用於對靜態數據成員的操作。靜態成員函數不能被聲明爲const,和虛函數,靜態成員函數是類 的組成部分,而不是類對象的組成部分。

       靜態成員函數沒有this指針。

       類中靜態成員變量的訪問,是需要類名::變量名

int func(){
    static int count = 10;
    return  count--;

}

class Object{
public:
    static int m;
};

int Object::m = 10;

int main(){

    for (int i=0; i<5; i++)
        cout<<func()<<endl;

    cout<<Object::m<<endl;

    return 0;
}

   func函數輸出10 9 8 7 6   後面輸出count的值爲10

二、C++的多態

        C++的多態(polymorphism)是通過虛函數來實現的,虛函數允許子類重新定義成員函數,而子類重新定義父類的做法稱爲覆蓋(override),或者稱爲重寫。

        虛函數是函數前面加上關鍵字virtual,

        當子類重寫父類函數時,如果父類不是虛函數,即沒有利用C++的多態性,則利用基類指針(或根據指針的類型)調用相應的函數的時候,將總被限制在基類函數本身,而無法調用到子類中被重寫過的函數。這種稱爲"早綁定",也就是在編譯期間就取定了要調用的函數。

        如果父類是虛函數,即函數前面有virtual關鍵字,調用函數是根據指針指向的內容的類型(對象類型) 來取定調用的方法,即“晚綁定”。虛函數 是在基類中使用關鍵字 virtual 聲明的函數。在派生類中重新定義基類中定義的虛函數時,會告訴編譯器不要靜態鏈接到該函數。我們想要的是在程序中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱爲動態鏈接,或後期綁定

看代碼:

//
// Created by greg on 18-9-8.
//
#include <iostream>
using namespace std;

class A{
public:
    void foo(){
        cout<<"1"<<endl;
    }
    virtual void fun(){
        cout<<"2"<<endl;
    }
};

class B: public A{
public:
    void foo(){      // 重寫父類函數,但是父類函數不是虛函數,即靜態鏈接(靜態多態) 也就是被“早綁定”  函數調用在程序執行前就準備好了
        cout<<"3"<<endl;
    }

    void fun(){  // 重寫父類函數,但是父類函數是虛函數,會告訴編譯器不要連接到父類函數,要跟覺調用的對象類型來確定鏈接的函數,是“晚綁定”
        cout<<"4"<<endl;
    }
};


int main(){
    A a;
    B b;

    A *p = &a;
    p->foo();   // 輸出1
    p->fun();   // 輸出2

    p = &b;    // p此時的指針類型爲 A, 但是它指向的對象爲 B
    p->foo();  // 輸出1   foo()不是虛函數,根據對象指針類型指向基類
    p->fun();  // 輸出4   fun()是虛函數,根據指向的對象類型實現子類的函數  此時看的指針指向的內容而不是指針的類型  體現多態性



    a.foo();   // 1
    a.fun();   // 2

    b.foo();   // 3
    b.fun();   // 4

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章