1. 程式人生 > >C++ 快速學習(一)

C++ 快速學習(一)

總感覺學計算機不該只關注計算機技術,結合計算機技術做一些跨領域
的事情會更有意義。計算機視覺是一個不錯的方向,鑑於影象處理一般用C++的場景比較多,決定先從C++入手。

預備知識

熟悉C、Java、Python任意一門語言,瞭解程式語言的通用特性:資料型別、流程控制、函式、面向物件、檔案IO、網路。

一. C++的語言特性

1 初始化方式,C++支援賦值符號=之外的初始化方式。

int a = 1024;
string a = "aaa"
int a[5] = [0,1,2,3,4]

int a(1024) // 新的賦值方式
string a("aaa") 
int a[5
]{0,1,2,3,4} vector<int> iv{1, 2, 3}; map<int, string>{{1, "a"}, {2, "b"}}

2 型別推測與空指標

  • C++11中可以自動推到資料型別,建議使用型別推導,關鍵字為auto

  • 型別反推特性。類似於auto的反過程。

  • 使用nullptr來代替NULL,使空指標的意義更加明確。

auto* p = new Person();

int a = 10;
decltype(a) b = 20 ; // 型別檢測

int* p = nullptr;

3 for迭代器與lambda表示式

  • 使用for可以進行for…in遍歷
  • 使用lambda函式,形式為 =-> 函式體
// 類似於java,使用for...in進行迭代
map<string, int>  m{{'name',12}, {'age',14}};
for(auto p: m){
    cout <<
}

auto func = [=](int& a)-> {reutrn a+10};
auto func = [b](int& a)-> {reutrn a+10};
// 中括號中等號表示lambda中能範圍所有全域性變數
// 中括號中b,表示lambda中能訪問外圍b

4 引用、指標與const

  • 引用相當於取別名

  • 指標表示記憶體地址

  • const修飾在誰的前面,誰就是不可變的。

    const int* p = 10; // 常量的指標,*p不能被重新賦值
    int a = 999;
    int* const p =  & a; // 指標常量,表示指標p不能被重新賦值

5 進位制轉換

    using namespace
    int a = 10;
    int b;
    cout << 'hex' << a;
    cout << 'oct' << a;
    cout << 'bin' << a;

6 字串與整型的互相轉換

藉助於sstream

#include <sstream>

stringstream ss();
int a = 10;
ss << a;

return ss.str()

二. C++面向物件之封裝性

類的結構
C++中完整類的定義一般是分檔案寫的,例如Person類有Person.h和Person.cpp組成,.h檔案負責定義屬性和方法(類似介面,只定義不實現),而.cpp檔案對.h檔案中的定義的方法進行實現。

//  #### Person.h
class Person {
private:
    string name;
    int age;
    string gender;

public:
    Person(); // 構造
    ~Person() // 析構
    Person(const Person& ); // 拷貝建構函式
    string toString();
}

// #### Person.cpp 實現標頭檔案中定義的方法
Person::Person(){
    cout << "建構函式"
}

~Person::Person(){
    cout << "解構函式"
}

string Person::toString(){
    return this -> name;
}

物件的初始化

C++中初始化方式有兩種:從堆中初始化和從棧中初始化。從堆中初始化需要手動去申請記憶體,從棧中初始化時系統自動管理記憶體。

這裡寫圖片描述

建構函式初始化列表
建構函式在實現時,可以通過初始化列表物件的成員進行賦值。


 // Person.h
class Person{
private:
    string _name;
    int _age;
public:
    Person(string name, int age);
    toString():
}

 //Person.cpp
 #include "Person.h"
 #include <iostream>
 using namespace std;

Person::Person(string name, int age):_name(name),_age(age){
}

Person p('hk', 10); // 初始化物件

深拷貝、淺拷貝與拷貝建構函式
通過賦值、傳值、初始化引數得到的物件均會呼叫拷貝建構函式,預設拷貝建構函式只會做淺拷貝,如果需要深拷貝,需要在拷貝建構函式中進行處理。


Person p('hk', 12);
Person p_1(p); // 呼叫拷貝構造
auto p_2 = p_1; // 呼叫拷貝構造
// 通過傳值傳遞如函式的物件、通過return在函式中返回的物件,均會呼叫拷貝構造。

// 當物件有物件型別的成員,則需要進行深拷貝

class Point{
private:
    int _x;
    int _y;
public:
Point(int x, int y):_x(x),_y(y){}
}

class Line{
private:
    int _count;
    Point _p;
public:
    Line(x,y,count):_count(count){
        _p(x,y); //例項化Point物件
    }
}

// 針對Line物件,其中包含物件成員Point,在需要深拷貝的場景下,預設拷貝構造無法滿足需求,需要特殊定義。

Line(const Line &cp_line){
    cp_line.count = this -> count;
//  cp_line.p = this. -> p;  //只能實現淺拷貝
    cp_line.p = Point p(this->x, this->y); // 深拷貝
}

在C++物件中直接返回this代表的物件時,也會觸發拷貝構造,因此返回的並不是原物件,而是一個新物件。
這裡寫圖片描述

二. C++面向物件之繼承性

C++中呼叫父類方法的寫法(同樣適用於呼叫父類建構函式)

class Person{
private:
    string name;
    int age;
public:
    Person(string name, int age):name(name), age(age){}
    void say(){
        cout << "Hello world!";
    }
}

// 繼承的寫法
class Female:public Person{
private:
    bool longhair;
public:
    // 建構函式通過:符號呼叫父類構造,通過longhair初始化本類引數
    Female(string name, int age, bool longhair)
        :Person(name, age), longhair(longhair){
    }

    void action(){
    // 關於父類的呼叫,java用super,C#用base,而C++用父類的名字
        Person::say(); // 通過這樣的方式呼叫父類的方法
    }
}

相關推薦

C++ 快速學習

總感覺學計算機不該只關注計算機技術,結合計算機技術做一些跨領域 的事情會更有意義。計算機視覺是一個不錯的方向,鑑於影象處理一般用C++的場景比較多,決定先從C++入手。 預備知識 熟悉C、Java、Python任意一門語言,瞭解程式語言的通

C++語言學習——C++簡介

產品 泛型 alt 科學計算 內容 實現 .com 運算符 ces C++語言學習(一)——C++簡介 一、C++簡介 C 語言作是結構化和模塊化的語言,適合處理較小規模的程序。對於復雜的問題,規模較大的程序,需要高度的抽象和建模時,C語言並不合適。為了解決軟件危機, 20

C語言學習

C語言的順序結構,迴圈結構,選擇結構等,都是重要的的結構。今天編寫了判斷年份的程式以及花工資的程式,還有一個判斷素數的程式現在還沒有結果,還需要仔細研究 判某一年是否閏年。 輸入:年(year) 計算:判是否閏年 輸出:閏年或非閏年(leap) 閏年條件: 能被4整除,但不

Caffe 的 C++介面學習

Segnet-Caffe C++ 學習筆記 從之前的Segnet-Slam程式碼中設定斷點進行除錯: // OpenCV #include <opencv2/core/core.hpp> #include <opencv2

GUN C中的socket學習

ipp 區分 如果 raw 文件表 一起 通訊 res 概念   socket是用於通信的工具。   套接字其實是一個廣義上的進程間通信的信道。就像pipe一樣,在GUN環境下socket也被用一個文件表示。不同的socket文件可以用於不同的進程間通信,甚至可以用來在網絡

設計模式學習筆記 C#代碼

內容 編程 繼承 color 模式 c# 派生類 ive spa 《深入淺出設計模式》學習筆記第一章 原始需求和設計 事情是這樣開始的,公司需要做一套程序,鴨子,設計如下: 一個鴨子父類,多個派生類,三個可override的方法。 第一次需求變更 我們要會飛的鴨子!!!!

C# 異步編程學習

apm 結果 mic public b- num row worker inf 異步 編程 可在 等待 某個 任務 完成時, 避免 線程 的 占用, 但要 想 正確地 實現 編程, 仍然 十分 傷腦筋。 . NET Framework 中, 有三種 不同 的 模型 來 簡化

07 React+Ant Design學習——快速構建一個主頁

      通過對React.js一週左右的學習後,就想著自己寫一個主頁,在這一週的學習中雖然對react元件化開發的思想有了較深的理解,但自己還是很迫切的希望能動手結合Ant Design寫出來一個主頁。因為當初學react的目的就是為了學習怎樣使用Ant Des

lua原始碼學習lua的c api外圍實現

工作後,整個人已經比較鬆懈了。儘管一直在看lua的原始碼。可是一直是比較零碎的時間,沒有系統的整理,所以還是收穫不多。由於近期工作也不是非常忙了,就想整理下lua的原始碼學習的筆記。加深下印象,並分享給大家。 先說下這系列bolg我會每週更新2-3篇,沒有順序的 這些文章

lua源代碼學習lua的c api外圍實現

在操作 時間 struct ack cti 壓棧 c api field stat 工作後,整個人已經比較松懈了。盡管一直在看lua的源代碼。可是一直是比較零碎的時間,沒有系統的整理

深度學習——deepNN模型實現攝像頭實時識別人臉表情C++和python3.6混合程式設計

一、背景介紹 最近需要做人臉識別方向的東西,就被分配了新的任務,利用攝像頭實時檢測人臉表情,並製作成一個小軟體,這裡當然要用C++實現,並用C++做成一個介面。 由於博主之前用python做過類似的小程式,因此這裡的模型實現主要採用了python,為了用C++實現介面,這裡採用C++呼叫py

侯捷C++學習

//c++學習//標準庫非常重要//要規範自己的程式碼complex c1(2,1);complex c2;complex* pc = new complex(0,1);string s1("Hello");string s2("world");string* ps #include<iostream

c++學習

//判斷是否是迴文數 #include"pch.h"#include<iostream>using namespace std;bool systm(unsigned n){ unsigned i = n; unsigned m = 0; while (i>0) { m = m * 10

Write a Shell in C 學習

自己的C很差很差,所以趁著這一次寫一個shell的作業來提高一下自己C的程式設計水平。 希望此筆記可以使初學者毫無阻礙的寫成一個shell,並對每一個句子知其所以然。 由於我本人亦是初學者,內容難免謬誤多多,望大神指導海涵。 要寫一個shell出來,同時作為一個

C#反射的學習--獲得成員資訊

using UnityEngine; using System.Collections; using System; using System.Reflection; public class Reflection_Test : MonoBehaviour { // Use this for ini

C++】C++類的學習——初識類

前言       C++在C語言的基礎上做了一些改進,使得C++具有了面向物件程式設計(Object Oriented Programming,OOP)的特性。其中最重要的改進就是提供了類的概念。可以說學習了C++卻不會使用類的話,那麼就沒有學習到C++的精髓。       

機器學習快速入門線性分類器

定義 假設特徵與分類結果存線上性關係的模型,這個模型通過累加計算每個維度的特徵與各自權重的乘積來幫助類別決策。 線性關係公式 :f(w,x,b)=w^tx+b x=(x1,x2,…xn) 代表n維特徵列向量,w=(w1,w2,…wn)代表對應的權

基於c++的網路開發庫boost.Asio學習 Ubuntu安裝boost以及問題解決

執行環境:Ubuntu 12.04   版本: boost 1.68 下載網址:http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download

MySQL快速入門—Java進階學習第十五天

文件版本 開發工具 測試平臺 工程名字 日期 作者 備註 V1.0 2016.05.09 lutianfei none

c++ 準標準庫學習 -- 持續更新

環境搭建---網上查詢 本人測試環境Ubuntu16.04 #include <iostream> #include <boost/version.hpp> #include <boost/config.hpp> using n