C++自修入門實境秀、C++ Primer 5版研讀秀 11/ decltype~頁76 2.6.3. Writing Our Own Hea...
1:00 唯有在decltype的定義中,參考才有可能不會是它所參考的物件的代名詞(同義詞)
It is worth noting that decltype is the only context in which a variable defined as a reference is not treated as a synonym for the object to which it refers.
值得注意的是,decltype是定義為參考的變數不會被當作其所指涉的物件之同義詞的唯一情境。
⑦先抓動詞 ⑧找對主詞 is not treated as的主詞是「a variable defined as a reference」(一個被定義為參考的變數)
只有在有「decltype」出現的情境(context上下文)中,一個被定義為參考的變數才有機會不必是它所參考對象object的同義詞(別名)。也只有在這個情形下,一個參考才能獨立於它所參考的物件而存在、而被使用。因為對於參考所做的任何運算,其實都是對其所參考的物件的運算,而不是對參考在運算。但decltype出現的地方(情境、情況context),因為對這個參考,只是分析、評估它的type,而並不是進行evaluate運算,所以不涉及參考所參考的對象object本身。這時候這個參考才可以不用管它的object而自己存在。
decltype和參考 3:40
When we apply decltype to an expression that is not a variable, we get the type that that expression yields.
兩個「that」 ⑧找對主詞
Generally speaking, decltype returns a reference type for expressions that yield objects that can stand on the left-hand side of the assignment:11:00
一般來講,decltype是傳回一個運算式的結果的左值物件的參考型別。
29:40
the dereference operator解參考運算子
反參考運算子
As we’ve seen, when we dereference a pointer, we get the object to which the pointer points. Moreover, we can assign to that object. Thus, the type deduced by decltype(*p) is int& , not plain int .
Moreover更進一步34:00
大概因為對參考的操作,可以完全反應在其參考的對象object上,所以對它更進一步的操作,指派、設定值,就似參考的行為一般。是不是因為這樣,所以decltype它評估、推定的type才會是一個type&,而不是一個原樣的type。
45:31
假如把一個變數名字放在decltype後的圓括弧中的話,那麼就會被編譯器推定為一個參考型別——對該變數型別的參考——而不是該變數的型別。49:47因為編譯器是把這個「變數」視同一個運算式。
要在decltype傳回該變數的型別,則對該變數的名稱不要加上圓括弧。
57:39
the left-hand side of an assignment.
應該是和參考(reference)很有關係!
If we wrap the variable’s name in one or more sets of parentheses, the compiler will evaluate the operand as an expression. A variable is an expression that can be the left-hand side of an assignment. As a result, decltype on such an expression yields a reference:
1:0:20
As we’ll see in § 4.1.1 (p. 135 ), some expressions will cause decltype to yield a reference type. Generally speaking, decltype returns a reference type for expressions that yield objects that can stand on the left-hand side of the assignment:
decltype後若單括弧包變數,則傳回的型別視其括弧所包的變數,該變數若為參考型別,則傳回的乃是參考型別。若該變數包在雙括弧中,則不管該變數是否為參考型別,1:6:55編譯器推演出來的都會是參考型別。
頁72 1:4:40
練習2.36 1:8:10
int a = 3, b = 4;
decltype(a) c = a;//c is "int"
decltype((b)) d = a;//d is "int &"
++c;//c=c+1
++d;//d=d+1;a=a+1
練習2.37 1:17:58
一個指定式是一個運算式產生參考型別的典型例子。而它所產生的參考型別,則是對這個指定式的左邊物件型別的參考。1:28:50
int a = 3, b = 4;
decltype(a) c = a;//c is "int";c=a=3;
decltype(a = b) d = a;//d is "int&";d is a ref. of a;d=a=3;
/*because the compiler only analyze the expression of "a=b",
,dose not evaluate the expression ,"a" will still be 3. */
練習2.38 1:34:45 1:48:26
2.6. Defining Our Own Data Structures
1:55:00
In C++ we define our own data types by defining a class.
類別class和資料型別type的關係是這樣來的
1:59:11
程式庫裡頭的型別string、istream、ostream也是經由類別來定義的2:5:45
2:6:07
C++對類別class是很倚重的,所以幾乎傾了全力地去支援class所能發揮的任何功能。在本書的第3、4兩大部分(篇),就是要專就C++這一特性來作一番研討。
2:9:00
類、別:class 類別
型:type 類型、型別
2:12:00
要能自力完整定義一個類別class,須有定義我們自己的運算子operator的能力(見第14章);即使even though再簡單simple的類別也一樣。
2:19:30 2:24:13
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;//unsigned無號,見中文版頁34
double revenue = 0.0;
};/*可見struct {}末後要加「;」表struct本身也是個「述句」(statement)。3:2:50實際的原因在中文版頁73有:
The close curly that ends the class body must be followed by a semicolon. The semicolon is needed because we can define variables after the class body: 3:4:00
原來變數可以接著下大括號來定義為此類別型別的變數,如下所示:*/
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;//unsigned無號,見中文版頁34
double revenue = 0.0;
}a,b,*c;
int main()
{
Sales_data sd=*new Sales_data() ;
//Sales_data sd;// 2:41:31不初始化sd也無妨,因為他的成員已被初始化了。(其實應該是有執行預設初始化,參見中文版頁43)
std::cout << sd.bookNo << std::endl;
sd.bookNo = "2-34-";
std::cout << sd.bookNo << std::endl;
}
new Sales_data() 出來的是指標 有沒有括號沒差
struct Sales_data {
std::string bookNo;
unsigned units_sold = 0;//unsigned無號,見中文版頁34
double revenue = 0.0;
}sd;
int main()
{
//Sales_data sd = *new Sales_data;
//Sales_data sd;
/*因為struct body後括號可以接著定義struct類別的變數,
因此以上2行可以不寫,而改寫到struct下括號後、分號前*/
std::cout << sd.bookNo << std::endl;
sd.bookNo = "2-34-";
std::cout << sd.bookNo << std::endl;
sd.units_sold = 1;
sd.revenue = 111;
}
2:42:10
可見純粹只有資料,沒有運算的,就是struct。class須有資料與運算二大部分。
也就是說,只有資料需求者,用struct即可,不必用到class。
2:45:28
頁73
Our class begins with the keyword struct , followed by the name of the class and a (possibly empty) class body.
可見 struct是類別class的一種。或者是,class是有二種,一種是有用struct這個關鍵字來修飾的,一種沒有。3:52:08
In § 7.2 (p. 268 ), we’ll see that C++ has a second keyword, class , that can be used to define our own data structures. We’ll explain in that section why we use struct here.
2:56:00
class scope(範疇)內、外的名稱,是河水不犯井水的關係,所以可以重複使用而不會互相干擾
3:0:00原來在class/struct定義後可再接定義其類型的變數,所以末要加上「;」方表陳述句(述句statement)結束(其實「;」就是C++語文中的句號)。
It is a common mistake among new programmers to forget the semicolon at the end of a class definition.3:19:30
對於程式設計的新手而言,忘了在class的定義末後加上分號,是很常見的錯誤/疏失。
3:20:50
Class Data Members 類別的資料成員
3:33:40 Fundamental Types
3:37:00 in-class initializer類別內的初始器(初始設定式initializers)不能用「()」而沒有「=」。用「{}」(大括弧)則可方便在撰寫程式碼時Visual Studio就幫我們檢查所設定之值是否合法3:46:30 4:44:50 參考中文版頁43「串列初始化」
3:39:50 Google Play圖書版本之誤
頁74 3:53:52
4:5:12 4:32:40設定Visual Studio 2019英文環境
4:12:40 4:31:18「token」怎麼會翻成「權仗」,必是機器翻譯也!
4:21:00編輯自己Blogger的個人資料
4:23:20 #幸福綠皮書# #Green Book# #為了與你相聚# #A Dog's Way Home#
練習2.39 4:35:43
struct Foo {/* empty */ }//Note:no semicolon
int main() {
return 0;
}
1>------ 已開始建置: 專案: prog1, 組態: Debug Win32 ------
1>prog1.cpp
1>……\prog1.cpp(8,1): error C2628: 'Foo' 之後接續 'int' 不合法 (是否缺少 ';'?
1>……\prog1.cpp(8,12): error C3874: 'main' 的傳回類型應該是 'int',而非 'Foo'
1>……\prog1.cpp(9,10): error C2440: 'return': 無法由 'int' 轉換為 'Foo'
1>……\prog1.cpp(9,10): message : 沒有可以取得來源類型的建構函式,或建構函式多載解析模稜兩可
1>專案 "prog1.vcxproj" 建置完成 -- 失敗。4:37:30
========== 建置: 0 成功、1 失敗、0 最新、0 略過 ==========
1>------ Build started: Project: prog1, Configuration: Debug Win32 ------
1>prog1.cpp
1>……\prog1.cpp(8,1): error C2628: 'Foo' followed by 'int' is illegal (did you forget a ';'?)
1>……\prog1.cpp(8,12): error C3874: return type of 'main' should be 'int' instead of 'Foo'
1>……\prog1.cpp(9,10): error C2440: 'return': cannot convert from 'int' to 'Foo'
1>……\prog1.cpp(9,10): message : No constructor could take the source type, or constructor overload resolution was ambiguous
1>Done building project "prog1.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
練習2.40
struct Sales_data {
std::string bookNo{ "882-33-" };
double revenue{24.44};
unsigned soldQ{1};
double bookSize{24.2};
}sd;
int main() {
sd.bookNo="000-1";
sd.revenue = 100.55;
//sd.soldQ = {-2};// 4:46:00原來大括弧在設定值時還有如此妙用,可以在編譯前,設計模式中撰寫程式碼時,於Visual Studio檢查出所指定的值是否合格
//sd.soldQ = -2;//不加大括弧則不會在設計模式時幫忙檢查,則用無號unsigned卻指派了一個負值,就很危險。
sd.soldQ = { 3 };
sd.bookSize = {25.11};
return 0;
}
4:52:24
2.6.2. Using the Sales_data Class
4:58:00
string 標頭包含了對string的定義,所以要 #include<string>
5:6:30 string型別的特性:承載/存儲一個序列的字元串--一串的字元(所以簡稱「字串」而有別於「字元char」)
頁75 5:16:40
dot operator 點號運算子(參見中文版23頁)
5:19:00 product乘積 字彙詞彙能力 十全大補丸
5:35:17
頁76
練習2.41 5:35:33
5:39:14
2.6.3. Writing Our Own Header Files 撰寫我們自己的標頭檔
1:42:50設定關閉 VisualStudio 2019 的主控台,在偵錯結束之後
1:58:25 Google Docs語音輸入
留言