學C++有多難,你知道嗎?
都2020年了,還要學C++嗎?C++好多理工科大學裡面都有,它的學習難度比其他程式語言比如Python, Javascript, 和Java等等難。那為什麼呢?
C++難的原因有三個基本點:
提供抽象的同時也貼近硬體模型
Zero-overhead的抽象
相容C
詳細展開
例子一
請問下面的程式碼能正確編譯連結嗎?
//book.cpp class Book { public: static int Count; Book() = default; ~Book() = default; } int main() { Book::Count += 1; }
答案是不能!class Book後面右花括號要有分號! 哪裡?如果你寫過Java,你會更吃驚!按我們的書寫習慣,Book的右花括號已經可以表明類結束了。但是為了相容C,分號必須要有。為什麼呢?因為C裡面可以書寫下面的程式碼
struct Book { } book;
這樣子定義了一個名為book的Book變數。所以C++也需要在定義類的結尾時候書寫分號。這個分號我無數次忘記,幸好現在的IDE比較智慧,都會提示出來。
把分號添加了以後,我們能成功編譯嗎?不能,因為不能成功連線。如果用下面的命令編譯
g++ -std=c++11 book.cpp -o book error是 Undefined symbols for architecture x86_64: "Book::Count", referenced from: _main in book-b5397d.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)
!!??這又是為什麼?那是因為 Count只是被聲明瞭,而沒有定義。在Java裡面這個程式碼完全沒有問題!我第一次寫的時候,也吃驚(我之前寫過Java。)最後是萬能的Google幫忙解決了。這是因為C++區分宣告和定義:宣告是為了引入一個名字,定義是將名字賦予實體。
那如果我們直接初始化count為2呢?還是不行,得到的錯誤是
book.cpp:4:14: error: non-const static data member must be initialized out of line static int Count = 2; ^ ~ 1 error generated.
錯誤提示我們要對count進行定義並且"out of line"。 啥叫out of line?比如在int main()全面初始化
//book.cpp class Book { public: static int Count; Book() = default; ~Book() = default; }; int Book::Count = 2; int main() { Book::Count += 1; }
這麼簡單的程式碼,我們經過了這麼多次修正才正確編譯!直到現在,C++17終於意識到,我們也需要像Java那樣簡簡單單在類中定義一個靜態變數,引入了inline static variable。所以如果我們使用C++17,那麼上面的程式碼可以寫成
//book.cpp class Book { public: inline static int Count = 2; Book() = default; ~Book() = default; }; int main() { Book::Count += 1; }
例子二
下面的程式碼有什麼錯誤?
//把Book 類拷貝到這裡
class MyBook:public Book { public: void print() { std::cout<<"my book\n";} } int main() { Book book = new MyBook(); }
例子三
遇到下面的問題,怎麼入手
: undefined reference to symbol ‘AtlComPtrAssign’ libmylib.so: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status
例子四
程式crash了怎麼看core dump?
例子五
三五構造器記得怎麼寫嗎?
例子六
Segment Fault 是什麼?
……
C++太難了!光靠自己是沒辦法學明白的。因為學習從來不是一個人的事情,要有個相互交流與監督的夥伴一起學習,才會享受其中的快樂哦!C/C++零基礎程式設計學習,從現在開始!
“點選連結”加入