作者  dryman (乾寶搜神記)                                  看板  development 
 標題  Re: [研究] C++版本問題                                                 
 時間  Wed Jun  7 21:43:34 2023                                               
───────────────────────────────────────

我建議的C++學習優先順序

1. 學習版本最好要是C++11以上(個人偏好C++17以上)
最主要的差別在smart pointer及lambda
對初學者來說,如果要挑一個重要功能來學,絕對要學smart pointer
編譯的時候加上-std=c++17就能調用想要的C++版本
其實並不難
我自己慣用的編譯指令就是
g++ -Wall -O3 -std=C++17 input.cc -o output
-Wall是warn all
-O3是optimize at 3rd level
-std=C++17是指定C++17的語法及功能

愈新的語法,功能當然就愈多,但這不代表你全部都要學
新的語法中有一兩項能讓bug變得更不容易出現,就值得你以新的語法為學習標的
專注學那一兩項功能就好

2. class要學,不過template只要先學別人寫好的功能怎麼用就好
(例如使用std::vector, std::unordered_map等等)
我記得你之前卡class卡很久
說明class最簡單的方法就是它提供了封裝

你已經熟悉一般function
如 int my_fun(int a, int b);

如果要處理內部有大量變數的function,純C會這麼寫

struct MyStruct {
  int a;
  int b;
};

int fun_that_process_MyStruct(MyStruct* s);

如果你有多個要處理MyStruct,那function就很容易撞名,相當麻煩

class MyClass {
public:
  int my_fun1() {
    // can access a and b
  }
  int my_fun2(int c) {
    // get c and interact with a and b
  }
private:
  int a;
  int b;
};

將處理a與b的東西「包裝起來」,然後多個處理他的函數也不會撞名
這就是封裝很直接的好處

3. scope, RAII, and smart pointer
C++98及之前,寫C++都要自己管理new & delete
這非常的容易出bug

舊的程式會這麼寫
MyClass* a = new MyClass();
...
delete a;  // 沒有在正確的時間點delete,會造成程式crash

新的程式則是
std::unique_ptr a = std::make_unique();

它內部會自動幫你處理new & delete的配對
std::make_unique 是C++14才有的功能

4. C++標準函式庫及資料結構
意即std::vector, std::unordered_map
https://en.cppreference.com/w/cpp/container

這些應該算是新手軟工被期待要很熟悉的東西

5.
你有電機背景,如果能熟計算機結構應該會跟你過去所學連結的更好
現代編譯環境中使用組合語言其實能輕易的混入C/C++裡面
調用的時候基本上就像呼叫函數

6.
根據你職稱內容不同,也許C++不一定能幫助你工作那麼多
如果你要從底層刻一個高效能的系統,那C++不能避免
然而如果工作性質是要作資料分析
那C++真的不適合,新手來寫效能不好,也很容易出錯
學習python後,將多餘的精力用在學數值分析及統計還比較划得來
很多統計或AI博士也都只熟悉python而已

--
※ 發信站: 批踢踢兔(ptt2.cc), 來自: 98.7.196.62 (美國)
dryman:另外,學工程最重要的就是除了學會方法,更要知道這方法  推 06/07 21:56
dryman:是用來解決什麼問題。如果這問題是你關注的,那就自然會  推 06/07 21:56
dryman:記住。如果是不相關的,那暫時放一邊也沒關係。          推 06/07 21:57
dryman:比較新的C++,其能解決的問題當然比舊版本多。           推 06/07 21:57
dryman:其中又以C++11用smart pointer解決記憶體管理的問題最    推 06/07 21:58
dryman:重要。所以所有人都會推薦你要學C++11或以上             推 06/07 21:58
georgemouse:推,越後面版本的C++也實裝越多學會就不會踩到坑的  推 06/08 02:17
georgemouse:語法,所以可以的話就挑較新版本的學,因為版本制定 推 06/08 02:18
georgemouse:時也是隨著時代演進,當大家都遇到類似的問題才會討 推 06/08 02:18
georgemouse:論能不能從語法上就迴避掉坑,而不是要求工程師都能 推 06/08 02:19
georgemouse:通靈出坑在哪邊。                                 推 06/08 02:19
lc85301:jamtu 裝 devC++ 的話高機率是用 windows               推 06/08 14:42
lc85301:5 我持保留,這年頭除非必要不然我很少遇到組語了       推 06/08 14:45
alen3321:路人請問這篇可以轉嗎?                               推 06/09 10:11