本 Wiki 开启了 HTTPS。但由于同 IP 的 Blog 也开启了 HTTPS,因此本站必须要支持 SNI 的浏览器才能浏览。为了兼容一部分浏览器,本站保留了 HTTP 作为兼容。如果您的浏览器支持 SNI,请尽量通过 HTTPS 访问本站,谢谢!
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
cs:programming:cpp:courses:cpp_basic_deep:chpt_2 [2024/04/16 13:52] – [decltype] codinghare | cs:programming:cpp:courses:cpp_basic_deep:chpt_2 [2024/08/11 03:50] (当前版本) – [常量表达式指针] codinghare | ||
---|---|---|---|
行 125: | 行 125: | ||
int main() | int main() | ||
{ | { | ||
- | std::cout << | + | std::cout << |
} | } | ||
</ | </ | ||
行 242: | 行 242: | ||
==指针的引用== | ==指针的引用== | ||
* 指针是对象,因此存在指针的引用: | * 指针是对象,因此存在指针的引用: | ||
- | * 引用不是对象,因此不存在引用的应用 | + | * 引用不是对象,因此不存在引用的引用 |
<code cpp> | <code cpp> | ||
int* &refPx = ptr; | int* &refPx = ptr; | ||
行 305: | 行 305: | ||
// y1 是在运行期确定的(运行期常量) | // y1 是在运行期确定的(运行期常量) | ||
const int y1 = y; | const int y1 = y; | ||
- | // y2 是在编译期确定的(编译器常量) | + | // y2 是在编译期确定的(编译期常量) |
const int y2 = 3; | const int y2 = 3; | ||
</ | </ | ||
行 311: | 行 311: | ||
* '' | * '' | ||
* '' | * '' | ||
- | 也就是说,编译器常量是可以被编译器优化的。这也是常量表达式的由来:C++ 11 中通过 '' | + | 也就是说,编译器常量是可以被编译器优化的。这也是常量表达式的由来:C++ 11 中通过 '' |
<code cpp> | <code cpp> | ||
// y2 被显式的声明为编译期常量 | // y2 被显式的声明为编译期常量 | ||
行 319: | 行 319: | ||
</ | </ | ||
==常量表达式指针== | ==常量表达式指针== | ||
- | 指针也可以作为编译器常量。这种情况下,需要满足两个条件: | + | 指针也可以作为编译期常量。这种情况下,需要满足两个条件: |
* 指针是常量 | * 指针是常量 | ||
* 指针指向的内容也是常量 | * 指针指向的内容也是常量 | ||
- | 只有满足这两个条件,指针才能作为编译器常量对编译器可见。也就是说,这种情况下的指针类型是 '' | + | 只有满足这两个条件,指针才能作为编译期常量对编译器可见。也就是说,这种情况下的指针类型是 '' |
<code cpp> | <code cpp> | ||
constexpr const int* ptr = nullptr; | constexpr const int* ptr = nullptr; | ||
行 399: | 行 399: | ||
</ | </ | ||
==decltype== | ==decltype== | ||
- | * '' | + | decltype |
+ | |||
+ | * decltype(val):'' | ||
<code cpp> | <code cpp> | ||
+ | //x is an variable name | ||
int x = 3; | int x = 3; | ||
- | int& y1 = x; | ||
//int | //int | ||
- | auto y2 = y1; | + | decltype(x); |
+ | // | ||
//int& | //int& | ||
- | decltype(y1) y3 = y1; | + | decltype((x)); |
</ | </ | ||
- | * decltype(val):'' | + | |
<code cpp> | <code cpp> | ||
- | //x is an variable name | ||
int x = 3; | int x = 3; | ||
+ | int& y1 = x; | ||
//int | //int | ||
- | decltype(x); | + | auto y2 = y1; |
- | // | + | |
//int& | //int& | ||
- | decltype((x)); | + | decltype(y1) y3 = y1; |
</ | </ | ||
* '' | * '' | ||
行 425: | 行 427: | ||
decltype(*ptr); | decltype(*ptr); | ||
</ | </ | ||
- | + | | |
- | | + | <code cpp> |
+ | // | ||
+ | decltype(3.5+15l) x = 3.5 + 15l; | ||
+ | //C++ 14 的写法 | ||
+ | // 用 auto 来代表繁琐的表达式,并不会导致退化 | ||
+ | // 编译器会将 auto 替换为赋值运算符右边的内容 | ||
+ | decltype(autol) x = 3.5 + 15l; | ||
+ | </ | ||
+ | * concept auto [C++20]:任何 concept 都会包含一系列类型,这些类型的共同特征都可以用 concept 表示。比如 '' | ||
+ | * concept auto 让自动推导受 concept 的范围限制,比如让 auto 只能推断出整数类型的类型: | ||
+ | <code cpp> | ||
+ | #include < | ||
+ | int main() | ||
+ | { | ||
+ | //int | ||
+ | std:: | ||
+ | //error, 3.5 is not an integral | ||
+ | std:: | ||
+ | } | ||
+ | </ | ||
+ | ====域和对象生命周期==== | ||
+ | ===域 Scope=== | ||
+ | 域代表了程序的一部分,域中的 name 有**唯一的含义**: | ||
+ | * 全局域:程序最外部的域,全局对象 | ||
+ | * 块域:大括号限定的域,局部对象 | ||
+ | * 其他类型的域:Namespace, | ||
+ | 域可以进行嵌套,内部域中的 Name 会掩盖外部域中的 Name: | ||
+ | <code cpp> | ||
+ | int x = 3; | ||
+ | int main() | ||
+ | { | ||
+ | int x = 4; | ||
+ | // | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | ===对象生命周期=== | ||
+ | 生命周期指对象从被**初始化到被销毁**的区间。 | ||
+ | * 全局对象:生命周期为程序的运行期 | ||
+ | * 局部对象:起始于**初始化**,结束于域的执行完成 |